如何定制有序列表中的数字?


109

如何将有序列表中的数字左对齐?

1.  an item
// skip some items for brevity 
9.  another item
10. notice the 1 is under the 9, and the item contents also line up

在有序列表中的数字后面更改字符?

1) an item

还有一种CSS解决方案,可以从数字更改为字母/罗马列表,而不是在ol元素上使用type属性。

我对Firefox 3上的答案最感兴趣。

Answers:


98

这是我在Firefox 3,Opera和Google Chrome中使用的解决方案。该列表仍显示在IE7中(但没有右括号和左对齐数字):

ol {
  counter-reset: item;
  margin-left: 0;
  padding-left: 0;
}
li {
  display: block;
  margin-bottom: .5em;
  margin-left: 2em;
}
li::before {
  display: inline-block;
  content: counter(item) ") ";
  counter-increment: item;
  width: 2em;
  margin-left: -2em;
}
<ol>
  <li>One</li>
  <li>Two</li>
  <li>Three</li>
  <li>Four</li>
  <li>Five</li>
  <li>Six</li>
  <li>Seven</li>
  <li>Eight</li>
  <li>Nine<br>Items</li>
  <li>Ten<br>Items</li>
</ol>

编辑:包括由斯特拉格的多行修复

还有一种CSS解决方案,可以从数字更改为字母/罗马列表,而不是在ol元素上使用type属性。

请参阅list-style-type CSS属性。或者,在使用计数器时,第二个参数接受列表样式类型的值。例如,以下将使用大写罗马字:

li::before {
  content: counter(item, upper-roman) ") ";
  counter-increment: item;
/* ... */

需要重新添加数字,全局样式正在删除它们(谁知道为什么要使用ol并删除数字而不是ul ??)。十分清晰的答案+1,以获取完整的说明和代码,可以轻松进行修改以执行任何操作。
Morvael 2014年

我建议使用一种更干净的CSS 边距/填充解决方案,该解决方案更适合于编号较大的列表:ol {counter-reset: item; padding-left: 0;} li {display: block; margin-bottom: .5em;} li:before {display: inline-block; content: counter(item) ") "; counter-increment: item; padding-right: 0.8em;}
mmj

28

样式列表的CSS在这里,但基本上是:

li {
    list-style-type: decimal;
    list-style-position: inside;
}

但是,具体的布局你可以以后大概只能通过钻研的东西,如实现到布局的内脏这种(请注意,我还没有真正尝试过):

ol { counter-reset: item }
li { display: block }
li:before { content: counter(item) ") "; counter-increment: item }

1
这样可以使数字对齐,但文本内容不是。
grom

13

您还可以在HTML中指定自己的数字-例如,如果数字是由数据库提供的:

ol {
  list-style: none;
}

ol>li:before {
  content: attr(seq) ". ";
}
<ol>
  <li seq="1">Item one</li>
  <li seq="20">Item twenty</li>
  <li seq="300">Item three hundred</li>
</ol>

seq使用类似于其他答案中给出的方法,使该属性可见。但是content: counter(foo)我们使用而不是使用content: attr(seq)

带有更多样式的CodePen演示


7
如果仅在value上使用属性,则可以简化此过程<li>。例如<li value="20">。然后,您不需要任何伪元素。演示
GWB

1
@GWB虽然这是有效的(并且是一个很好的解决方案),但由于列表是顺序的,因此仅限于数值。因此,您无法执行类似的操作value="4A",因为它将无法工作。此外,value属性可以与该type属性一起使用,但是value仍然必须是数字(因为它在有序集合中起作用)。
jedd.ahyoung '16

谢谢-当我需要飞碟以相反的顺序显示列表时,这对我有用reversed属性仅是html5,使用valueli)。seq我没有使用您设置的value,而是使用了它,attr(value)而不是使用它attr(seq)
jaygooby 18-2-14

8

从其他答案中偷了很多,但这对我来说在FF3中有效。它具有upper-roman,一致的压痕,右括号。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title> new document </title>
<style type="text/css">
<!--
ol {
  counter-reset: item;
  margin-left: 0;
  padding-left: 0;
}
li {
  margin-bottom: .5em;
}
li:before {
  display: inline-block;
  content: counter(item, upper-roman) ")";
  counter-increment: item;
  width: 3em;
}
-->
</style>
</head>

