有序列表可以生成看起来像1.1,1.2,1.3(而不仅仅是1,2,3,...)的结果与css?

Ric*_*d77 186 html css

有序列表是否可以使用CSS生成看起来像1.1,1.2,1.3(而不仅仅是1,2,3 ......)的结果?到目前为止,使用list-style-type:decimal只产生了1,2,3,而不是1.1,1.2.,1.3.

Gum*_*mbo 266

您可以使用计数器执行此操作:

以下样式表编号将列表项嵌套为"1","1.1","1.1.1"等.

OL { counter-reset: item }
LI { display: block }
LI:before { content: counters(item, ".") " "; counter-increment: item }
Run Code Online (Sandbox Code Playgroud)

ol { counter-reset: item }
li{ display: block }
li:before { content: counters(item, ".") " "; counter-increment: item }
Run Code Online (Sandbox Code Playgroud)
<ol>
  <li>li element
    <ol>
      <li>sub li element</li>
      <li>sub li element</li>
      <li>sub li element</li>
    </ol>
  </li>
  <li>li element</li>
  <li>li element
    <ol>
      <li>sub li element</li>
      <li>sub li element</li>
      <li>sub li element</li>
    </ol>
  </li>
</ol>
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅嵌套计数器和范围.

  • 这个解决方案遗漏了一件小事:项目编号后面的点。它看起来不像标准列表样式。通过在 `li:before` 的规则中添加一个点来修复:`content: counters(item, ".")". ";` (3认同)
  • 这是一个糟糕的答案.它无法正常工作.请查看下面的Jakub Jirutka的答案 (3认同)
  • 很好的答案.对此有何支持? (2认同)

Jak*_*tka 209

此页面上的所有解决方案都不能正确且普遍地适用于所有级别和长(包装)段落.由于标记的大小可变(1.,1.2,1.10,1.10.5,......),因此实现一致的缩进非常棘手.它不能只是"伪造",即使每个可能的缩进级别都有预先计算的边距/填充.

我终于找到了一个实际工作且不需要任何JavaScript 的解决方案.

它在Firefox 32,Chromium 37,IE 9和Android Browser上进行了测试.在IE 7和之前的版本上不起作用.

CSS:

ol {
  list-style-type: none;
  counter-reset: item;
  margin: 0;
  padding: 0;
}

ol > li {
  display: table;
  counter-increment: item;
  margin-bottom: 0.6em;
}

ol > li:before {
  content: counters(item, ".") ". ";
  display: table-cell;
  padding-right: 0.6em;    
}

li ol > li {
  margin: 0;
}

li ol > li:before {
  content: counters(item, ".") " ";
}
Run Code Online (Sandbox Code Playgroud)

例: 例

