结合CSS Pseudo-elements,":after"the::last-child"

Der*_*rek 119 css

我想用CSS制作"语法正确"的列表.这是我到目前为止:

<li>标签与在他们之后逗号水平显示.

li { display: inline; list-style-type: none; }

li:after { content: ", "; }

这有效,但我希望"最后一个孩子"有一个句号而不是逗号.并且,如果可能的话,我也想把"和"放在"最后一个孩子"之前.我正在构造的列表是动态生成的,所以我不能只给"最后一个孩子"一个类.你不能组合伪元素,但这基本上是我想要实现的效果.

li:last-child li:before { content: "and "; }

li:last-child li:after { content: "."; }

我该如何工作?

Zyp*_*rax 162

这工作:)(我希望多浏览器,Firefox喜欢它)

li { display: inline; list-style-type: none; }
li:after { content: ", "; }
li:last-child:before { content: "and "; }
li:last-child:after { content: "."; }
Run Code Online (Sandbox Code Playgroud)
<html>
  <body>
    <ul>
      <li>One</li>
      <li>Two</li>
      <li>Three</li>
    </ul>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

  • 类似的问题是您用管道字符分隔菜单项的情况。相同的解决方案有效。但是,最终的content属性需要设置为{content:none;},以消除最终的竖线字符。 (2认同)
  • 订单也很重要.`li:last-child:after`有效但是`li:after:last-child`没有. (2认同)

Gab*_*ocq 23

我喜欢这个<menu>元素中的列表项.考虑以下标记:

<menu>
  <li><a href="/member/profile">Profile</a></li>
  <li><a href="/member/options">Options</a></li>
  <li><a href="/member/logout">Logout</a></li>
</menu>
Run Code Online (Sandbox Code Playgroud)

我用以下CSS设置它的样式:

menu > li {
  display: inline;
}

menu > li::after {
  content: ' | ';
}

menu > li:last-child::after {
  content: '';
}
Run Code Online (Sandbox Code Playgroud)

这将显示:

Profile | Options | Logout
Run Code Online (Sandbox Code Playgroud)

这是可能的,因为马丁阿特金斯在他的评论中解释了这一点


小智 15

尽管如此,有人可能从中获益:

li:not(:last-child)::after { content: ","; }
li:last-child::after { content: "."; }
Run Code Online (Sandbox Code Playgroud)

这应该适用于CSS3和[未经测试的] CSS2.


Der*_*rek 11

可以组合伪元素!对不起,伙计们,我在发布问题后不久想出了这个问题.由于兼容性问题,可能不太常用.

li:last-child:before { content: "and "; }

li:last-child:after { content: "."; }

这很有效.CSS有点神奇.

  • 这是一个"挑剔的角落",但"最后一个孩子"实际上是伪**级**,而"之前"和"之后"是伪元素.不同之处在于伪类是对现有元素的附加约束,而伪元素实际上是在CSS中而不是在HTML中生成的表示树中的全新元素.你可以将这些结合起来:`last-child`是`li`上的一个修饰符,然后在你选择了所有`li`元素作为最后一个子元素后,你选择(并隐式创建)一个新元素每个人之前和之后. (12认同)

Wol*_*sen 6

简而言之,在CSS 3中

:后

应该像这样使用

::后

来自https://developer.mozilla.org/de/docs/Web/CSS/::after :

为了在伪类和伪元素之间建立区分,在CSS 3中引入了:: after表示法.浏览器也接受表示法:在CSS 2中引入之后.

所以它应该是:

li { display: inline; list-style-type: none; }
li::after { content: ", "; }
li:last-child::before { content: "and "; }
li:last-child::after { content: "."; }
Run Code Online (Sandbox Code Playgroud)

  • 每个支持双冒号`::`CSS3语法的浏览器也只支持`:`语法,但IE 8只支持单冒号,所以目前,建议只使用单冒号来获得最佳浏览器支持.`::`是缩进的新格式,用于区分伪内容和伪选择器.如果您不需要IE 8支持,请随意使用双冒号.从[文章](https://css-tricks.com/almanac/selectors/a/after-and-before/) (3认同)
  • IE 8在浏览器标准方面不再是播放器.微软不支持,不支持HTML5或CSS3(伪元素,转换等)我曾经做过很多关于向后兼容的工作,直到一年前,一直回到IE6/IE7(通过Modernizr.)我们已经走了很长一段路,如果您打算让您的网站长期展示其在线身份 - 而不是成为短视的解决方案 - 那么只需考虑使用IE8从某人那里获得的收入.纳达.即使是落后20年的老年人,现在也在使用平板电脑和二合一笔记本电脑. (2认同)