0

我在 css 'counter-increment' 和 'counter-reset' 属性上有点挣扎。我已经让它与列表完美配合,但是当涉及到标题标签时,对我来说事情变得不太清楚了。

想象一下以下布局:

<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, ".") " ";
}

我将不胜感激任何解决方案的方向(如果存在)。

附言。我应该提到我主要在 Chrome 上测试这个,但我在其他浏览器上也发现了这个。

编辑

我正在寻找的格式是“1.1”、“1.2”、“1.2.1”等。每个嵌套部分都应该附加另一个计数器层,尽管我可以在不分层(单深度)的情况下让它工作,动态多分层显然很难实现。

4

1 回答 1

2

更新:我看到了 MDN 示例,您可能在创建此示例时使用了该示例。将其转换为标记的令人困惑的部分是它们使用包含子元素的标签<ol><li>这在标题元素的上下文中没有多大意义<h_>,但似乎您必须将子元素保留在其中才能完成相同的事情。我添加了 after 元素和一些浅色 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>

于 2018-08-08T22:01:16.783 回答