JSFiddle试一试,在Gist上分叉吧.

  • 很好的解决方案。我在 `ol &gt; li:before` 中添加了 `white-space: nowrap;` 以防止数字换行 (4认同)
  • 它确实适用于所有级别和长段落(技术上).如果使用十几个级别是合理的,那么这个问题与技术解决方案无关.关键是您不必为每个嵌套级别预定义CSS规则,就像使用其他一些解决方案一样. (3认同)
  • 虽然我不会说其他答案本来就有"错误",但我会说它们不完整.这个答案很明显,甚至在我正在修改的一个可怕的奇怪风格的网站上工作. (3认同)
  • 很好地实现了这种类型的缩进。但是,我仍然会争辩说,您列出的前两种缩进情况是偏好问题,而不是对与错。考虑 [case 1](http://jsfiddle.net/p3rtLw7q/23/) 和 [case 2](http://jsfiddle.net/3J4Bu/199/)——后者设法挤进了更多层次在间距变得笨拙之前,同时看起来仍然很整洁。此外,MS Word 和 [默认浏览器样式](http://jsfiddle.net/czdf9ykt/) 都使用案例 2 缩进。我猜他们也做错了? (2认同)
  • @ saul-fautley在排版方面这是错误的.你的嵌套级别数量疯狂的例子表明嵌套编号不适合太多级别,但这很明显.MS Words不是排版系统,它只是一个排版很差的文档处理器.默认的浏览器样式......哦,你对排版不太了解,对吗? (2认同)
  • @tremby:可以通过使 li 使用“display: table-row”而不是“display: table”来解决差异。这带来的问题是 li 不能使用任何边距/填充,因为表格行总是根据其内容自动调整大小。这可以通过添加“li:after”和“display:block”来解决。有关完整示例,请参阅 [jsFiddle](http://jsfiddle.net/rg0b5pqn/4/)。作为额外的奖励,我将“text-align: right”添加到“li:before”以使数字右对齐。 (2认同)

Sau*_*ley 59

选择的答案是一个很好的开始,但它基本上强制list-style-position: inside;列表项上的样式,使得包装文本难以阅读.这是一个简单的解决方法,它还可以控制数字和文本之间的边距,并根据默认行为右对齐数字.

ol {
    counter-reset: item;
}
ol li {
    display: block;
    position: relative;
}
ol li:before {
    content: counters(item, ".")".";
    counter-increment: item;
    position: absolute;
    margin-right: 100%;
    right: 10px; /* space between number and text */
}
Run Code Online (Sandbox Code Playgroud)

JSFiddle: http ://jsfiddle.net/3J4Bu/

  • @Davin Studer:根据默认的"ol"行为,它只在每个数字的末尾添加一个句点.它可以通过删除`content`属性中的最后一个`"."来轻松删除,但这对我来说有点奇怪. (3认同)

ken*_*ytm 6

注意:使用CSS 在现代浏览器中创建嵌套编号.看到接受的答案.以下仅供参考.counters


如果浏览器支持contentcounter,

.foo {
  counter-reset: foo;
}
.foo li {
  list-style-type: none;
}
.foo li::before {
  counter-increment: foo;
  content: "1." counter(foo) " ";
}
Run Code Online (Sandbox Code Playgroud)
<ol class="foo">
  <li>uno</li>
  <li>dos</li>
  <li>tres</li>
  <li>cuatro</li>
</ol>
Run Code Online (Sandbox Code Playgroud)

  • 我的观点是你已经硬编码了“1”。进入风格。当子列表是父列表中第二项的子项时会发生什么?您希望它显示为“2.”,但它始终为“1”。因为它在这里编码的方式。解决办法是什么?为每个可能的数字制作新的样式集?不可以。使用上面示例中的 `counters()` 函数而不是 `counter()` 函数。 (2认同)

che*_*der 6

这里发布的解决方案对我来说效果不佳,所以我对这个问题和以下问题进行了混合:是否可以在HTML中创建多级有序列表?

/* Numbered lists like 1, 1.1, 2.2.1... */
ol li {display:block;} /* hide original list counter */
ol > li:first-child {counter-reset: item;} /* reset counter */
ol > li {counter-increment: item; position: relative;} /* increment counter */
ol > li:before {content:counters(item, ".") ". "; position: absolute; margin-right: 100%; right: 10px;} /* print counter */
Run Code Online (Sandbox Code Playgroud)

结果:

截图

注意:截图,如果您希望查看源代码或此帖子中的内容:http://estiloasertivo.blogspot.com.es/2014/08/introduccion-running-lean-y-lean.html


tyr*_*ion 6

在不久的将来,您也许能够使用::markerpsuedo-element只需一行代码即可获得与其他解决方案相同的结果。

请记住检查浏览器兼容性表,因为这仍然是一项实验性技术。在撰写本文时,只有 Firefox 和 Android 版 Firefox(从版本 68 开始)支持此功能。

如果在兼容的浏览器中尝试,下面是一个可以正确呈现的代码片段:

::marker { content: counters(list-item,'.') ':' }
li { padding-left: 0.5em }
Run Code Online (Sandbox Code Playgroud)
<ol>
  <li>li element
    <ol>
      <li>sub li element</li>
      <li>sub li element</li>
      <li>sub li element</li>
    </ol>
  </li>
  <li>li element</li>
  <li>li element
    <ol>
      <li>sub li element</li>
      <li>sub li element</li>
      <li>sub li element</li>
    </ol>
  </li>
</ol>
Run Code Online (Sandbox Code Playgroud)

您可能还想查看smashingmagazine 发表的关于该主题的这篇精彩文章。


小智 5

以下对我有用:

ol {
  list-style-type: none;
  counter-reset: item;
  margin: 0;
  padding: 0;
}

ol > li {
  display: table;
  counter-increment: item;
  margin-bottom: 0.6em;
}

ol > li:before {
  content: counters(item, ".") ") ";
  display: table-cell;
  padding-right: 0.6em;
}

li ol > li {
  margin: 0;
}

li ol > li:before {
  content: counters(item, ".") ") ";
}
Run Code Online (Sandbox Code Playgroud)

看看: http: //jsfiddle.net/rLebz84u/2/

或者这个http://jsfiddle.net/rLebz84u/3/ 包含更多且合理的文本


归档时间:

查看次数:

144256 次

最近记录:

5 年,11 月 前