父母增加反增,但子女增加

时间:2018-08-08 21:24:10

标签: html css css-counter

我正在努力处理CSS的“计数器增加”和“计数器重置”属性。我已经使它可以很好地与列表配合使用,但是例如对于标头标记,事情对我来说就不太清楚了。

想象一下以下布局:

<div id="root">
    <div class="section">
        <h1 class="header">Header</h1>

        <div class="section">
            <h2 class="header">Header</h2>
            <!-- can be nested multiple times -- >
        </div>
    </div>
    <div class="section">
        <h1 class="header">Header</h1>
        <!-- content -->
    </div>
</div>

我希望对标题标签进行编号(包括嵌套计数!),但是由于标题标签本身未嵌入,但是它们的父母无法使其正常工作。所以这就是我到目前为止(基于逻辑,但不是我想要达到的最接近的解决方案!我尝试了我能想到的所有可能的组合)

#root
{
    /* root should reset counter */
    counter-reset: section_header;
}

#root .section
{
    /* since every section has a header tag, we should count sections-divs, as they wrap children as well */
    counter-increment: section_header;
}

.section .header::before
{
    /* This would take care of the display, but I suspect it doesn't obtain the correct value since the scope of the counter is not available? */
    content: counters(section_header, ".") " ";
}

如果能找到解决方案的任何方向,我将不胜感激。

ps。我应该提一下,我主要是在Chrome上进行测试,但我也在其他浏览器上也找到了它。

编辑

我正在寻找的格式是'1.1','1.2','1.2.1'等。每个嵌套部分都应附加另一个计数器层,尽管我可以在不分层的情况下使它工作(单个深度),动态多层是要获得相应效果的一种技巧。

1 个答案:

答案 0 :(得分:2)

更新:我看到了您可能在创建此示例时可能会得到启发的MDN示例。将其转换为标记的混乱之处在于它们使用包含子元素的<ol><li>标签。在标头<h_>元素的上下文中这没有多大意义,但是似乎您必须将子元素保留在它们内部才能完成同一件事。我添加了after元素和一些light CSS,以显示每个元素的结尾。希望这会有所帮助。

.section {
  counter-reset: section;                /* Creates a new instance of the
                                            section counter with each ol
                                            element */
  list-style-type: none;
}

.header::before {
  counter-increment: section;            /* Increments only this instance
                                            of the section counter */
  content: counters(section, ".") " ";   /* Combines the values of all instances
                                            of the section counter, separated
                                            by a period */
}

.section{
  font-size: 16px;
  margin: 10px 0;
}
h1::after {
  content: ' (end h1)';
}

h2 {
  margin-left: 10px;
}
h2::after {
  content: ' (end h2)';
}

h3 {
  margin-left: 20px;
}
h3::after {
  content: ' (end h3)';
}
<div id="root">
  <div class="section">
    <h1 class="header">item</h1>          <!-- 1     -->
    <h1 class="header">item               <!-- 2     -->
      <div class="section">
        <h2 class="header">item</h2>      <!-- 2.1   -->
        <h2 class="header">item</h2>      <!-- 2.2   -->
        <h2 class="header">item           <!-- 2.3   -->
          <div class="section">
            <h3 class="header">item</h3>  <!-- 2.3.1 -->
            <h3 class="header">item</h3>  <!-- 2.3.2 -->
          </div>
         </h2>
         <h2 class="header">item 
          <div class="section">
            <h3 class="header">item</h3>  <!-- 2.4.1 -->
            <h3 class="header">item</h3>  <!-- 2.4.2 -->
            <h3 class="header">item</h3>  <!-- 2.4.3 -->
          </div>
        </h2>
        <h2 class="header">item</h2>      <!-- 2.5   -->
      </div>
    </h1>
    <h1 class="header">item</h1>          <!-- 3     -->
    <h1 class="header">item</h1>          <!-- 4     -->
  </div>
</div>