<body>
<ol>
  <li>One</li>
  <li>Two</li>
  <li>Three</li>
  <li>Four</li>
  <li>Five</li>
  <li>Six</li>
  <li>Seven</li>
  <li>Eight</li>
  <li>Nine</li>
  <li>Ten</li>
</ol>
</body>
</html>

5

我建议您使用:before属性,并查看可以实现的目标。这将意味着您的代码实际上仅限于新的浏览器,并且排除了仍然使用垃圾旧浏览器的市场(令人讨厌的)部分,

类似于以下内容的东西,将物品固定为。是的,我知道必须自己选择宽度不太优雅,但是在布局中使用CSS就像是秘密警察的工作:不管您的动机如何,它总是很混乱。

li:before {
  content: counter(item) ") ";
  counter-increment: item;
  display: marker;
  width: 2em;
}

但是您将不得不尝试找到确切的解决方案。


您将需要一个counter-reset:item; 在那个块之前。
格雷格,


5

HTML5:使用value属性(无需CSS)

现代浏览器将解释该value属性,并按您期望的方式显示它。请参阅MDN文档

<ol>
  <li value="3">This is item three.</li>
  <li value="50">This is item fifty.</li>
  <li value="100">This is item one hundred.</li>
</ol>

还可以查看有关MDN <ol>文章,尤其是startand属性的文档。


4

借用并改进了马库斯·唐宁的答案。经过测试并在Firefox 3和Opera 9中运行。也支持多行。

ol {
    counter-reset: item;
    margin-left: 0;
    padding-left: 0;
}

li {
    display: block;
    margin-left: 3.5em;          /* Change with margin-left on li:before.  Must be -li:before::margin-left + li:before::padding-right.  (Causes indention for other lines.) */
}

li:before {
    content: counter(item) ")";  /* Change 'item' to 'item, upper-roman' or 'item, lower-roman' for upper- and lower-case roman, respectively. */
    counter-increment: item;
    display: inline-block;
    text-align: right;
    width: 3em;                  /* Must be the maximum width of your list's numbers, including the ')', for compatability (in case you use a fixed-width font, for example).  Will have to beef up if using roman. */
    padding-right: 0.5em;
    margin-left: -3.5em;         /* See li comments. */
}

你也想text-align:left; 不对。最后一行应在左边距处:-3.5em;
grom

@grom,感谢您对em的更正。另外,Opera会默认将列表右对齐,因此我模仿了这种行为。
斯特拉格

@ grom,Firefox问题是... Firefox将li:before伪元素放在自己的行上,没有浮点数,即使显示为:inline-block。
斯特拉格2009年

@strager,好吧,我在Linux上使用3.0.4,在Windows上使用3.0.3,它对我有用,没有浮点数:left; 规则。
grom

@grom,嗯,很有趣。我只是对自己进行了测试,并且没有浮点数。也许我打错了。
斯特拉格

2

有一个“ 类型”属性,它允许您更改编号样式,但是,不能在数字/字母后更改句号。

<ol type="a">
    <li>Turn left on Maple Street</li>
    <li>Turn right on Clover Court</li>
</ol>

此答案中的标记需要修复。使用小写字母并将属性值括在“引号”中。
dylanfm

并关闭您的元素:<li> ... </ li>。
dylanfm

@dylanfm —您知道呈现的标记是正确的,100%有效的HTML,是吗?除非有人要求使用XHTML,否则不要对不使用XHTML的人表示不满。
本·布兰克

我没有投票给你。是的,这是真的。HTML。我只是一个标准的挑剔的人。
dylanfm

我很抱歉张贴无效的html。我从一个网站复制了代码,但没有想纠正它。我现在感到
as

1

文档说关于 list-style-position: outside

CSS1没有指定标记框的精确位置,并且出于兼容性的考虑,CSS2仍然具有歧义。为了更精确地控制标记盒,请使用标记。

在该页面的后面是有关标记的内容。

