内容简介:伪类经常与伪元素混淆,伪元素的效果类似于通过添加一个实际的元素才能达到,而伪类的效果类似于通过添加一个实际的类来达到。实际上css3为了区分两者,已经明确规定了伪类用一个冒号来表示,而伪元素则用两个冒号来表示。伪类与伪元素的本质区别就是是否抽象创造了新元素,具体的类别就不深入,从青铜到王者10个css3伪类使用技巧和运用众所周知,Animate/transition box-shadow 可以使用box-shadow属性来实现盒子阴影效果,但repaint消耗较多,于是这里提出
写在前面
伪类经常与伪元素混淆,伪元素的效果类似于通过添加一个实际的元素才能达到,而伪类的效果类似于通过添加一个实际的类来达到。实际上css3为了区分两者,已经明确规定了伪类用一个冒号来表示,而伪元素则用两个冒号来表示。伪类与伪元素的本质区别就是是否抽象创造了新元素,具体的类别就不深入,从青铜到王者10个css3伪类使用技巧和运用
青铜-1、伪类实现盒子阴影
众所周知,Animate/transition box-shadow 可以使用box-shadow属性来实现盒子阴影效果,但repaint消耗较多,于是这里提出 通过修改伪元素的透明度来实现盒子阴影
实现原理:
通过改变透明度,这样从一个非默认值更新它的值,就不需要承担任何重绘 (参见:https://csstriggers.com/opacity)
这里设置一个空的伪元素设置阴影透明度为0隐藏,再通过鼠标悬停恢复它的透明度下面是传统和伪类实现的代码对比
<div class="before"> <h1>Before</h1> <p>Animate/transition box-shadow 可以使用box-shadow属性来实现盒子阴影效果,但重绘消耗较多</p> </div> <hr /> <div class="after"> <h1>After</h1> <p>通过修改伪元素的透明度来实现同样的效果,没有重绘消耗</p> </div> 复制代码
.before { padding: 1em; background-color: #fff; -webkit-transition: 0.2s; transition: 0.2s; } .before:hover { box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.3); } .after { position: relative; padding: 1em; background-color: #fff; } .after:before { content: ""; position: absolute; top: 0; right: 0; bottom: 0; left: 0; z-index: -1; box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.3); opacity: 0; will-change: opacity; -webkit-transition: 0.2s; transition: 0.2s; } .after:hover:before { opacity: 1; } 复制代码
效果:
青铜-2、伪元素:before实现的面包屑导航栏
<ul class="breadcrumb"> <li><a href="#">Home</a> </li> <li><a href="#">Pictures</a> </li> <li><a href="#">Summer 15</a> </li> <li>Italy</li> </ul> 复制代码
ul.breadcrumb { padding: 8px 16px; list-style: none; background-color: #eee; } ul.breadcrumb li { display: inline; } ul.breadcrumb li+li:before { padding: 8px; color: black; content: "/\00a0"; } ul.breadcrumb li a { color: green; } 复制代码
效果:
青铜-3、伪元素实现悬停时按钮填充和边界浮动动画
效果:(代码见后文链接)
青铜-4、伪类after实现的三角箭头
实现原理:三边设置边框,箭头指向的那个方向的border不用设置,位于箭头两边的边框颜色为透明(transparent),对边为主体边框颜色(较大的)/主体背景颜色(较小的),因为我们要有边框颜色的三角箭头,当第一个箭头(较大的)被第二个箭头(较小的)通过准确覆盖之后剩下没被覆盖的边缘就是合成三角箭头的边框了,其颜色就是较大的那个三角箭头的颜色,可调。而较小的那个三角箭头的颜色要设置成主体颜色,进行负值定位偏移时要把主体边框盖住,从而与主体合在一起了
<div class='container'> <img alt='' src='http://placehold.it/400x200'> <div class='arrow-left'></div> </div> <div class='container new'> <div class='arrow-right'></div> <img alt='' src='http://placehold.it/400x200'> </div> 复制代码
.arrow-left:before { z-index: 9999; content: ""; display: block; width: 0; height: 0; border-top: 20px solid transparent; border-bottom: 20px solid transparent; border-right: 20px solid #E9E9E9; position: absolute; left: -20px; top: 80px; } 复制代码
效果:(完整代码见后文链接)
青铜-5、伪类after实现的图片箭头
效果:(代码见后文链接)
青铜-6、伪元素实现带角度的底部边界(倾斜的边界)
原理:修改webkit-transform: skewY属性来修改倾斜度(旋转也是一样的道理)
.edge--bottom { position: relative; z-index: 1; } .edge--bottom:after { background: inherit; content: ''; display: block; height: 50%; left: 0; position: absolute; right: 0; z-index: -1; } .edge--bottom:after { bottom: 0; -webkit-transform: skewY(-1.5deg); -ms-transform: skewY(-1.5deg); transform: skewY(-1.5deg); -webkit-transform-origin: 100%; -ms-transform-origin: 100%; transform-origin: 100%; } 复制代码
效果:(完整代码见本文结尾链接)
王者-1、伪元素和平移(translate)变换实现的提示框
<div class="row"> <a rel="nofollow" rel="noreferrer" href="#" class="btn tooltip top"> <span>TOOLTIP TOP</span> <span class="tooltip-content">Lorem ipsum dolor sit amet</span> </a> </div> 复制代码
.tooltip .tooltip-content::after { background: #05a8ff; content: ""; height: 10px; position: absolute; -webkit-transform: rotate(45deg); transform: rotate(45deg); width: 10px; } .tooltip.top .tooltip-content { bottom: calc(100% + 1.5em); left: 50%; -webkit-transform: translateX(-50%); transform: translateX(-50%); } .tooltip.top .tooltip-content::after { bottom: -5px; left: 50%; margin-left: -5px; } 复制代码
效果:(完整代码见本文结尾链接)
王者-2、使用CSS3伪元素实现的自动打字动画
原理:Typing Animation with Pseudo-Elements 看起来是打字,其实是使用伪元素覆盖在字符串上,然后逐渐减少伪元素覆盖宽度来实现的视觉效果
<div> <h1>Typing Animation</h1> <p class="tagline"> <span class="tagline-skill"><span class="tagline-skill_inner">webdesign</span></span> </p> </div> 复制代码
.tagline-skill_inner:after { content: ""; position: absolute; top: -1px; right: 0; bottom: -2px; left: 0; border-left: 1px solid #fff; background-color: #2a2a28; -webkit-animation: animatetoright 1s steps(10) infinite alternate; animation: animatetoright 1s steps(10) infinite alternate; } 复制代码
效果:(完整代码见本文结尾链接)
王者-3、CSS3 伪元素构建的文章水印背景
h1 { position: relative; margin: 0; font-weight: bold; letter-spacing: -0.05rem; line-height: 1; text-transform: uppercase; z-index: 10; } h1:before { content: "2018/08"; font-family: monospace; font-size: 10rem; position: absolute; top: 2rem; left: -2rem; z-index: 0; line-height: 1; color: rgba(50, 25, 0, 0.1); } 复制代码
效果:(完整代码见本文结尾链接)
王者-4、CSS3 用伪元素做页码摘要
a { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; -webkit-flex-flow: row nowrap; -ms-flex-flow: row nowrap; flex-flow: row nowrap; -webkit-box-align: baseline; -webkit-align-items: baseline; -ms-flex-align: baseline; align-items: baseline; text-decoration: none; -webkit-transition: color .2s ease-in-out; transition: color .2s ease-in-out; } a::before { height: .1em; -webkit-box-flex: 1; -webkit-flex: 1 1 auto; -ms-flex: 1 1 auto; flex: 1 1 auto; -webkit-box-ordinal-group: 2; -webkit-order: 1; -ms-flex-order: 1; order: 1; background: left bottom/contain repeat-x url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA3IDIiPjxjaXJjbGUgZmlsbD0iI2ZmZiIgY3g9IjMuNSIgY3k9IjEiIHI9IjEiLz48L3N2Zz4=); content: ''; } a::after { -webkit-box-ordinal-group: 3; -webkit-order: 2; -ms-flex-order: 2; order: 2; content: "p." attr(data-page); } 复制代码
效果:(完整代码见本文结尾链接)
王者-5、伪类兼容性了解一下
1、IE8不支持CSS3中很多特性,比如伪元素nth-child,可以使用+号(代表相邻元素)来实现相同功能
2、Google的IE9.js是解决IE5.5到IE8 CSS3特性兼容性问题的JS库。
最后
CSS的世界很美好,每个知识点都可以值得深入研究和实践,对于伪类伪元素也有很多土味可以写出来,上边的10个案例是我个人工作上总结和参考网上资源整理,希望对大家有所帮助,
最后再次附上 github示例源码
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Redux从青铜到王者—概念篇(一)
- 面试中 LRU / LFU 的青铜与王者
- 你的软件工程还在青铜时代?
- 用 mpvue 写个【微博-青铜版】微信小程序
- 青铜选手带你动手撸一个博客小程序给自己(也许是第一期)~(大佬请忽略此条)
- cURL工具的使用技巧
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。