你可能不知道的 CSS 计数器

简介: CSS 里面的伪元素其实是非常好用的,但是经常容易被大家忽略,伪元素里面常用到的 content 属性,可能现在很多人仅仅以为 content 属性的值只支持字符串,除了字符串外常用到的还有 uri、counter ,今天所要介绍的就是 conter(计数器)。

640 (2).png

前言



CSS 里面的伪元素其实是非常好用的,但是经常容易被大家忽略,伪元素里面常用到的 content 属性,可能现在很多人仅仅以为 content 属性的值只支持字符串,除了字符串外常用到的还有 uricounter ,今天所要介绍的就是 conter(计数器)。


先看如下的例子:


640.jpg


<div>
  <h3>桃翁</h3>
  <h3>介绍</h3>
  <h3>css 计数器</h3>
</div>


根据如上的 HTML 你是否有办法不通过 JavaScript ,仅仅用 CSS 在 title 前面增加 Title number: 呢?


CSS 计数器基本概念


如果仅仅增加一个 Title,大家都知道通过伪元素(:before 或者:after),设置 content 为 Title,但是如何自动根据 h3 出现的顺序来展示自动编号可能很多人就不知道了。


自动编号在 CSS 2.1 中是通过两个属性控制的,'counter-increment'[1]'counter-reset'[2]。通过这些属性定义的计数器用于'content’[3]属性的 counter() 和 counters() 函数


初始化计数器


在使用计数器的时候需要先初始化这个计数器,并且设置一个计数器的名字(变量)。下面是例子,title 就是名字,conter-reset 就是用来初始化的,这个属性是必须设置的,否则没办法用计数器。


'counter-reset'[4]属性也含有一列一个或多个计数器,每个后面可以跟一个可选的整数。该整数给定了每次出现该元素时给计数器设置的值,默认为 0


counter-reset: 计数器名称[, 默认值number];           /* 重置计数器成0 */


计数器自增


有了一个计数器的变量后,然后可以让这个变量进行自增:


'counter-increment'[5]属性接受一个或多个计数器名(标识符),每个后面都可以跟一个可选的整数。这个整数表示每次出现该元素时计数器递增几。默认增量是 1,可以接受 0 和负数


counter-increment: 计数器名称[, 增量];      /* 增加计数器值 */


显示计数器


最后就是现实计数器的值,获取计数器的值有两个函数:counter() 和 counters() ,如上面的例子:


content: counter(计数器名称[, 显示的风格]) /* 显示计数器 */


或者


counters(计数器名称, 嵌套时拼接字符串[, 可选的显示风格])


基本使用


学完了基本概念,然后就可以解决上面的问题了。按照步骤来,三步:


  1. 初始化计时器


div {
  counter-reset: title;           /* 重置计数器成0 */
}


  1. 计数器自增


h3:before {
  counter-increment: title;      /* 增加计数器值 */
}


  1. 显示计数器


h3:before {
  content: "Title "counter(title) ": "; /* 显示计数器 */
}


合起来的解决方案如下:


div {
  counter-reset: title;           /* 重置计数器成0 */
}
h3:before {
  counter-increment: title;      /* 增加计数器值 */
  content: "Title "counter(title) ": "; /* 显示计数器 */
}


高级用法


嵌套计数器与作用域


计数器是“自嵌套的(self-nesting)”,如果重置一个位于后代元素或者伪元素中的计数器,会自动创建一个新的计数器实例。这对 HTML 中的列表之类的场景来说很重要,这种场景下,元素自身可以嵌套任意深度,不用为每一层定义唯一命名的计数器


计数器的作用域从文档中具有'counter-reset'[6]该计数器的第一个元素开始,包括该元素的后代、后续兄弟及其后代。


官方套话比较难懂,用大白话说就是设置了 counter-reset ,那么这个元素的的子元素都属于这个作用域下。


想要完全理解作用域,就得把下面这个 图看懂:


640 (1).jpg


上面的这个 HTML 代码,再加上这段 CSS 代码:


OL { counter-reset: item }
LI { display: block }
LI:before {
  counter-increment: item
}


OL 将会创建一个计数器,并且 OL 的所有子级将引用该计数器,如果我们用 item[n]表示"item"计数器的第 n 个实例,用"{"和"}"表示一个作用域的开始和结束,那么上面 HTML 片段将使用标注的计数器。


注意看 2.3.1 的两个元素,由于他们都在 2.3 下面,有两个同名的计数器,那么这两个同名计数器会分别创建实例,所有会得到两个 2.3.1。


如果懂了作用域的关系,接下来就可以通过 counter() 或者 counters() 函数进行展示。


counter


Counter 显示代码如下:


OL { counter-reset: item }
LI { display: block }
LI:before {
  content: counter(item) ". ";
  counter-increment: item
}


效果如下:


640 (3).png


可以看到 counter 只会显示当前作用域下计数器的值,如果要生成嵌套作用域的计数器就得用 counters 函数。


counters


OL { counter-reset: item }
LI { display: block }
LI:before {
  content: counters(item, '.') " ";
  counter-increment: item;
}


640.png


更换格式


