一、挖坟不可耻

说到报数,是否想起了教官的嘹亮口号:“生信4班,立正,稍息,开始1,2,3,4报数!”

其中有这么几个关键点:
1. 班级命名。总不能六脉神剑一指,你,侬,汝来称呼吧~有个称呼,如生信4班,就知道谁的是谁了。
2. 报数规则。1,2,3,4递增报数,还是1,2,1,2报数,让班级的人知道。
3. 开始报数。不发口令,大眼瞪小眼,会乱了秩序。

巧的是,以上3个关键点正好对应CSS计数器的2个属性和1个方法,依次是:
1. counter-reset
2. counter-increment
3. counter()/counters()

依次说来。
1. counter-reset
顾名思意,就是“计数器-重置”的意思。其实就是“班级命名”,主要作用就是给计数器起个名字。如果可能,顺便告诉下从哪个数字开始计数。默认是0, 注意,默认是0而不是1. 可能有同学回疑惑,尼玛网上的各种例子默认显示的第1个数字不都是1吗?那是因为受了counter-increment普照的影响,后面会详细讲解。

OK, 这里,我们先看两个简单的counter-reset的例子:

.xxx { counter-reset: small-apple; } /* 计数器名称是'small-apple' */
.xxx { counter-reset: small-apple 2; } /* 计数器名称是'small-apple', 并且默认起始值是2 */

闻名不如见面,您可以狠狠地点击这里:counter-reset值为2简单demo

counter-reset的计数重置可以是负数,例如-2。也可以写成小数,例如2.99,不过就是IE和FireFox都不识别,认为是不合法数值,直接无视,当作默认值0来处理;不过Chrome不嫌贫嫉富,任何小数都是向下取整,如2.99当成2处理,于是王小二还是那个王小二。

到此为止?非也非也!counter-reset还有一手,就是多个计数器同时命名。例如,王小二和王小三同时登台:

.xxx { counter-reset: wangxiaoer 2 wangxiaosan 3; }

直接空格分隔,譬如逗号什么的都不行。

闻名不如见面,您可以狠狠地点击这里:两个技术名称并存demo

另外,counter-reset还可以设置为noneinherit. 干掉重置以及继承重置。你懂的,就不展开了。

2. counter-increment
顾名思意,就是“计数器-递增”的意思。值为counter-reset的1个或多个关键字。后面可以跟随数字,表示每次计数的变化值。如果缺省,则使用默认变化值1(方便起见,下面的都使用默认值做说明)。

CSS的计数器的计数是有一套规则的,我将之形象地称为“普照规则”。具体来讲就是:普照源(counter-reset)唯一,每普照(counter-increment)1次,普照源增加1次计数值。

于是,我们可以解释上面提到的“默认值是0”的问题。通常CSS计数器应用的时候,我们都会使用counter-increment, 肯定要用这个,否则怎么递增呢!而且一般都是1次普照,正好+1,第一个计数的值就是1啦(0+1=1)!

下面,通过几个例子,给大家形象地展示下普照规则

 您可以狠狠地点击这里:王小二counter-increment普照成王小三demo

demo中,王小二的counter-reset值是wangxiaoer 2,但是,显示的计数不是小2而是小3,王小二变成了王小三!

Demo相关核心代码为:

.counter { counter-reset: wangxiaoer 2; counter-increment: wangxiaoer; }
.counter:before { content: counter(wangxiaoer); }
<p class="counter"></p>

这里counter-increment普照了p标签,counter-reset值增加,默认递增1,于是计数从设置的初始值2变成了3wangxiaoer就是这里的计数器,自然伪元素content值counter(wangxiaoer)就是3.

 当然,也可以普照自身,也就是counter-increment直接设置在伪元素上:

.counter { counter-reset: wangxiaoer 2; }
.counter:before { content: counter(wangxiaoer); counter-increment: wangxiaoer; }
<p class="counter"></p>

依然是1次普照,依旧全局的计数器+1,所以,显示的数值还是3(demo略).

 趁热打铁。如果父元素和子元素都被counter-increment普照1遍,结果会如何呢?

很简单的,父元素1次普照,子元素1次普照,共两次普照,counter-reset设置的计数器值增加2次,计数起始值是2,于是现实的数字就是4啦!

您可以狠狠地点击这里:counter-increment父子连续普照demo