一个例子是:

       LI:before { 
           display: marker;
           content: "(" counter(counter) ")";
           counter-increment: counter;
           width: 6em;
           text-align: center;
       }

标记的所有示例(请参阅w3.org/TR/CSS2/generate.html#q11)都不适合我。
grom

1

不...使用DL:

dl { overflow:hidden; }
dt {
 float:left;
 clear: left;
 width:4em; /* adjust the width; make sure the total of both is 100% */
 text-align: right
}
dd {
 float:left;
 width:50%; /* adjust the width; make sure the total of both is 100% */
 margin: 0 0.5em;
}

0

我有 请尝试以下操作:

<html>
<head>
<style type='text/css'>

    ol { counter-reset: item; }

    li { display: block; }

    li:before { content: counter(item) ")"; counter-increment: item; 
        display: inline-block; width: 50px; }

</style>
</head>
<body>
<ol>
    <li>Something</li>
    <li>Something</li>
    <li>Something</li>
    <li>Something</li>
    <li>Something</li>
    <li>Something</li>
    <li>Something</li>
    <li>Something</li>
    <li>Something</li>
    <li>Something</li>
    <li>Something</li>
    <li>Something</li>
</ol>
</body>

问题是,这绝对不能在较旧或不太兼容的浏览器上运行:这display: inline-block是一个非常新的属性。


0

快速而肮脏的替代解决方案。您可以将制表符与预格式化的文本一起使用。这是一种可能性:

<style type="text/css">
ol {
    list-style-position: inside;
}
li:first-letter {
    white-space: pre;
}
</style>

和您的html:

<ol>
<li>    an item</li>
<li>    another item</li>
...
</ol>

请注意,li标记和文本开头之间的空格是制表符(按记事本中的Tab键时得到的内容)。

如果需要支持较旧的浏览器,则可以执行以下操作:

<style type="text/css">
ol {
    list-style-position: inside;
}
</style>

<ol>
    <li><pre>   </pre>an item</li>
    <li><pre>   </pre>another item</li>
    ...
</ol>

0

从概念的角度来看,其他答案更好。但是,您只需在数字的左边加上适当的'&ensp;' 使他们排队​​。

*注意:起初我没有意识到正在使用编号列表。我认为该列表已明确生成。


0

我会在这里给出我通常不喜欢阅读的答案,但是我认为,由于还有其他答案告诉您如何实现自己想要的东西,因此重新考虑一下您想达到的目标是否真的很不错。一个好主意。

首先,您应该考虑以非标准的方式显示项目,并且分隔符与所提供的字符不同,是否是一个好主意。

我不知道原因,但让我们假设您有充分的理由。

这里提出的实现方法包括在标记中添加内容,主要是通过CSS:before伪类。该内容实际上是在修改您的DOM结构,并将这些项目添加到其中。

当使用标准的“ ol”计数时,将具有一个呈现内容,在该呈现内容中可以选择“ li”文本,但不能选择其前面的数字。也就是说,标准编号系统似乎比实际内容更具“装饰性”。如果您使用例如“:before”方法添加数字内容,则该内容将是可选的,并且由于此原因,屏幕阅读器将发生不希望的vopy / paste问题或可访问性问题,这些阅读器还将读取此“新”内容到标准计算系统。

也许另一种方法是使用图像设置数字样式,尽管这种选择会带来自己的问题(禁用图像时数字不会显示,数字的文字大小不会改变,...)。

无论如何,这个答案的原因不仅在于提出这种“图像”替代方案,还在于使人们思考尝试更改有序列表的标准计数系统的后果。


0

此代码使编号样式与li内容的标题相同。

<style>
    h4 {font-size: 18px}
    ol.list-h4 {counter-reset: item; padding-left:27px}
    ol.list-h4 > li {display: block}
    ol.list-h4 > li::before {display: block; position:absolute;  left:16px;  top:auto; content: counter(item)"."; counter-increment: item; font-size: 18px}
    ol.list-h4 > li > h4 {padding-top:3px}
</style>

<ol class="list-h4">
    <li>
        <h4>...</h4>
        <p>...</p> 
    </li>
    <li>...</li>
</ol>
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.