JackAtlas

Command Palette

Search for a command to run...

CSS 计数器(上)
over 11 years ago
前端开发

CSS 计数器(上)

简介

CSS 计数器不是什么新鲜玩意,早在小智上大学之前就已经出现了,只是比较冷门,开发中不常用到,但是随着 CSS 3 的支持日益增强,结合 CSS 3 的一些新特性,或许 CSS 计数器会迸发出不一样的光芒。

兼容性

CSS 计数器只能跟 content 属性一起使用,而 content 属性只用于 :before / :after 伪元素上,因此IE6、7不支持 CSS 计数器,而其他浏览器支持良好,见下图:

caniuse

技术要点

CSS 计数器的关键是两个属性一个方法。

  1. counter-reset
  2. counter-increment
  3. counter() / counters()

counter-reset 定义计数器的名字,文档流中需要出现在 counter-increment 之前,建议 counter-reset 所在元素为另外两个所在元素的父(祖)元素,原因见 counters() 部分。

counter-increment 使计数器累加。

counter() / counters(),输出计数器当前值。

计数规则

计数器当前值是指,counter-resetcounter() 之间,每出现一个 counter-increment 累加一次,counter() 后面的与此 counter() 无关。请看下面的例子。

/* css */
.container {counter-reset: sum;} /* 定义计数器 */
.item {counter-increment: sum;} /* 累加规则 */
.monitor:after {content: counter(sum);} /* 显示计数器当前值 */
<!-- html -->
<div class="container"> <!-- 当前值:0 -->
	<div class="item"></div> <!-- 当前值:1 -->
	<div class="item"></div> <!-- 当前值:2 -->
	<div class="monitor"></div> <!-- 输出:2 -->
	<div class="item"></div> <!-- 当前值:3 -->
	<div class="item"></div> <!-- 当前值:4 -->
	<div class="item"></div> <!-- 当前值:5 -->
	<div class="monitor"></div> <!-- 输出:5 -->
	<div class="item"></div> <!-- 与前面的 counter() 无关 -->
</div>

counter-reset

counter-reset 的格式如下:

//css
counter-reset: name1 [start1 name2 start2 ... ];
// 中括号里的代码可选(下同)
  • name 定义的计数器名;
  • start 计数器的起始值,默认为0;
  • 可同时定义多个计数器,中间用空格隔开。

counter-increment

counter-increment 的格式如下:

// css
counter-increment: name1 [step1 name2 step2];
  • name 对指定的计数器进行累加;
  • step 每次累加的数值,可为负数;
  • 可同时对多个计数器进行累加,中间用空格隔开。

counter() / counters()

counter()

counter() 的格式如下:

// css
content: counter(name1[, style1]) [counter(name2, style2)]
  • name 显示指定计数器的当前值;
  • style 值的显示样式,与 list-style-type 的取值一样,见下文;
  • 可同时显示多个计数器的当前值,中间用空格隔开。

list-style-type: disc | circle | square | decimal | lower-roman | upper-roman | lower-alpha | upper-alpha | none | armenian | cjk-ideographic | georgian | lower-greek | hebrew | hiragana | hiragana-iroha | katakana | katakana-iroha | lower-latin | upper-latin

counters() 多了一个“s”,但是效果却大相径庭,counters() 是表示嵌套计数,比如“1.1”,格式如下:

// css
content: counters(name1, string1[, style1]) [counters(name2, string2, style2)]
  • namestylecounter() 中相同,不再重复;
  • string 子序号的连接字符串,如 “1.1” 的 string 就是“.”,必须参数;
  • 可同时显示多个计数器的嵌套计数,中间用空格隔开;

对应的 html 结构为 counter-reset 层层嵌套。

// css
.reset { padding-left: 20px; counter-reset: sons;}
.counter:before { content: counters(sons, '-') '. '; counter-increment: sons;}
<!-- html -->
<div class="reset">
    <div class="counter">大爷爷
        <div class="reset">
            <div class="counter">大伯</div>
            <div class="counter">爸爸
                <div class="reset">
                    <div class="counter">大儿子</div>
                    <div class="counter">二儿子</div>
                    <div class="counter">小儿子</div>
                </div>
            </div>
            <div class="counter">三叔</div>
        </div>
    </div>
    <div class="counter">二爷爷</div>
    <div class="counter">三爷爷
        <div class="reset">
            <div class="counter">什么叔</div>
        </div>
    </div>
</div>

嵌套计数

特别注意

  • counters() 所在元素一定要嵌套在 counter-reset 所在元素内,否则会出现计数嵌套错误;
  • 多个计数器时,counter-reset 不要定义在同一个节点上,否则会因为 css 的特性被覆盖而保留一个。

小细节

上面三个关键点,有的用空格隔开,有的用逗号隔开,可能会混淆。

  • 对于 counter-resetcounter-increment,它们是 css 属性,其值用空格隔开;
  • 对于 counter(),它是 content 属性的值,因此 counter()counter() 之间用空格隔开;
  • counter() 本身是方法,其参数写在括号内,用逗号隔开;
  • counters()counter()