Demo相关核心代码为:

.counter { counter-reset: wangxiaoer 2; counter-increment: wangxiaoer; }
.counter:before { content: counter(wangxiaoer); counter-increment: wangxiaoer; }
<p class="counter"></p>    // 显示的是4

总而言之,无论位置在何方,只要有counter-increment,对应的计数器的值就会变化,counter()只是输出而已!

 理解了“普照规则”,则以我们通常的计数器递增效果也可以理解了。

考虑下面这两个问题:

  1. 爸爸受到普照,且重置默认值0,爸爸有2个孩子。孩子自身都没有普照。两个孩子的计数值是?
  2. 爸爸没有普照,重置默认值0,爸爸有2个孩子。孩子自身都接受普照。两个孩子的计数值是?

答案是:1,1和1,2!

哦?答案居然不一样,有什么差别呢?

很简单。什么爸爸,孩子你都不要关心。只要看被普照了几次。情况1就爸爸被普照,因此,计数器增加1次,此时两个孩子的counter自然都是1; 情况2,两个孩子被普照,普照2次,第1个孩子普照之时,计数器+1,也就是1;第2个孩子普照之时再+1,于是就是2. 于是,两个孩子的counter输出就是1,2.

您可以狠狠地点击这里:兄弟递增规则演示demo

上demo对应上面的第2个问题,其结果截图如下:

核心代码如下:

.counter { counter-reset: wangxiaoer 2; }
.counter:before,
.counter:after { content: counter(wangxiaoer); counter-increment: wangxiaoer; }
<p class="counter"></p>

计数器的数值变化遵循HTML渲染顺序,遇到一个increment计数器就变化,什么时候counter输出就输出此时的计数值。看懂了下图,您自然就会全然明白“普照规则”了。

如果上图看不明白,您可以狠狠地点击这里查看HTML与CSS源代码,感受下increment即递增的“普照规则”。

counter-increment其他设定
 counter-reset可以一次命名两个计数器名称,counter-increment自然有与之呼应的设定,也是名称留空就可以了。

您可以狠狠地点击这里:counter-increment多名称同时应用demo

 正如本节开始提到的,这变化的值不一定是1,我们可以灵活设置。例如:

counter-increment: counter 2

那就是偶数偶数的增加。例如下面这个变身:

还可以是负数,例如:

counter-increment: counter -1

就有了递减排序效果啦!

 值还可以是none或者inherit.

3. counter()/counters()
这是个方法,不是属性。类似CSS3中才calc()计算。这里作用很单纯显示计数。不过名称、用法有多个:

 目前为止,我们看到的是最简单的用法:

counter(name) /* name就是counter-reset的名称 */

 那下面这个语法是什么意思呢?

counter(name, style)

这里的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

闻名不如见面。您可以狠狠地点击这里:CSS计数器counter()方法style参数demo

结果见下截图:

核心CSS代码为:

content: counter(wangxiaoer, lower-roman); /* 以小写罗马数字格式表示当前计数器wangxiaoer的值 */

 counter还支持级联。也就是一个content属性值可以有多个counter()方法。

闻名不如见面。您可以狠狠地点击这里:多个counter级联并存demo

核心CSS/HTML如下:

.counter { counter-reset: wangxiaoer 2 wangxiaosan 3; }
.counter:before { content: counter(wangxiaoer) '\A' counter(wangxiaosan); white-space: pre; }
<p class="counter"></p>

上面CSS源代码使用'\A'使用inline水平元素换行,此技术若有兴趣,可参考之前的“使用CSS(Unicode字符)让inline水平元素换行”一文。

 下面介绍下counters()方法。看似值多了个字母s, 但表意大变身。counters几乎可以说是嵌套计数的代名词。

我们平时的序号,不可能就只是1,2,3,4,.., 还会有诸如 1.1,1.2,1.3,...等的子序号。得,前者就是counter()干的事情,后者就是counters()干的事情。

基本用法为:

counters(name, string); /* MDN上说,要想IE8兼容,这里逗号后面的空格要去掉,但是鄙人IE11的IE8模式看,无此问题 */

其中,string参数为字符串(需要引号包围的)(必须参数),表示子序号的连接字符串。例如1.1string就是'.'1-1就是'-'.