在显示计数器部分 counter 和 counters 都有一个可选参数,显示风格,这个显示风格跟 list-style-type[7] 是一样的,比如我们将文章开头的例子拿来举例,默认是 decimal 风格,比如换成字母(type 是 lower-latin)形式,css 如下:


div {
  counter-reset: title;           /* 重置计数器成0 */
}
h3:before {
  counter-increment: title;      /* 增加计数器值 */
  content: "Title "counter(title, lower-latin) ": "; /* 显示计数器 */
}


效果如下,list-style-type 有很多种,甚至还有中文(list-style-type 是 cjk-ideographic)的。


640 (1).png


自定义起始值


起始值订为 5


div {
  counter-reset: title 5;           /*起始值订为 5 */
}
h3:before {
  counter-increment: title;
  content: "Title "counter(title) ": ";
}


640.png


自定义每次递增的值


每次递增的值为 2


div {
  counter-reset: title 5;
}
h3:before {
  counter-increment: title 2;      /* 每次递增的值为 2 */
  content: "Title "counter(title) ": ";
}


640.jpg


使用场景


场景 1:嵌套列表


比如要生成一个文章的大纲:

640 (1).png


场景 2:计算已经勾选的复选框


使用输入框的:checked 伪类,我们可以检查复选框是否被选中,选中的话,我们计数器的数值就会增加。


下面的这个 2 种菜系直接就是可以通过计数器来实现的,不需要使用 js


640 (2).png

场景 3:自动追踪文档条目


当你需要处理一些重复元素的时候,并且你同样想统计他们的数量,那么这个方案会很好用。


640 (3).png


参考文章


  • css 计数器详解[8]


参考资料


[1]

'counter-increment': http://www.ayqy.net/doc/css2-1/generate.html#propdef-counter-increment


[2]

'counter-reset': http://www.ayqy.net/doc/css2-1/generate.html#propdef-counter-reset


[3]

'content’: http://www.ayqy.net/doc/css2-1/generate.html#propdef-content


[4]

'counter-reset': http://www.ayqy.net/doc/css2-1/generate.html#propdef-counter-reset


[5]

'counter-increment': http://www.ayqy.net/doc/css2-1/generate.html#propdef-counter-increment


[6]

'counter-reset': http://www.ayqy.net/doc/css2-1/generate.html#propdef-counter-reset


[7]

list-style-type: https://www.w3school.com.cn/cssref/pr_list-style-type.asp


[8]

css计数器详解: https://www.cnblogs.com/liuxianan/p/css-counters.html

目录
相关文章
|
Web App开发 前端开发 JavaScript
css【详解】—— content属性(含css计数器)
css【详解】—— content属性(含css计数器)
381 3
|
前端开发
编程笔记 html5&css&js 058 css计数器
编程笔记 html5&css&js 058 css计数器
126 1
|
前端开发 算法 语音技术
【正在完善】CSS 计数器详解与巧用
【正在完善】CSS 计数器详解与巧用
279 0
|
存储 前端开发 JavaScript
使用 JavaScript 和 CSS 的简单字符计数器
使用 JavaScript 和 CSS 的简单字符计数器
176 0
|
前端开发
CSS 计数器实现九宫格自动提示超出数量
CSS 计数器实现九宫格自动提示超出数量
CSS 计数器实现九宫格自动提示超出数量
|
前端开发
CSS中的计数器
CSS的规范中,有一个很奇特的特性,支持计数器的功能。   先来看下如何使用:      Place the flour in a large bowl, make a well in the centre and pour in the milk and eggs.
782 0
|
6月前
|
存储 自然语言处理 前端开发
抖音快手小红书虚拟评论截图生成器,模拟对话制作工具,html+js+css
这是一款纯前端实现的多平台虚拟评论生成器,支持抖音、快手、小红书风格,适用于产品演示与UI设计。采用Vanilla JS与Flexbox布局,利用IndexedDB存储数据,CSS Variables切换主题。
|
6月前
|
存储 前端开发 安全
病历单生成器在线制作,病历单生成器app,HTML+CSS+JS恶搞工具
本项目为医疗病历模拟生成器,旨在为医学教学和软件开发测试提供数据支持,严格遵守《医疗机构病历管理规定》。
|
6月前
|
存储 前端开发 JavaScript
仿真银行app下载安装, 银行卡虚拟余额制作app,用html+css+js实现逼真娱乐工具
这是一个简单的银行账户模拟器项目,用于学习前端开发基础。用户可进行存款、取款操作,所有数据存储于浏览器内存中
|
6月前
|
前端开发 容器
处方单图片生成器, 处方单在线制作免费,js+css+html恶搞神器
这是一个电子处方模拟生成系统,使用html2canvas库实现图片导出功能。系统生成的处方单包含多重防伪标识,并明确标注为模拟数据,仅供学习

热门文章

最新文章

  • 1
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
    238
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
    226
  • 3
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
    164
  • 4
    (CSS)使用Flex布局,帮助你快速了解各种基本的Flex布局属性以及帮你让元素快速达到布局中的指定位置!
    133
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
    275
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
    408
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
    177
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
    112
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
    191
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
    262