注意双冒号 ::before
和 单冒号 :before
,哪个是正确的?
从技术上讲,正确答案是 ::before
,但这并不意味着你可以随意使用它。
情况是这样:
- 双冒号选择器是伪元素
- 单冒号选择其实伪选择器
::before
确实是为元素,所以它应该和双冒号一起使用。
伪元素和伪选择器之间的区别非常令人困惑。幸运的是,::after
和 ::before
都相当简单。
它们实际上为页面中添加了一些新元素。
但是类似于 ::first-letter
的也是伪元素。我的推断是,它选中了一些在 HTML 元素中不存在的东西。
目标元素的第一个字母并没有用 <span>
包裹起来,所以 ::first-letter
似乎是你添加到页面上的新元素。
它与伪选择器不同,伪选择器会选择已经存在的东西,例如 :nth-child(2)
等。
::before
是伪元素,而双冒号是正确的使用方式,是吗?
在你使用 :before
之前些论据:
- IE8 及以下浏览器只支持
:before
,不支持::before
。 - 所有现代浏览器两者都支持,因为大量网站使用
:before
,而且浏览器确实重视向后兼容。 - 少一个字符
:
我也听人们说 CSS linters 要求(或自动)使用单冒号。个人而言,我同意他们这样做。似乎很好。我比较重视一致性。
另一方面,在使用 ::before
之前也有这样的论据:
- 单冒号伪元素是一个错误。将不会有任何带有单冒号的伪元素。
- 如果在你的脑海中能够明确区分,那就训练手指去做正确的事情。
- 已经够让人困惑了,就让我们遵循正确的方式。
我已经把我的 linter 设置为强制使用双冒号。我不再支持 IE8 了,做正确的事情感觉还不错。