有没有人有使用CSS在Internet Explorer中设置"选择"元素边框的解决方案?
据我所知,它在IE中是不可能的,因为它使用OS组件.
这是一个替换控件的链接,但我不知道那是不是你想做什么.
新事物,第1部分
因此,您使用最新最好的CSS技术构建了一个美观,符合标准的网站.你已经掌握了每一个元素的风格控制,但在你的脑海中,一个小小的声音在唠叨你的丑陋
程度.那么,今天我们将探索一种沉默那个小声音并真正完成我们设计的方法.通过一些DOM脚本和一些创造性的CSS,您也可以使您
的美丽......并且您不必牺牲可访问性,可用性或优雅降级.
我们都知道这很简单.事实上,许多人试图限制其使用,以避免其大约1994年插入边界的经典网络.我们不应该避免使用
它 - 它是当前表单工具集的重要部分; 我们应该接受它.也就是说,一些创造性思维可以改善它.
我们将使用一个简单的示例:
[注意:暗示这是完整形式的背景.]
所以我们有一个
.这
有一个独特
id
的"东西".根据您正在查看的浏览器/平台,您可能看起来大致如下:
(来源:easy-designs.net)
或这个
(来源:easy-designs.net)
让我们说我们想让它看起来更现代,也许是这样的:
(来源:easy-designs.net)
那我们该怎么做呢?保持基本不是一种选择.除了基本的背景颜色,字体和颜色调整,你真的没有很多控制权.
但是,我们可以在不牺牲语义,可用性或可访问性的情况下模仿新表单控件中的高级功能.为了做到这一点,我们需要检查一个的本质
.
A 本质上是一个无序的选择列表,您可以在其中选择单个值以及表单的其余部分.所以,从本质上讲,它是一种
类固醇.继续这种思路,我们可以用无序列表替换它,只要我们给它一些增强的功能.由于
s可以用多种不同的方式设计,我们几乎可以免费回家.现在问题变成"如何确保我们保持使用时的功能
?" 换句话说,如果我们不再使用表单控件,我们如何提交正确的值以及表单?
输入DOM.这个过程的最后一步是使
函数/感觉像一个,我们可以用JavaScript/ECMA Script和一些聪明的CSS来实现.以下是我们需要的功能性虚拟要求的基本列表
:
点击列表打开它,
单击列表项以更改分配的值并关闭列表,
显示未选择任何内容时的默认值,和
选择某些内容时显示所选列表项.
通过这个计划,我们可以开始连续处理每个部分.
所以首先我们需要收集所有属性并将其重建为a.我们通过运行以下JS来实现这一点:
function selectReplacement(obj) { var ul = document.createElement('ul'); ul.className = 'selectReplacement'; // collect our object's options var opts = obj.options; // iterate through them, creating
您可能会想"现在如果
已经选择了会发生什么?" 我们可以通过在创建
s 之前添加另一个循环
来查找所选的
,然后将该值存储为
class
我们选择的"selected":
… var opts = obj.options; // check for the selected option (default to the first option) for (var i=0; i[注意:从现在开始,将选择选项5,以演示此功能.]
现在,我们可以
在页面上的每一个(在我们的例子中,一个)运行此函数,具有以下内容:
function setForm() { var s = document.getElementsByTagName('select'); for (var i=0; i我们快到了; 让我们添加一些风格.
一些聪明的CSS
我不了解你,但我是CSS下拉的狂热粉丝(特别是 Suckerfish品种).我已经和他们一起工作了一段时间了,最后我突然意识到a
非常像一个下拉菜单,尽管还有更多的内容.为什么不将相同的文体理论应用于我们的虚假 -
?基本风格如下:
ul.selectReplacement { margin: 0; padding: 0; height: 1.65em; width: 300px; } ul.selectReplacement li { background: #cf5a5a; color: #fff; cursor: pointer; display: none; font-size: 11px; line-height: 1.7em; list-style: none; margin: 0; padding: 1px 12px; width: 276px; } ul.selectOpen li { display: block; } ul.selectOpen li:hover { background: #9e0000; color: #fff; }现在,要处理"已选择"列表项,我们需要更加小巧:
ul.selectOpen li { display: block; } ul.selectReplacement li.selected { color: #fff; display: block; } ul.selectOpen li.selected { background: #9e0000; display: block; } ul.selectOpen li:hover, ul.selectOpen li.selected:hover { background: #9e0000; color: #fff; }请注意,我们没有使用:hover伪类
来使其打开,而是将
class
它作为"selectOpen".原因有两方面:
CSS用于表示,而不是行为; 和
我们希望我们的虚假
行为像真实一样
,我们需要列表在
onclick
事件中打开而不是简单的鼠标悬停.为了实现这一点,我们可以从Suckerfish中学到并将它应用到我们自己的JavaScript中,方法是动态地为每个列表项的
class
`onclickevents for the list items. To do this right, we will need the ability to change the
onclick`事件分配和删除它,以便在以下两个动作之间切换:
在列表折叠时单击选中/默认选项时显示完整的虚假信息; 和
单击列表项时"选择"列表项并折叠虚假项目
.
我们将创建一个函数调用
selectMe()
来处理"选定"的class
重新分配,重新分配onclick
列表项的事件,以及折叠虚假 -:
正如最初的Suckerfish告诉我们的那样,IE不会在除了a之外的任何事物上识别出悬停状态
,所以我们需要通过用我们从它们中学到的东西来增加一些代码来解释这一点.我们可以将onmouseover和onmouseout事件附加到"selectReplacement"
class
-ed及其
s:
function selectReplacement(obj) { … // create list for styling var ul = document.createElement('ul'); ul.className = 'selectReplacement'; if (window.attachEvent) { ul.onmouseover = function() { ul.className += ' selHover'; } ul.onmouseout = function() { ul.className = ul.className.replace(new RegExp(" selHover\\b"), ''); } } … for (var i=0; i然后,我们可以修改CSS中的一些选择器来处理IE的悬停:
ul.selectReplacement:hover li, ul.selectOpen li { display: block; } ul.selectReplacement li.selected { color: #fff; display: block; } ul.selectReplacement:hover li.selected**, ul.selectOpen li.selected** { background: #9e0000; display: block; } ul.selectReplacement li:hover, ul.selectReplacement li.selectOpen, ul.selectReplacement li.selected:hover { background: #9e0000; color: #fff; cursor: pointer; }现在我们的列表表现得像
; 但是我们仍然需要一种方法来更改所选列表项并更新相关表单元素的值.
JavaScript fu
我们已经有一个"已选中"
class
我们可以应用于我们选择的列表项,但是我们需要一种方法来将它应用到单击它并从之前"选定"的兄弟姐妹中删除它.这是完成此任务的JS:
function selectMe(obj) { // get the's siblings var lis = obj.parentNode.getElementsByTagName('li'); // loop through for (var i=0; i , remove selected class if (lis[i] != obj) { lis[i].className=''; } else { // our selected , add selected class lis[i].className='selected'; } } } [注意:我们可以使用简单的
className
赋值和清空,因为我们完全控制了s.如果您(由于某种原因)需要为列表项分配其他类,我建议修改要附加的代码并将"selected"类移除到您的
className
属性.最后,我们添加一个小函数来设置单击
时的原始值(将与表单一起提交)
:
function setVal(objID, selIndex) { var obj = document.getElementById(objID); obj.selectedIndex = selIndex; }然后我们可以将这些函数添加到s 的
onclick
事件中:
… for (var i=0; i你有它.我们已经创建了我们的功能性
. As we have not hidden the original
yet, we can [watch how it behaves](files/4.html) as we choose different options from our faux-
. Of course, in the final version, we don't want the original
to show, so we can hide it by
人造类,并将其作为"替换",在这里向JS添加:function selectReplacement(obj) { // append a class to the select obj.className += ' replaced'; // create list for styling var ul = document.createElement('ul'); …然后,添加一个新的CSS规则来隐藏
select.replaced { display: none; }通过应用一些图像来完成设计(链接不可用),我们很高兴!
这里有另一个链接到某人说它无法完成.
@mydoghasworms:我很抱歉,两年半前回答的链接不再适用了.您仍然可以通过以下网址访问该页面:http://web.archive.org/web/20090922234755/http://v2.easy-designs.net/articles/replaceSelect/
2> 小智..:推断它!:)
filter: progid:DXImageTransform.Microsoft.dropshadow(OffX=-1, OffY=0,color=#FF0000) progid:DXImageTransform.Microsoft.dropshadow(OffX=1, OffY=0,color=#FF0000) progid:DXImageTransform.Microsoft.dropshadow(OffX=0, OffY=-1,color=#FF0000) progid:DXImageTransform.Microsoft.dropshadow(OffX=0, OffY=1,color=#FF0000);
3> jpsimard-nyx..:根据我个人的经验,当我们选择无效条目时我们尝试将边框设置为红色时,不可能在IE中添加选择元素的边框红色.
如前所述,Internet Explorer中的ocntrols使用WindowsAPI进行绘制和渲染,您无需解决此问题.
我们的解决方案是将选择元素的背景颜色设置为红色(使文本可读).背景颜色在每个浏览器中工作,但在IE中我们有一个副作用,即元素与选择相同的背景颜色.
总结我们推出的解决方案:
select { background-color:light-red; border: 2px solid red; } option { background-color:white; }请注意,颜色是用十六进制代码设置的,我只是不记得哪个.
除了IE中的边框红外,这个解决方案在每个浏览器中都给了我们想要的效果.
祝好运
4> 小智..:我有同样的问题ie,然后我插入这个元标记,它允许我编辑ie中的边框