如何在CSS中将无序列表设置为逗号分隔的文本


72

我正在寻找一种使用CSS对XHTML中的无序列表进行样式设置的方法,以使其以内联方式呈现,并且列表项之间以逗号分隔。

例如,以下列表应呈现为apple, orange, banana(请注意列表末尾缺少逗号)。

<ul id="taglist">
  <li>apple</li>
  <li>orange</li>
  <li>banana</li>
</ul>

当前,我正在使用以下CSS来设置此列表的样式,这几乎可以完成我想要的操作,但是将列表呈现为apple, orange, banana,(请注意,香蕉后的逗号结尾)。

#taglist {
  display: inline;
  list-style: none;
}

#taglist li {
  display: inline;
}

#taglist li:after {
  content: ", ";
}

有没有办法用纯CSS解决此问题?


3
我喜欢你要去的地方。您越能保持文档表示的数据结构的完整性,就越会利用CSS的功能。但是,与往常一样,您必须意识到以下事实:较旧的浏览器无法理解该content属性。
雅各布

我发现没有其他规则和IE8支持的解决方案
弗拉基米尔·斯塔科夫

Answers:


75

要删除结尾的逗号,请使用:last-child伪类,如下所示:

#taglist li:last-child:after {
    content: "";
}

这当然是最简单的方法,但是last-child实现起来却比少first-child,尽管它取决于站点的使用情况,并且可以用JS / jQuery,IE的条件注释等进行补偿(请参阅:quirksmode.org/css/ contents.html
大卫说要恢复莫妮卡的2009年

3
我没有这个数据,但我的印象是一个没有实现的浏览器first-child,并last-child没有实现beforeafter以及content与开始。
雅各布

太棒了 非常感谢。该解决方案在Safari 4.0.3和FireFox 3.5.2中的Mac OS X上可以正常工作。
SwedishChef

1
:last-childIE8不支持,请改用:first-child选择器,或仅使用防雷解决方案
弗拉基米尔·斯塔科夫

25

替换一条规则

#taglist li:after {
    content: ", ";
}

只是一个又一个

#taglist li + li:before {
    content: ", ";
}

优点:

  • 一条规则做好所有工作
  • 没有取消前一条规则的规则,
  • IE8支持

这很聪明,但是据我所知,它需要附加的逻辑或经过修改的HTML才能删除出现在每个列表项之前的空格,因为li节点之间存在空格。
雅各布2012年

1
@Jakob哦,是的。真可惜 float: left列表项仅具有一项要求。
弗拉基米尔·斯塔科夫

9
聪明,但我不喜欢它。如果您的行换行,这表现不佳。
ben作者


6

这取决于浏览器的实现,但这应该可行。尽管它依赖first-child,这可能会限制其使用,但实际上将逗号空间", "放在列表项之前,而不是之后。我不确定padding/ margins将如何影响这一点,但是如果您使用`display:inline; 将边距和填充设置为零,就可以了。

#taglist li:before {content: ", ";}
#taglist first-child {content: ""; } /* empty string */

编辑:回应雅各布评论中提供的更正。

以下作品(此处为演示页面: http://davidrhysthomas.co.uk/so/liststyles.html

#taglist    {width: 50%;
        margin: 1em auto;
        padding: 0;
        }

li      {display: inline;
        margin: 0;
        padding: 0;
        }

li:before   {content: ", ";
        }

#taglist li:first-child:before
        {content: "";
        }

尽管逗号奇怪地浮在中间,但老实说,我还是更喜欢公认的答案。但是就是这样,我并没有留下一个可怕的错误答案,我想我应该解决它。

谢谢,雅各布。


1
实际上,这是行不通的。first-child是一个伪类,因此它必须跟随一个元素(li在这种情况下),并且要获得想要的结果,它还必须后面跟随:before,如下所示:#taglist li:first-child:before { content: "" }
雅各布

@雅各布,我只用一个+选择器= =
来做相同的事情

1

这是A List Apart的成员在他们的文章“驯服列表”中推荐的方式:

#taglist ul li:after {
    content: ",";
}

#taglist ul li.last:after {
    content: "";
}

这要求您的列表中的最后一项标记有class属性值“ last”:

<ul id="taglist">
  <li>apple</li>
  <li>orange</li>
  <li class="last">banana</li>
</ul>

0

没有跨浏览器兼容的纯CSS方法(感谢Microsoft)。我建议您只使用服务器端逻辑。

您可能会last在最后一个li上使用一个类并为所有lis(但不是最后一个)使用背景图像来接近,但是您将无法在IE中执行:last-child和content:。


1
溶液变为跨浏览器兼容起价IE8,如果你会使用+选择,而不是:last-child之一,before而是:after
弗拉基米尔Starkov
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.