数字嵌套HTML中的有序列表

时间:2010-04-28 13:42:20

标签: jquery html css html-lists

我有一个嵌套的有序列表。

<ol>
  <li>first</li>
  <li>second
  <ol>
    <li>second nested first element</li>
    <li>second nested secondelement</li>
    <li>second nested thirdelement</li>
  </ol>
  </li>
  <li>third</li>
  <li>fourth</li>
</ol>

目前,嵌套元素再次从1开始,例如

  1. 第一
  2. 第二
    1. 第二个嵌套的第一个元素
    2. 第二个嵌套的第二个元素
    3. 第二个嵌套的第三个元素
  3. 第三
  4. 第四
  5. 我想要的是第二个元素的编号如下:

    1. 第一
    2. 第二

      2.1。第二个嵌套的第一个元素

      2.2。第二个嵌套的第二个元素

      2.3。第二个嵌套的第三个元素

    3. 第三
    4. 第四
    5. 有没有办法做到这一点?

6 个答案:

答案 0 :(得分:35)

这是一个适用于所有浏览器的示例。纯CSS方法适用于真正的浏览器(即IE6 / 7以外的所有内容),而jQuery代码则涵盖不受支持的内容。这是SSCCE的味道,你可以直接复制'n'paste'n'run它没有变化。

<!doctype html>
<html lang="en">
    <head>
        <title>SO question 2729927</title>
        <script src="http://code.jquery.com/jquery-latest.min.js"></script>
        <script>
            $(document).ready(function() {
                if ($('ol:first').css('list-style-type') != 'none') { /* For IE6/7 only. */
                    $('ol ol').each(function(i, ol) {
                        ol = $(ol);
                        var level1 = ol.closest('li').index() + 1;
                        ol.children('li').each(function(i, li) {
                            li = $(li);
                            var level2 = level1 + '.' + (li.index() + 1);
                            li.prepend('<span>' + level2 + '</span>');
                        });
                    });
                }
            });
        </script>
        <style>
            html>/**/body ol { /* Won't be interpreted by IE6/7. */
                list-style-type: none;
                counter-reset: level1;
            }
            ol li:before {
                content: counter(level1) ". ";
                counter-increment: level1;
            }
            ol li ol {
                list-style-type: none;
                counter-reset: level2;
            }
            ol li ol li:before {
                content: counter(level1) "." counter(level2) " ";
                counter-increment: level2;
            }
            ol li span { /* For IE6/7. */
                margin: 0 5px 0 -25px;
            }
        </style>
    </head>
    <body>
        <ol>
            <li>first</li>
            <li>second
                <ol>
                    <li>second nested first element</li>
                    <li>second nested second element</li>
                    <li>second nested third element</li>
                </ol>
            </li>
            <li>third</li>
            <li>fourth</li>
        </ol>
    </body>
</html>

答案 1 :(得分:33)

我知道回复已经很晚了,但我刚刚发现example使用CSS做了这件事。将此添加到CSS部分(或文件):

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

以下是列表代码的示例:

<ol class="nested">
<li class="nested">item 1</li>
<li class="nested">item 2
    <ol class="nested">
        <li class="nested">subitem 1</li>
        <li class="nested">subitem 2</li>
    </ol></li>
<li class="nested">item 3</li>
</ol>

HTH

答案 2 :(得分:8)

此页面上没有任何解决方案适用于所有级别和长(包装)段落的正确和普遍。由于标记的大小可变(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, ".") " ";
}

示例: example

jsFiddle上试用,在Gist上分叉。

答案 3 :(得分:0)

这在纯HTML / CSS中是不可能的。请参阅BalusC的答案,以获得开箱即用的优秀解决方案。可以在w3schools, here找到编号类型列表。

我能找到的最接近的选项是use of the value attribute, from w3c,但是以下标记

<ol>
    <li value="30">
        makes this list item number 30.
    </li>
    <li value="40">
        makes this list item number 40.
    </li>
    <li>
        makes this list item number 41.
    </li>
    <li value="2.1">
        makes this list item number ...
    </li>
    <li value="2-1">
        makes this list item number ...
    </li>
</ol>

生成一个编号为30,40,41,2和2的列表。

正如John已经指出的那样,在这种情况下,你最好的选择就是编写脚本。

答案 4 :(得分:0)

稍微调整一下,您应该能够调整the technique used here(在第二个示例中)来创建顺序列表。

答案 5 :(得分:0)

如果您在项目中使用sass / scss进行样式设置,则可以使用mixin进行此操作。要设置此嵌套列表的样式,您只需要两行sass代码。

@import 'nested_list'
+nested_list('nested', 2)

<ol>
  <li>first</li>
  <li>second
      <ol class="nested-2">
          <li>second nested first element</li>
          <li>second nested secondelement</li>
          <li>second nested thirdelement</li>
      </ol>
  </li>
  <li>third</li>
  <li>fourth</li>
</ol>

您可以从git repo克隆/观看或在fidle上生成css的完整示例