为什么我不能组合伪元素选择器?

时间:2018-05-29 09:32:53

标签: css css-selectors pseudo-element

组合伪元素选择器(用于范围输入)时,我看到未应用样式。这迫使我将我的选择器分开并复制我的CSS。

有谁知道为什么会发生这种怪癖?

/* Keeping the selectors separate works */
.range1 {
  -webkit-appearance: none;
    -moz-appearance: none;
          appearance: none;
}
.range1::-webkit-slider-runnable-track {
  height: 6px;
  border-radius: 3px;
  border: 1px solid black;
}
.range1::-moz-range-track {
  height: 6px;
  border-radius: 3px;
  border: 1px solid black;
}

/* Combining the selectors fails */
.range2 {
  -webkit-appearance: none;
    -moz-appearance: none;
          appearance: none;
}
.range2::-webkit-slider-runnable-track,
.range2::-moz-range-track {
  height: 6px;
  border-radius: 3px;
  border: 1px solid black;
}

CodePen示例。

Screenshot

2 个答案:

答案 0 :(得分:3)

您正在将多个特定于供应商的选择器组合到一个CSS规则中。

这意味着如果浏览器无法识别一个选择器,则忽略整个CSS块。在这种特殊情况下,Chrome无法识别::-moz-range-track,因为它特定于Firefox / Gecko。这不是一个怪癖,而是预期的行为和part of the CSS standard

解决方案是拆分声明。像这样:

.range2::-webkit-slider-runnable-track {
    height: 6px;
    border-radius: 3px;
    border: 1px solid black;
}
.range2::-moz-range-track {
    height: 6px;
    border-radius: 3px;
    border: 1px solid black;
}

Updated CodePen

答案 1 :(得分:0)

我认为用户代理无法识别伪元素选择器,因为它应该以{{1​​}}开头,在这种情况下,您要组合多个选择器,因此它不适用于某些/所有浏览器。

  

选择器始终与{} -block一起使用。当用户代理无法解析选择器时(即,它不是有效的CSS3),它也必须忽略{} -block。

https://www.w3.org/TR/CSS21/syndata.html#rule-sets

  

选择器包含第一个左大括号({)的所有内容(但不包括)。选择器总是与声明块一起使用。当用户代理无法解析选择器时(即,它不是有效的CSS 2.1),它必须忽略选择器和以下声明块(如果有的话)。