在html中创建目录

时间:2013-01-03 11:58:50

标签: html

是否可以创建如下的有序列表? 我喜欢这个我正在创建的目录。

  1. SECTION1
    2.1子部分1 2.2 SubSection2
  2. 第2节
    .....
  3. 我有以下内容,但每个小节从1开始重新启动。

    <ol>
            <li>
                <a href="#Lnk"></a>
            </li>
            <li>
                <a href="#Lnk"></a>
            </li>
            <ol>
                <li>
                    <a href="#Lnk"></a>
                </li>
                <li>
                    <a href="#Lnk"></a>
                </li>
            </ol>
    </ol>
    

    由于

5 个答案:

答案 0 :(得分:12)

这确实可以用纯CSS完成:

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

与小提琴相同的例子:http://jsfiddle.net/N79nP/

答案 1 :(得分:5)

有很多jQuery插件可以生成目录。

答案 2 :(得分:1)

你看过这篇文章了吗: Number nested ordered lists in HTML

我不认为不使用JS就可以完成。

答案 3 :(得分:0)

此代码为我提供了所需的输出:

<ol>
  <li>
    <a href="#Lnk">foo</a>
  </li>
  <li>
    <a href="#Lnk">bar</a>
    <ol>
      <li>
        <a href="#Lnk">baz</a>
      </li>
      <li>
        <a href="#Lnk">qux</a>
      </li>
    </ol>
  </li>
  <li>
    <a href="#Lnk">alpha</a>
    <ol>
      <li>
        <a href="#Lnk">beta</a>
      </li>
      <li>
        <a href="#Lnk">gamma</a>
      </li>
    </ol>
  </li>
</ol>

CSS:

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

提琴:http://jsfiddle.net/Lepetere/evm8wyj5/1/

答案 4 :(得分:0)

就我自己而言,我对现有的解决方案并不满意。所以我用 Python3BeautifulSoup 创建了一个解决方案。

该函数将 HTML 源代码作为字符串并查找标题标记(例如 h1)。在接下来的步骤中,会为标头以及相应的 toc 条目创建 id=

def generate_toc(html_out):
    """Create a table of content based on the header tags.
    
    The header tags are used to create and link the toc.
    The toc as place on top of the html output.
    
    Args:
        html_out(string): A string containing the html source.

    Returns:
        (string): The new string.
    """
    from bs4 import BeautifulSoup

    # the parser
    soup = BeautifulSoup(html_out, 'html.parser')

    # create and place the div element containing the toc
    toc_container = soup.new_tag('div', id='toc_container')
    first_body_child = soup.body.find_all(recursive=False)[0]
    first_body_child.insert_before(toc_container)
    # toc headline
    t = soup.new_tag('p', attrs={'class': 'toc_title'})
    t.string = 'Inhalt'
    toc_container.append(t)

    def _sub_create_anchor(h_tag):
        """Create a toc entry based on a header-tag.
        The result is a li-tag containing an a-tag.
        """
        # Create anchor
        anchor = uuid.uuid4()
        h_tag.attrs['id'] = anchor  # anchor to headline
        # toc entry for that anchor
        a = soup.new_tag('a', href=f'#{anchor}')      
        a.string = h_tag.string
        # add to toc
        li = soup.new_tag('li')
        li.append(a)
        return li

    # main ul-tag for the first level of the toc
    ul_tag = soup.new_tag('ul', attrs={'class': 'toc_list'})
    toc_container.append(ul_tag)

    # helper variables
    curr_level = 1
    ul_parents = [ul_tag]

    # header tags to look for
    h_tags_to_find = [f'h{i}' for i in range(1, 7)]  # 'h1' - 'h6'
    for header in soup.find_all(h_tags_to_find):
        next_level = int(header.name[1:])

        if curr_level < next_level:  # going downstairs
            # create sub ul-tag
            sub_ul_tag = soup.new_tag('ul', attrs={'class': 'toc_list'})
            # connect it with parrent ul-tag
            ul_parents[-1].append(sub_ul_tag)
            # remember the sub-ul-tag
            ul_parents.append(sub_ul_tag)
        elif curr_level > next_level:  # going upstairs
            # go back to parent ul-tag
            ul_parents = ul_parents[:-1]

        curr_level = next_level

        # toc-entry as li-a-tag
        li_tag = _sub_create_anchor(header)
        # add to last ul-tag
        ul_parents[-1].append(li_tag)

    return soup.prettify(formatter='html5')

这在您的所有用例中可能并不优雅。我自己过去常常将 TOC 放在由数据科学例程(例如 Pandas)生成的 HTML 报告之上。