看上去很简单。但是,如果理解不是很深刻,日后在使用肯定会遇到麻烦——“咦?怎么没有子序列,明明语法正确的啊?”首先,记住这一句话,“普照源是唯一的”,所以,如果你在只在body标签上设置counter-reset,就算里面的子元素嵌套了祖宗十八代,还是不会有任何嵌套序号出现的!所以,要想实现嵌套,必须让每一个列表容器拥有一个“普照源”,通过子辈对父辈的counter-reset重置、配合counters()方法才能实现计数嵌套效果。

闻名不如见面。您可以狠狠地点击这里:CSS计数器内嵌demo

也会遇到这样的麻烦——“咦,怎么子序列不按层级顺序来啊,命名语法正确啊?” 还是要记住这一句话:“一个容器里的普照源(reset)是唯一的”,所以,如果你不小心把计数显示和技术reset元素以兄弟元素形式放在一起(虽然HTML内容布局呈现是没有异常的),就很可能会出现计数序号乱入的情况。

闻名不如见面。您可以狠狠地点击这里:CSS计数器counters列表被reset乱入demo

会看到标红的部分的序号显示异常了!

为何会出现这个问题,我们看下HTML(主要是注释):

<div class="reset"><div class="counter">我是王小二</div><div class="reset"><-- 这里的reset与上面的counter是兄弟关系,而不是父子关系。虽然布局渲染上没有差异。但是,一个容器的reset的唯一的,一旦子元素出现reset,会改变整个容器的嵌套关系,于是,后面的“王小三”、“王小四”其实已经进入了2级嵌套,因此显示的是1-3和1-4 -->...</div><div class="counter">我是王小三</div><div class="counter">我是王小四</div><div class="reset"><div class="counter">我是王小四的大儿子</div></div>
</div>

如果上面的注释没看明白,您可以跟前面没有问题的demo做下HTML结构对比,或许就会豁然开朗!

 counters()也是支持style自定义递增形式的。

counters(name, string, style)

counter()style参数使用一致,不赘述。

四、CSS计数器与display:none挖挖挖

一个元素,如果设置了counter-increment, 但是其display的属性值是none或者含有hidden属性(针对支持浏览器),则此计数值是不会增加的。而visibility:hidden以及其他声明不会有此现象。

五、CSS计数器实际应用挖挖挖

相比传统的ol,ul列表计数,CSS计数器的优势就在于灵活与强大,不足就是IE6/IE7不支持。

普照规则第一条,普照源唯一。所以,我们可以在头尾放两个差距甚远的列表,然后,这些列表自动显示序号。而ol/ul只能写死start实现,很不灵活,一旦列表有删减,就嗝屁了。

由于计数器是伪元素控制显示的。因此,我们几乎可以应用各种CSS样式,各种定位等。所以,基本上,只要有有序序号呈现的地方,就能使用CSS计数器。

例如,电商首页的图片slide广告上的1,2,3,4,...序号;

我们做分享时候使用的HTML5 web在线幻灯片就可以使用CSS计数器标注页数等;以及一开始给小伙伴们做的果汁工具的3个选择等。

我下笔之初本想搞几个高保真的例子的,写到这里发现,内容已经很多了。一篇技术文章,如果读了2分钟,发现才读了一半,后面的内容就会闪电过,然后会有些莫名的评论之类。因此,文章不易过长。所以,这里就要收尾了!

六、最后的挖掘总结

CSS计数器的斗量果然很深啊。如果不静心思考,会陷入很多想当然的误区。如果不全面学习,也无法感受到CSS计数器的强大潜力所在。就我自己而言,着实挖到大宝贝了。不知在座的诸位的挖掘成果如何呢?

行文匆忙,疏漏难免,若有错误,欢迎指正;欢迎沟通欢迎交流,更欢迎在仔细阅读本文后对一些技术观点发起挑战!

参考文章

  • Automatic Numbering With CSS Counters
  • http://www.w3.org/TR/CSS2/generate.html#scope
  • counter-reset
  • counter-increment
  • Using CSS counters

