【问题标题】:CSS counter - numbered headings in different divCSS 计数器 - 不同 div 中的编号标题
【发布时间】:2017-12-12 09:29:11
【问题描述】:

我正在尝试使用 CSS 计数器制作编号标题,并且当所有标题都在同一个 div 中时效果很好,但是当我需要将计数器重置为后代 div 中的初始值并从新值中继续使用该计数器时另一个div,那我就有问题了。

计数器的范围从文档中具有该计数器的“计数器重置”的第一个元素开始,并包括该元素的后代及其后续兄弟姐妹及其后代。

因此,我假设当我通过某个标题重置计数器时,只会为该标题所在的 div 及其后代设置新的计数器。所以在下一个 div 中没有设置计数器,并且从头开始计数。解决方案可能不是重置计数器,而是将计数器设置为初始值。但我还没有找到办法做到这一点。有可能吗?或者我必须使用 javascript 来以这种方式使用编号标题?还是有其他解决方案?

.text-container {
    counter-reset: section sub-section composite;
    h1.numbered {
        counter-reset: sub-section;
    }
    h2.numbered {
        counter-reset: composite;
    }
}

h1.numbered:before {
    counter-increment: section;
    content: counter(section) " ";
}
h2.numbered:before {
    counter-increment: sub-section;
    content: counter(section) "." counter(sub-section) " ";
}
h3.numbered:before {
    counter-increment: composite;
    content: counter(section) "." counter(sub-section) "." counter(composite) " ";
}
<div class="text-container">
  <div class="text-section">
    <div class="text-section-column">
      <h1 class="numbered">result 1 Heading</h1>
      <h2 class="numbered">result 1.1 Heading</h2>
    </div>
    <div class="text-section-column">
      <h3 class="numbered">result 1.1.1 Heading</h3>
      <h2 class="numbered">result 1.2 Heading</h2>
      <h3 class="numbered">result 1.2.1 Heading</h3>
    </div>
  </div>
  <div class="text-section">
    <div class="text-section-column">
      <h3 class="numbered">result 1.2.1 Heading (expected 1.2.2)</h3>
    </div>
  </div>
</div>

在第三个 .text-section-column 中,我想从最后一个值继续计数,但设置了新的计数器。

谢谢。

【问题讨论】:

  • @AndreiGheorghiu 我认为这不是重复的,因为有问题你建议他不需要将任何计数器重置为初始值,并且 ol 元素在同一个 div 中。实际上我认为(看起来它是这样工作的)当你在后代 div 中重置计数器时,父节点无法访问它。
  • 在我的第一条评论中,我链接了官方文档,恕我直言,您应该在询问之前(重新)搜索过。它有一个示例,其中部分和子部分的深度为三层。如果这没有帮助,请澄清您的问题。以目前的形式,不清楚你在问什么。您可以使用 counter-reset: identifier; 重置 CSS 计数器
  • 我当然看过文档。所以也许我应该更准确地表达我的问题。这是计数器的这个特性“计数器是‘自嵌套’的,从某种意义上说,在后代元素或伪元素中重置计数器会自动创建一个新的计数器实例。”因此,当我想在 .text-section-column 中将 counter 的值设置为 initial 时,counter-reset 实际上会创建新的 counter 实例,下一个 text-section 中的下一列无法访问该实例。因为最后一列访问全局计数器,所以我想要实现的是在 html 代码 sn-p 中。
  • 所以我真正想做的就是将计数器递减到零。并且不要使用创建新实例的计数器重置。

标签: css


【解决方案1】:

更新答案:

根据spec

计数器是“自嵌套”的,从某种意义上说,重置后代元素或伪元素中的计数器会自动创建计数器的新实例。

...,这意味着嵌套会影响您的任意嵌套计数器。

所以你有两个选择:

A.根本不筑巢:

.numbered:before { color: red; }

.text-container {
    counter-reset: a b 1 c;
}

