是否可以创建如下的有序列表? 我喜欢这个我正在创建的目录。
我有以下内容,但每个小节从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>
由于
答案 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;
}
答案 4 :(得分:0)
就我自己而言,我对现有的解决方案并不满意。所以我用 Python3
和 BeautifulSoup
创建了一个解决方案。
该函数将 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 报告之上。