CSS伪元素(content与counter)

2019-04-18 admin

前面介绍过CSS里的::before和::after这两个伪元素,以及content相关的用法,这篇将针对content搭配counter(计数器)进行一些有趣的应用,相信熟练之后搞不好很好玩也说不定。

counter基本用法

在CSS里头,counter是个很有意思的功能,最常见得就是如果我们使用list清单,样式选择decimal十进制,当清单变多的时候数字也会跟着增加,底层貌似就是使用counter来做的,也因为counter所产生的数值并不存在于网页的元素内,所以如果我们要在清单元素之外使用,就必须透过::before或::after的content来实现。

counter最的基本用法一定要有一个父元素和子元素(类似list的原理,使用ul包着li),所以长相会类似下面这段html:

<div>
    <span>钢铁人</span>
    <span>美国队长</span>
    <span>雷神索尔</span>
</div>

在CSS里头,先针对div父元素使用counter-reset:num;进行计数器归零的设置,里面num是计数器累加数值的变数,接着可以在span::before里面看到counter-increment:num;这一段,这段的作用是把num累加上去,预设数值为加1,接着就透过content显示出来。

计数器预设的显示语法为:counter(计数器名称,list-style-type)

div{
  counter-reset:num;
}
span{
  display:block;
}
span::before{
  counter-increment:num; 
  content:counter(num) '. ';
}

图片描述

透过指定一开始counter-reset的起始数值,还有counter-increment累加的间隔数值,就可以做出从某个数值开始或只显示偶数、奇数的效果。

div{
  counter-reset:num 3;
}
span{
  display:block;
}
span::before{
  counter-increment:num 2; 
  content:counter(num) '. ';
}

图片描述

如果要更换数字的样式,也可以透过计数器的第二个设定值list-style-type来更改,下面的例子就是将样式更改为georgian。

div{
  counter-reset:num;
}
span{
  display:block;
}
span::before{
  counter-increment:num; 
  content:counter(num, georgian) '. ';
}

图片描述

counter进阶用法

除了指定单一个变数外,counter也可以同时指定多个变数,例如下面这段HTML,有三个类别在里面,我分别用span、i和b来分类。

<div>
  <span>钢铁人</span>
  <span>美国队长</span>
  <span>雷神索尔</span>
  <i>宙斯盾局</i>
  <i>神鬼局</i>
  <i>神经局</i>
  <b>九头蛇</b>
  <b>九头牛</b>
  <b>九头猪</b>
</div>

CSS一开始counter-reset可以指定多个变数,透过一个空白字元分隔,如果空白字元后面接着数字则是起始值,没有数字预设为0,当这样设定之后,就可以看到不同类别的数字代号就不同。 图片描述

如果遇到了巢状结构,需要一层层的展开(例如:1 > 1.1 > 1.1.1),采用上述的作法可能就会复杂许多,好在counter还提供了另外一个counters的功能,目的就是来解决巢状结构的麻烦事,在开始前可以先看看透过ul和li组合的清单长相:

<ul>
  <li>第一层
    <ul>
      <li>第二层
        <ul>
          <li>第三层</li>
          <li>第三层</li>
          <li>第三层</li>
        </ul>
      </li>
      <li>第二层</li>
      <li>第二层</li>
    </ul>
  </li>
  <li>第一层</li>
  <ul>
    <li>第二层</li>
    <li>第二层</li>
  </ul>
</ul>

传统的清单如果将list-style设为decimal,同样可以具备数字接续的功能,但相对来说要做一些特殊变化就办不到了。

li{
  list-style:decimal;
}

图片描述

透过content和counters的搭配,我们就可以告别预设值的困扰,甚至可以在不使用清单ul和li的状况下,实现和清单一模一样的效果,举例来说,我们纯粹透过div模拟一个清单的长相(状态仍然必须是有父元素和子元素的概念),里面的样式b就等于是ul,样式a就等于是li:

<div class="a">第一层
  <div class="b">
    <div class="a">第二层
      <div class="b">
        <div class="a">第三层</div>
        <div class="a">第三层</div>
        <div class="a">第三层</div>
      </div>
    </div>
    <div class="a">第二层</div>
    <div class="a">第二层</div>
  </div>
</div>
<div class="a">第一层
  <div class="b">
    <div class="a">第二层</div>
    <div class="a">第二层</div>
  </div>
</div>

由于b的外层没有东西,所以一开始要把body和b都进行counter reset的动作,接着透过counters的使用,让计数器的数值可以一个接着一个放进去,如此一来就可以做到原本清单不容易实现的效果了。

counters使用语法:counters(计数器名称,分隔字,list-style-type)

body, .b{
  counter-reset:c;
}
.a::before{
  content:counters(c, ".") ":";
  counter-increment:c; 
}
div{
  margin-left:10px;
}

图片描述 了解原理之后,透过 ::before 和 ::after 的交互应用,就可以做出颇具特色的列表效果。

