我正在尝试设置禁用的输入。我可以用:
.myInput[disabled] { }
或
.myInput:disabled { }
属性选择器是现代CSS3方式和前进的方式吗?我曾经使用伪类,但是我找不到任何关于它们是否旧的方式的信息,不会被支持,或者它们是否相等而且你可以使用你最喜欢的任何东西。
我不需要支持旧浏览器(它是一个内部网应用程序),所以它是:
答案 0 :(得分:61)
属性选择器是现代CSS3方式还是前进的方式?
- 属性更新更好
没有;实际上,属性选择器自CSS2起就存在,disabled
属性本身自HTML 4以来就存在。据我所知,:disabled
伪类在Selectors 3中引入,这使得伪类更新。
- 使用其中一个
的技术原因
是的,在某种程度上。
使用属性选择器,您依赖于您正在样式化的文档使用disabled
属性来指示禁用字段的知识。从理论上讲,如果您设计的不是HTML内容,则可能无法使用disabled
属性表示已禁用的字段,例如它可能是enabled="false"
或类似的东西。即使将来的HTML版本也可能引入新元素,这些元素利用不同的属性来表示启用/禁用状态;这些元素与[disabled]
属性选择器不匹配。
:disabled
伪类将选择器与您正在使用的文档分离。规范只是声明它定位被禁用的元素,以及元素是启用,禁用还是两者都不是defined by the document language instead:
启用状态,禁用状态和用户界面元素的构成取决于语言。在典型文档中,大多数元素既不是
:enabled
也不是:disabled
。
换句话说,当您使用伪类时,UA会根据您正在构造的文档自动确定要匹配的元素,因此您无需告诉它如何。
就DOM而言,我认为在DOM元素上设置disabled
属性也会修改HTML元素的disabled
属性,这意味着两个选择器与DOM操作之间没有区别。我不确定这是否依赖于浏览器,但here's a fiddle在所有主流浏览器的最新版本中都证明了这一点:
// The following statement removes the disabled attribute from the first input
document.querySelector('input:first-child').disabled = false;
你最有可能成为HTML的样式,所以这些都不会对你产生任何影响,但如果浏览器兼容性不是问题,我会选择:enabled
和:disabled
而不是{ {1}}和:not([disabled])
只是因为伪类带有属性选择器没有的语义。我是那样的纯粹主义者。
答案 1 :(得分:14)
事实证明,Internet Explorer 10和11无法识别某些元素上的:disabled
伪类,只能使用属性选择器语法。
#test1:disabled { color: graytext; }
#test2[disabled] { color: graytext; }

<form>
<fieldset id="test1" disabled>:disabled</fieldset>
<fieldset id="test2" disabled>[disabled]</fieldset>
</form>
&#13;
上面提到的代码在IE中呈现如下:
只要你只设计input
个元素,你就应该没问题。在您希望支持的所有浏览器中测试最终结果仍然是一个很好的建议。
答案 2 :(得分:1)
显然,您只能使用“:(pseudoclass)” /“:disabled”选择输入元素并设置其样式,但其他元素(例如DIV)必须改为使用[disabled]。
>在编写SCSS / SASS并尝试选择一个禁用的元素时,我经常遇到这个问题。