为什么不能将供应商特定的伪元素/类组合成一个规则集?
在CSS中,可以使用特定于供应商的伪类和伪元素(以获得最佳的跨浏览器覆盖率)的组合来在input中设置placeholder
文本的样式。
这些都具有相同的基本属性(即文本样式和颜色声明)。
然而,尽pipe我不可避免地要使用相同的风格,而不考虑浏览器供应商,但似乎不可能将这些风格结合到一个以逗号分隔的select器中(就像您希望使用两个select器的其他CSS一样)相同的样式)。
作为一个例子,我倾向于使用以下四个select器来定位占位符样式:
-
input:-moz-placeholder
-
input::-moz-placeholder
-
input:-ms-input-placeholder
-
input::-webkit-input-placeholder
(尽pipe:-moz-placeholder
被弃用 ,而是支持::-moz-placeholder
这只发生在FireFox 19的发布中,所以目前都需要这两种方法才能获得更好的浏览器支持)。
令人沮丧的是,声明和赋予每个(相同)风格会导致CSS内部的重复。
所以,为了确保占位符文本是右alignment和斜体的,我最终会得到:
input:-moz-placeholder{ font-style: italic; text-align: right; } input::-moz-placeholder{ font-style: italic; text-align: right; } input:-ms-input-placeholder{ font-style: italic; text-align: right; } input::-webkit-input-placeholder{ font-style: italic; text-align: right; }
我真正想要做的就是把它们组合成一个单独的逗号分隔的规则集:
input:-moz-placeholder, input::-moz-placeholder, input:-ms-input-placeholder, input::-webkit-input-placeholder{ font-style: italic; text-align: right; }
但是,尽pipe这样做很公平,但这似乎并不奏效。 这让我担心,我不了解CSS的一些基本部分。
任何人都可以解释为什么发生这种情况?
CSS2.1 指出 :
select器(另请参阅select器部分)包括(但不包括)第一个左大括号({)的所有内容。 select器总是与一个声明块一起。 当用户代理不能parsingselect器(即它不是有效的CSS 2.1)时,它必须忽略select器和下面的声明块(如果有的话)。
请注意,在实现CSS3的浏览器的情况下,“这不是有效的CSS2.1”的意思是“用户代理不理解”。
由于某个供应商的浏览器不理解其他供应商的前缀,因此必须删除伪类和伪元素select器中包含那些无法识别前缀的规则。 1
对于为什么这样一个规则到位的一些见解,看到这个答案 。
1 请注意,WebKit是部分藐视这个规则的臭名昭着的:它没有parsing规则的select器有无法识别的前缀伪元素(在这种情况下是::-moz-placeholder
)的规则。 也就是说,组合规则中的:-moz-placeholder
伪类会导致它中断。
规范说,如果用户代理不能识别select器的一部分,则必须忽略整个select器及其块。
http://www.w3.org/TR/css3-syntax/#rule-sets
select器(请参见select器模块[SELECT])包括(但不包括)第一个左大括号({)的所有内容。 select器总是和{}块一起使用。 当用户代理无法parsingselect器(即,它不是有效的CSS3)时,它也必须忽略{}块。