body, .b{
  counter-reset:c;
}
.a{
  box-sizing:border-box;
  position:relative;
  line-height:40px;
}

.a .a{
  padding-left:30px;
}

.a::after{
  content:'';
  box-sizing:border-box;
  display:inline-block;
  position:absolute;
  z-index:-1;
  top:0;
  left:0;
  width:100%;
  height:40px;
  margin-left:30px;
  box-shadow:inset 0 2px #666;
  background:#eee;
}
.a::before{
  content:counter(c, upper-roman);
  counter-increment:c;
  display:inline-block;
  width:30px;
  height:40px;
  background:#666;
  color:#fff;
  text-align:center;
  margin-right:5px;
}

图片描述

图片描述

[转载]原文链接:https://segmentfault.com/a/1190000018912011

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处。

转载请注明:文章转载自 JavaScript中文网 [https://www.javascriptcn.com]

本文地址:https://www.javascriptcn.com/read-62140.html

文章标题:CSS伪元素(content与counter)

相关文章
Web前端开发与iOS终端开发的异同
毕业之前一直在做前端开发,毕业后就转成做iOS开发,这两者有很多挺有意思的对比,尝试写下我能想到的它们的一些相同点和不同点。 语言 前端和终端作为面向用户端的程序,有个共同特点:需要依赖用户机器的运行环境,所以开发语言基本上是没有选择的,...
2016-01-13
如何编写干净高效的CSS代码
其实CSS的学习并不困难,但在一些较为大型的项目中就显得杂乱无章,变得很难管理,尤其是不同的人编写CSS的风格总会略有不同,从团队合作的层面上来说,就更加难以沟通,所以,我们为此总结了一些如何实现高效整洁的CSS代码原则: 使用Reset但...
2015-11-12
jQuery中DOM树操作之复制元素的方法
本文实例讲述了jQuery中DOM树操作之复制元素的方法。分享给大家供大家参考。具体分析如下: 复制元素 前面提到的操作包括:插人新创建的元素、将元素从文档中的一个位置移动 到另一个位置,以及通过新元素来包装已有的元素。可是,有时候也会用到...
2015-11-13
面试官:谈谈你对 CSS 盒模型的认识?(你确定会?)
题目:谈谈你对 CSS 盒模型的认识 涉及知识点(层层递进): 基本概念:标准模型+ IE模型(区别) CSS如何设置这两种模型 JS如何设置获取盒子模型对应的宽和高 实例题(根据盒模型解释边距重叠) BFC(边距重叠解决方案) 1...
2018-06-09
移动端网页设计经验与心得
智能手机发展确实很迅速,像今年,我的大部分工作就都在移动端网页上。 再往前些年,看到的手机版/移动版网页,限制于浏览器与手机性能,2g网络速度等 网页设计无非是蓝、黑、白,界面单调,并且要尽可能的设计简单。 现在情况就大不相同了,软件上we...
2015-12-23
纯css实现窗户玻璃雨滴逼真效果
这里仅是用CSS技术来演示这样的一个场景,可能并不太实用。然而这是一个探索CSS新功能的最佳机会。可以让你尝试使用一些新特性和新工具。并且逐渐将在工作中实践。在制作窗口雨滴效果,将使用到HAML和Sass。 案例效果 看到上面的效果是不是...
2017-03-29
7个你可能不认识的CSS单位
浼楁墍鍛ㄧ煡CSS鎶€鏈�鎴戜滑铏界劧寰堢啛鎮夛紝鍦ㄤ娇鐢ㄧ殑杩囩▼鍗村緢瀹规槗琚�鍥颁綇锛岃繖璁╂垜浠�鍦ㄦ柊闂�棰樺嚭鐜扮殑鏃跺€欏彉寰楀緢涓嶅埄銆� 闅忕潃web缁х画涓嶆柇鍦板彂灞曪紝瀵逛簬鏂版妧鏈�鏂拌В鍐虫柟妗堢殑瑕佹眰涔熶細涓...
2015-11-11
javascript:;与javascript:void(0)区别
javascript:;直接返回undefined javascript:void(0);要去执行一次表达式“0”,然后返回undefined ...
2017-05-12
js获取数组的最后一个元素
在js里面如何获取一个数组的最后一个元素呢?这里总结了两种方法,有需要的朋友可以看看。 (1)js内置pop方法 pop() 方法用于删除并返回数组的最后一个元素,注意这里在获取了数组的最后一个元素的同时也将原数组的最后一个元素给删除了。如...
2017-03-22
jQuery给多个不同元素添加class样式的方法
本文实例讲述了jQuery给多个不同元素添加class样式的方法。分享给大家供大家参考。具体分析如下: jQuery可以通过addClass()方法给多个不同的html元素同时添加相同的class &lt;!DOCTYPE html&gt;...
2017-03-22
回到顶部