h1.numbered {
  counter-increment: a;
  counter-reset: b;
}
h2.numbered {
  counter-increment: b;
  counter-reset: c;
}
h3.numbered {
  counter-increment: c;
}
h1.numbered:before {
  content: counter(a) " ";
}
h2.numbered:before {
    content: counter(a) "." counter(b) " ";
}
h3.numbered:before {
    content: counter(a) "." counter(b) "." counter(c) " ";
}
<div class="text-container">
  <div class="text-section">
    <div class="text-section-column">
      <h1 class="numbered">result 1 Heading</h1>
      <h2 class="numbered">result 1.1 Heading</h2>
      <h3 class="numbered">result 1.1.1 Heading</h3>
      <h2 class="numbered">result 1.2 Heading</h2>
      <h3 class="numbered">result 1.2.1 Heading</h3>
      <h3 class="numbered">result <strike>1.2.1</strike> 1.2.2 Heading (expected 1.2.2)</h3>
    </div>
  </div>
</div>

B.或者,如果您嵌套,请正确执行:

.numbered:before { color: red; }

.item {
 counter-increment: item; 
}
.item > .item {
  counter-reset: item;
}
.item ~ .item {
  counter-reset: none;
}
.item .numbered::before {
   content: counters(item, ".") " ";
}
<div class="text-container">
  <div class="item">
    <h1 class="numbered">result 1 Heading</h1>
    <div class="item">
      <h2 class="numbered">result 1.1 Heading</h2>
      <div class="item">
        <h3 class="numbered">result 1.1.1 Heading</h3>
      </div>
      <div class="item">
        <h3 class="numbered">result 1.1.2 Heading</h3>
      </div>
    </div>
    <div class="item">
      <h2 class="numbered">result 1.2 Heading</h2>
      <div class="item">
        <h3 class="numbered">result 1.2.1 Heading</h3>
      </div>
      <div class="item">
        <h3 class="numbered">result <strike>1.2.1</strike> 1.2.2 Heading (expected 1.2.2)</h3>
      </div>
    </div>
  </div>
</div>


初步回答:

我假设您正在寻找这个?

.numbered:before { color: red; }

.text-container {
    counter-reset: a b 1 c;
}

h1.numbered {
  counter-increment: a;
  counter-reset: b;
}
h2.numbered {
  counter-increment: b;
  counter-reset: c;
}
h3.numbered {
  counter-increment: c;
}
h1.numbered:before {
  content: counter(a) " ";
}
h2.numbered:before {
    content: counter(a) "." counter(b) " ";
}
h3.numbered:before {
    content: counter(a) "." counter(b) "." counter(c) " ";
}
<div class="text-container">
  <div class="text-section">
    <div class="text-section-column">
      <h1 class="numbered">result 1 Heading</h1>
      <h2 class="numbered">result 1.1 Heading</h2>
    </div>
    <div class="text-section-column">
      <h3 class="numbered">result 1.1.1 Heading</h3>
      <h2 class="numbered">result 1.2 Heading</h2>
      <h3 class="numbered">result 1.2.1 Heading</h3>
    </div>
  </div>
  <div class="text-section">
    <div class="text-section-column">
      <h3 class="numbered">result <strike>1.2.1</strike> 1.2.2 Heading (expected 1.2.2)</h3>
    </div>
  </div>
</div>

【讨论】:

  • 感谢您的回答,但这也不起作用。尝试在“1.2”标题之前再添加一个 h3 标题,最后一个 h3 标题的结果是 1.2.3 但应该是 1.2.2
  • @fuuchi,用可能的解决方案更新了答案。
  • 不幸的是,由于tinymce文档中的布局要求,我不得不像这样嵌套。通过css做到这一点的唯一方法是通过counter-increment:counter_id -(counter_value),但我认为这是不可能的,所以我想我必须用javascript来克服这个问题。无论如何感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-26
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 2013-11-20
  • 1970-01-01
相关资源
最近更新 更多