【发布时间】:2018-01-01 17:18:40
【问题描述】:
我在玩伪元素样式时遇到了一个令我困惑的行为
考虑下面的css和html
HTML:
<p>
Note: As a rule, double colons (::) should be used instead of a single colon (:). This distinguishes pseudo-classes from pseudo-elements. However, since this distinction was not present in older versions of the W3C spec, most browsers support both syntaxes for the sake of compatibility. Note that ::selection must always start with double colons ::.
</p>
和样式
p::first-letter {
font-size: 20px;
color: red;
}
p::first-line {
font-variant: small-caps;
color: green;
}
p::before {
content: 'Start';
color: blue;
}
在 Chrome 中,行为如下: ::before 内容的第一个字母被着色为红色,即使它不是 p 的内容, ::before 样式不会将颜色覆盖为蓝色。
此外,当 ::before 内容中没有字母并且我在其中放置 & 或 * 时 - 所有第一行都变为绿色,并且没有应用 ::first-letter 和 ::before 样式。
我使用的是 Ubuntu 17.04 下的最新浏览器版本
那么任何人都可以解释为什么 ::before 内容被其他伪元素选择器选择并且应用了样式以及为什么自己的 ::before 样式即使它们是“后来的”样式也不会覆盖它们。
【问题讨论】:
-
所有选择器的特异性是 2。所以我会说最后一个获胜。但它没有
-
不,我的第一个字母是红色而不是蓝色
-
抱歉,误读了你的帖子哈哈会删除我的cmets :)
-
伪元素有助于选择器的特异性,但是具有不同伪元素的两条规则不会相互竞争,即使每个选择器的其余部分相同。所以特异性在这里不相关。这个 ::first-line 样式在 Chrome 中“覆盖” ::before 和 ::after 样式的问题是not new,但在问题跟踪器或 www-style 中似乎没有对此进行任何讨论。
标签: css css-selectors pseudo-element