为什么以下css没有正确编号的部分(http://jsfiddle.net/75MHS/)?当我将h3
和h4
放在div
内时,所有章节编号和章节编号始终为1。但是当我删除div
个容器时,数字都是正确的。
<!DOCTYPE html>
<html>
<head>
<style type='text/css'>
h3 {
counter-increment: chapter;
counter-reset: section;
}
h3:before {
content: "Chapter " counter(chapter) " ";
}
h4 {
counter-increment: section;
}
h4:before {
content: counter(section) " ";
}
</style>
</head>
<body>
<!-- wrong counter -->
<div><h3>dddd</h3></div>
<div><h4>dddd</h4></div>
<div><h4>dddd</h4></div>
<div><h3>dddd</h3></div>
<div><h4>dddd</h4></div>
<div><h4>dddd</h4></div>
<!-- correct counter -->
<!--
<h3>dddd</h3>
<h4>dddd</h4>
<h4>dddd</h4>
<h3>dddd</h3>
<h4>dddd</h4>
<h4>dddd</h4>
-->
</body>
</html>
答案 0 :(得分:3)
它在第二部分中的预期工作(没有div)但在第一部分中没有的原因是由于反作用范围。根据{{3}}:
计数器的范围从文档中第一个元素开始,该元素具有该计数器的“反复位”,并包含元素的后代及其后代兄弟及其后代。
在html的后半部分,h3
和h4
是兄弟姐妹,因此,counter-reset
上定义的h3
适用于以下{{ 1}}兄弟姐妹。在html的第一部分中,h4
s不是h4
s的后代或兄弟,因此,反对它们对它们没有影响,因为它们超出了范围。
另一件事是,如果在给定范围内未定义h3
,则每次counter-reset
或{{1}中的计数器时,它都会假设0
的值规则,这解释了为什么你在html的第一部分得到所有counter-increment
:
如果元素或伪元素上的'counter-increment'或'content'指的是不在任何'counter-reset'范围内的计数器,那么实现应该表现得像'counter-reset'那样在该元素或伪元素上将计数器重置为0.
如果你必须在div中包装东西,我会:
为content
上的1
计数器定义counter-reset
,以便每次使用chapters
时都不会为0。
将body
嵌套在其父counter-increment
下(这不是很酷)或者让他们成为兄弟姐妹,以确保它们在正确的范围内。
新HTML:
h4
加入CSS:
h3
答案 1 :(得分:1)
你现在忘记了div是DOM树的一部分,你也可以将它们作为目标,也可以将它们删除。
div {
counter-increment: chapter;
counter-reset: section;
}
div:before {
content: "Chapter " counter(chapter) " ";
}
答案 2 :(得分:1)
我在包装中添加了类以区分div。
<强> Working Demo 强>
HTML
<div class="head"><h3>dddd</h3></div>
<div class="sub"><h4>dddd</h4></div>
<div class="sub"><h4>dddd</h4></div>
<div class="head"><h3>dddd</h3></div>
<div class="sub"><h4>dddd</h4></div>
<div class="sub"><h4>dddd</h4></div>
CSS
div.head {
counter-increment: chapter;
counter-reset: section;
}
div.head h3:before {
content: "Chapter " counter(chapter) " ";
}
div.sub {
counter-increment: section;
}
div.sub h4:before {
content: counter(section) " ";
}
答案 3 :(得分:-1)
原因是“计数器是'自我嵌套',因为重置后代元素或伪元素中的计数器会自动创建计数器的新实例。”(CSS 2.1,12.4.1 {{ 3}})。
因此,在“错误计数器”的情况下,包含div
元素的每个h3
元素都有自己的名为chapter
的计数器,并且每个h3
递增这样的本地计数器
如果您需要div
元素(或section
元素)进行分组,您可以这样使用它们:
<div class=chapter>
<h3>dddd</h3>
<h4>dddd</h4>
<h4>dddd</h4>
</div>
<div class=chapter>
<h3>dddd</h3>
<h4>dddd</h4>
<h4>dddd</h4>
</div>
使用这样的结构,您的CSS将.chapter
而不是h3
:
.chapter {
counter-increment: chapter;
counter-reset: section;
}