我可以有多个:在同一元素的伪元素之前?

Chr*_*ney 103 css css-selectors css3 pseudo-element css-content

是否有可能:before为同一元素有多个伪?

.circle:before {
    content: "\25CF";
    font-size: 19px;
}
.now:before{
    content: "Now";
    font-size: 19px;
    color: black;
}
Run Code Online (Sandbox Code Playgroud)

我试图使用jQuery将上述样式应用于同一元素,但只应用最新的样式,而不是两者都应用.

Bol*_*ock 89

在CSS2.1中,元素在任何时候最多只能包含任何类型的伪元素.(这意味着一个元素可以同时具有一个:before和一个:after伪元素 - 它不能有多种类型.)

因此,当您有多个:before匹配同一元素的规则时,它们将全部级联并应用于单个:before伪元素,与普通元素一样.在您的示例中,最终结果如下所示:

.circle.now:before {
    content: "Now";
    font-size: 19px;
    color: black;
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,只有content具有最高优先级的声明(如上所述,最后一个)将生效 - 其余的声明将被丢弃,与任何其他CSS属性的情况一样.

CSS2.1选择器部分中描述了此行为:

伪元素的行为与CSS中的真实元素一样,下面和其他地方描述的例外.

这意味着具有伪元素的选择器就像普通元素的选择器一样工作.这也意味着级联应该以相同的方式工作.奇怪的是,CSS2.1似乎是唯一的参考; 既不CSS3选择器也不CSS3级联提到这一点在所有的,它仍然有待观察是否会在将来的规范予以澄清.

如果一个元素可以匹配多个具有相同伪元素的选择器,并且您希望以某种方式应用所有这些选择器,则需要使用组合选择器创建其他CSS规则,以便您可以准确指定浏览器应该执行的操作案例.我不能在content这里提供一个完整的例子,包括属性,因为它不清楚例如符号或文本是否应该首先出现.但是这个组合规则所需的选择器要么是- .circle.now:before或者.now.circle:before你选择的选择器是个人偏好,因为两个选择器是等价的,它只是content你需要自己定义的属性的值.

如果您仍需要一个具体的例子,请参阅我对这个类似问题的回答.

遗留的css3-content规范包含一个关于::before::after使用与CSS2.1级联兼容的符号插入多个伪元素的部分,但请注意该特定文档已过时 - 自2003年以来尚未更新,并且没有人拥有在过去十年中实施了这一功能.好消息是,废弃文档正在以css-content-3css-pseudo-4为幌子进行重写.坏消息是,在任一规范中都找不到多个伪元素特征,这可能是由于缺乏实施者的兴趣.

  • 在给定的情况下,如果一个元素同时属于'circle`类和类`now`,则两个规则都适用于元素的`:before`伪元素,但是普通的CSS意味着只有一个`content`设置可以生效(通过正常的级联规则).关键是"内容"不会累积. (12认同)
  • 时隔13年,css-content-3草案终于【更新】(https://www.w3.org/TR/2016/WD-css-content-3-20160602/#changes)。伪元素部分已明确删除,以支持 css-pseudo-4,它不允许多个 `::before` 或 `::after` 伪元素。 (2认同)

Hyd*_*Orc 26

如果您的主元素有一些子元素或文本,您可以使用它.

将主要元素定位为相对(或绝对/固定)并使用:before和:after absolute absolute(在我的情况下,它必须是绝对的,不知道你的).

现在,如果你想要一个伪元素,请将一个绝对:before附加到一个主元素的子元素中(如果你只有文本,将它放在一个span中,现在你有一个元素),这不是相对/绝对/修复的.

这个元素将开始表现得像他的主人是你的主要元素.

HTML

<div class="circle">
    <span>Some text</span>
</div>
Run Code Online (Sandbox Code Playgroud)

CSS

.circle {
    position: relative; /* or absolute/fixed */
}

.circle:before {
    position: absolute;
    content: "";
    /* more styles: width, height, etc */
}

.circle:after {
    position: absolute;
    content: "";
    /* more styles: width, height, etc */
}

.circle span {
    /* not relative/absolute/fixed */
}

.circle span:before {
    position: absolute;
    content: "";
    /* more styles: width, height, etc */
}
Run Code Online (Sandbox Code Playgroud)

  • @BbIKTOP 抱歉刚刚看到您的评论。就我而言,我正在研究一个总是有孩子的模态,所以我最终得到了类似的东西:`.modal:first-child:before { ...` (3认同)
  • 尽管选择的答案是准确的,但对于我的情况而言,这是可行的解决方法。我能够模拟具有多个伪元素,而无需向DOM添加更多节点! (2认同)
  • @ChrisOdney 如果 Matt 试图使其与 IE5.5 兼容,那么他​​可能一直在同一个应用程序/网站上工作;) (2认同)

小智 7

我已经使用以下方法解决了这个问题:

.element:before {
    font-family: "Font Awesome 5 Free" , "CircularStd";
    content: "\f017" " Date";
}
Run Code Online (Sandbox Code Playgroud)

使用字体系列“font Awesome 5 free”作为图标,之后,我们必须再次指定我们使用的字体,因为如果我们不这样做,导航器将使用默认字体(times new roman 或类似的字体)这)。