TL;DR

  • 双冒号选择器是伪元素。
  • 单冒号选择器是伪选择器。

双冒号 ::before 与单冒号 :before。哪一个是正确的?

因为它是一个伪元素,所以理论上来说,正确的答案是 ::before

类似的 ::first-letter 也是一个伪元素。原因是:

  • 它选择了一些没有现有HTML元素的东西。
  • 没有 <span> 或类似的元素在你目标元素的第一个字母中包围,因此第一个字母就像页面上添加的新元素。
  • 这与选择已经存在的元素的伪选择器不同,例如 :nth-child(2) 等。

有一个论点,也许你在这些情况下应该使用 :before

  • 仅支持 IE8 及更低版本:这些版本的 IE 浏览器不支持双冒号。
  • 所有现代浏览器都支持两种格式的写法,因为大量网站使用单冒号,浏览器很重视向后兼容性。
  • 咬文嚼字:毕竟与相比双冒号少一个字符。

另一方面,::before 永远是最佳实践

  • 单冒号伪元素是一个错误。永远不会有单冒号的伪元素。
  • 如果你在脑海中直接区分,不妨训练你的手指做正确的事。
  • 这已经足够令人困惑,所以让我们按照正确的方式进行操作。

我已经设置了我的 linter 来迫使我使用双重冒号。无论如何我不支持 IE8,以“正确”的方式做事情感觉很好。

翻译原文