CSS counter计数器(content目录序号自动递增)详解相关推荐

  1. CSS计数器(序列数字字符自动递增)详解———张鑫旭

    by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.com/wordpress/?p=4303 一.挖坟不可 ...

  2. Infopath重复节和重复表中实现序号自动递增的方法

    今天来讲讲Infopath重复节和重复表中实现序号自动递增的方法先来看看效果图 其实操作很简单,重复节和重复表的做法是一样的在这里我就拿重复节为说.首先我们设置一个文本框控件对应报销单编号控件给文本框 ...

  3. MySQL目录结构以及配置文件详解

    昨天给大家进行了数据库介绍,今天将正式带领大家进入我们的课题MySQL讲解部分,首先给大家介绍一下MySQL安装后的目录结构和配置文件详解. 一.MySQL的目录结构 1.bin目录 用于放置一些可执 ...

  4. db2数据备份到mysql_DB2数据库自动备份详解

    DB2数据库自动备份详解 由脱机备份转换为联机备份: 在db2CMD下执行 1.连接需要备份的数据库:db2 connect to数据库名称 2.修改自动数据库备份(AUTO_DB_BACKUP)参数 ...

  5. html怎么添加积分系统,CSS动画实现领积分效果的思路详解

    最近项目中要做一个领积分的效果,根据老板的描述,这个效果类似于支付宝蚂蚁森林里的领取能量.整体效果是就是在树周围飘着几个积分元素,上下滑动,类似星星闪烁,点击领取后,沿着树中心的位置滑动并消失,树上的 ...

  6. linux文件目录:Linux中各目录(文件夹)作用详解(持续更新)

    进入Linux系统,我们就是畅游在各种目录文件中,毕竟Linux是"文件系统",文件的存放就是在目录下面,那我们了解下"Linux中各目录(文件夹)作用详解"还 ...

  7. linux如何切换到光盘,怎么刻录cd光盘-Linux切换目录之cd命令详解

    请关注本头条号,每天坚持更新原创干货技术文章. 如需学习视频,请在微信搜索公众号"智传网优"直接开始自助视频学习 1. 前言 在Linux cd(切换目录)命令是最重要和最广泛使用 ...

  8. 激光雷达与自动驾驶详解

    激光雷达与自动驾驶详解 参考文献链接 https://mp.weixin.qq.com/s/Gk4JJZapKHXZE2AjliR8_A https://mp.weixin.qq.com/s/8xkd ...

  9. linux 查找目录或文件 (详解)

    linux 查找目录或文件  (详解) 查找目录:find /(查找范围) -name '查找关键字' -type d 查找文件:find /(查找范围) -name 查找关键字 -print 如果需 ...

最新文章

  1. 编写程序记录文件位置
  2. 单片机红外通信c语言,基于C语言的计算机与多单片机红外无线串口通信的实现.doc...
  3. 使用numpy实现神经网络模块
  4. RHEL5实现YUM本地源的配置
  5. vue ts 设置tslint提示_Typescript在Vue中的实践
  6. python添加音乐_python给视频添加背景音乐并改变音量的具体方法
  7. 塞班系统 微信 服务器忙,微信QQ遭停用,塞班系统部分机型彻底不能登陆
  8. STC89C52RC烧录程序
  9. 产品需求分析流程图怎么做?软件我都帮你找了
  10. img 标签如何使图片成为圆形
  11. 计算机音乐数字乐谱青芒,弱水三千(戏腔付)
  12. 点量云流化技术在云游戏和虚拟仿真教学中有啥优势?
  13. 利用OpenCV识别图片背景是否透明
  14. PostgreSQL 用户和角色管理
  15. NGUI动态字体的制作
  16. 快手小店违约金不交上征信吗?需要多少保证金?
  17. Linux 文件管理 : patch 命令详解
  18. 数字逻辑手写实验报告
  19. 彭光哲:10月19日黄金亚洲时段上涨12美元是否意味着多头来临?
  20. OFDM系统同步技术的matlab仿真,包括符号定时同步,采样钟同步,频偏估计

热门文章

  1. C#(Csharp)环境配置
  2. Pivotal的数字转型经:授之于鱼不如授之于渔
  3. WCDMA的高速引擎 细解HSDPA技术(转)
  4. Java国际化编程之中英文切换
  5. 1110 区块反转 分数 25
  6. flash特效原理:CoverFlow 效果
  7. 创意无限,国外PS神作【转载】
  8. vlookup 函数使用方法
  9. 3d max 2008 试用版下载
  10. python写所有大写、小写、大小写、字母