天我们一起来看几个有趣的css动画效果,用到的CSS3的知识点
线条围绕着容器转动
运行效果
首先,我们看下运行出来的效果图
实现方式
这个效果并不是直接使用animation来实现的,而是通过clip属性来实现的。外边的蓝色运动的线条实际为一个完整的div,只是通过clip属性裁剪后只剩下上下左右之中的一边
clip属性依据上-右-下-左的顺序,以左上角(0, 0)为标准点进行裁剪,如果传入的参数为auto,则表示不裁剪
实例代码
html部分的代码
css部分的代码
CSS部分代码
CSS实现饼图
在我们画饼图的时候会想到使用Canvas或者SVG,使用CSS我们同样可以模拟出饼图的形状
运行效果
实现方式
首先要使用border-radius属性将div设置为圆角
使用animation-delay属性控制动画效果
实例代码
html部分代码
css部分代码
总结
今天这两个有趣的CSS动画效果,你学会了吗?
篇点题,嘿嘿嘿!
首先来聊聊今日主角:今天在公司,偶然间和同事谈天说地,聊古说今简直就是无shi不欢吧。所以今天咱不玩个人英雄主义,咱来聊一聊规模宏大的HTML通shi,别想太多了是“史真香的史”!
(集翔物镇楼)
前几期我承认都比较黄,所以今天为了改变下大家的胃口,咱来聊聊史。(很带逼格吧)
就在今天和同事聊史的时候偶然间突发奇想,其实每个HTML标签何尝不是一段史记,他们记载着这段HTML代码的兴衰。
所以这期我们先来简单介绍一下HTML标签的基础皇室体系:
角色: 国王本体: 标签本身(例如:<a>,<div>,<span>)
自我介绍:每个朝代虽然都有国王但是每个国王却代表着不同朝代,国王象征着至高权利。
角色: 王后本体: id
自我介绍:每个国王标配一位王后,王后是王朝的另一个代表,虽然可被替换,但是仅此一款。利用自己的小政权(js,css等)辅助国王治理国家。
角色: 王妃本体: class
自我介绍:哪个国王不好色,后宫三千争芳斗艳,一个国王可以有一群的王妃,但总有几位是比较出众的,她们同样可以使用自己的小政权(js,css等)来吸引国王并辅助治理国家,但是权力相对应没有王后大。
角色: 王子本体: style
自我介绍:国王最亲近的人,未来王朝的接班人,俗话说虎毒不食子,style王子是集万千宠爱于一身,他的小政权(css)是最受国王关注的,但是品质优秀的style王子可以为王朝更添风采,而顽劣不堪的则会拖垮整个王朝。虽然说style是王子,但是如果遇到太强势的王后,可能他就被这么雪藏了(比如武则天?慈禧?)又或者说他的国王老爹比较Low撑不到这狗腿子耍威风就垮台了。
角色: 刚正不阿的史官本体: title
自我介绍:为什么在史官前面加了个刚正不阿呢?为人太过正直以致于写出来的史不够浮夸不够拉风,这装逼不到位皇帝老儿肯定不高兴(司马迁:你在说我么~),和css,js这种前卫,会造势的文武官比起来自然就较为不被重视。但他们所写的内容往往是后世人对于这个王朝的标注。
他们的故事是这样发展的
<div id="惠文后" class="芈月" style="display:block" title="" > </div>
Long, long ago有个王朝叫秦国,他们的国王叫秦惠文王(div),话说这国王各种牛逼,秦国一哥,北扫义渠,西平巴蜀,东出函谷,南下商於,为秦统一中国打下坚实基础。业绩这么好后宫也是风生水起,王后惠文后(id)给他生了个胖小子取名叫赢荡(style,很淫荡哦~)日子很幸福,时不时还跟小秘芈月(class)谈谈情说说爱,这生活简直没谁了。赢荡王子天生神力,殷勇善战深得惠文王喜爱,惠文王病逝时将大业传位于其,然而赢荡却因一时好斗与人比举鼎结果脱力被砸死英年早逝。
可能有人会疑惑,一整个王朝耶~,怎么可能就这么点阿猫阿狗的,其他人呢?这个嘛每个王朝都有自己的特色,也有属于自己那个时代的superStar,小编我又不是在写纪传体史书,怎么可能写那么细,再说了就我这半吊子历史水平能把牛逼吹到这已经算不错了。。。。
文章节选自:优聚YOUJ知识手册《HTML后宫秘史》
优聚YOUJ知识共享平台是专为-2到2岁的职场人士打造的学习社区,提供系统化的岗位知识手册,并帮助建立自己的工作知识库。
章出处:趣味CSS3效果挑战小汇总
挑战1: 画一个对话框
要画一个对话框,首先来学习做一个三角形。其实非常的简单。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <style> .triangle{ width: 0; height: 0; border: 50px solid; border-color: #f00 #0f0 #ccc #00f; } </style> </head> <body> <div class="triangle"></div> </body> </html>
出现如下效果:
估计你已经知道border的构成原理,然后只需改一行代码:
// 四个参数对应 :上 右 下 左 border-color: transparent transparent #ccc transparent;
于是就只剩下面的三角形部分啦!
现在来利用三角形技术做对话框:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <style> .dialog { position: relative; margin-top: 50px; margin-left: 50px; padding-left: 20px; width: 300px; line-height: 2; background: lightblue; color: #fff; } .dialog::before { content: ''; position: absolute; border: 8px solid; border-color: transparent lightblue transparent transparent; left: -16px; top: 8px; } </style> </head> <body> <div class="dialog">这是一个对话框鸭!</div> </body> </html>
效果如下:
挑战2: 画一个平行四边形
利用skew特性,第一个参数为x轴倾斜的角度,第二个参数为y轴倾斜的角度。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <style> .parallel { margin-top: 50px; margin-left: 50px; width: 200px; height: 100px; background: lightblue; transform: skew(-20deg, 0); } </style> </head> <body> <div class="parallel"></div> </body> </html>
大家可以自己动手试试。 效果如下:
挑战3: 用一个div画五角星
对于这个五角星而言,我们可以拆分成三个部分,想一想是不是这样?
那我们现在就来实现这三个部分。 对于最上面的三角,我们在第一个部分已经实现了三角形,这个不难。但是下面的两个如何实现呢?
其实也非常的简单,想一想,下面这两个是不是就是一个向上的三角形旋转而来呢?明白了这一点,就可以动手实现啦!
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <style> #star { position: relative; margin: 200px auto; width: 0; height: 0; border-style: solid; border-color: transparent transparent red transparent; border-width: 70px 100px; transform: rotate(35deg); } #star::before { position: absolute; content: ''; width: 0; height: 0; top: -128px; left: -95px; border-style: solid; border-color: transparent transparent red transparent; border-width: 80px 30px; transform: rotate(-35deg); } #star::after { position: absolute; content: ''; width: 0; height: 0; top: -45px; left: -140px; border-style: solid; border-color: transparent transparent red transparent; border-width: 70px 100px; transform: rotate(-70deg); } </style> </head> <body> <div id="star"></div> </body> </html>
效果如下:
你没看错,这就是CSS3的威力!
挑战4: 画一个爱心
看起来好像不容易下手,我们先来分解一下这个心形的结构:
是两个形状相同的部分,对其中一种稍微旋转一下:
现在就来构造这个部分:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <style> .heart { width: 100px; height: 90px; position: relative; margin: 100px auto; } .heart::before { content: ''; position: absolute; width: 50px; height: 90px; background: red; border-radius: 50px 45px 0 0; /* 设置旋转中心 */ transform-origin: 0 100%; transform: rotate(-45deg); } .heart::after { content: ''; position: absolute; width: 50px; height: 90px; top: -35px; left: -35px; background: red; border-radius: 50px 45px 0 0; /* 设置旋转中心 */ transform-origin: 0 100%; transform: rotate(45deg); } </style> </head> <body> <div class="heart"></div> </body> </html>
效果如下:
同样一个div完成了这个效果,是不是非常酷炫呢:)
关注我的头条号,分享更多的技术学习文章,我自己是一名从事了多年开发的web前端老程序员,目前辞职在做自己的web前端私人定制课程,今年年初我花了一个月整理了一份最适合2019年学习的web前端学习干货,各种框架都有整理,送给每一位前端小伙伴,想要获取的可以关注我的头条号并在后台私信我:前端,即可免费获取。
挑战5: 画一个八卦阵
还是来分解它的结构:
按照之前的思路,估计你也有想法了,这个时候依然可以用伪类来画出两个小的圆,那么问题来了,像这种颜色不同的同心圆如何用CSS表达呢?
其实很简单,根据border-radius可以影响padding的形状这一规则,外面的一圈用border来表达,而中间利用白色的背景颜色将padding填满,宽度和高度都可以设为0。
另一个问题是:大圆的效果如何实现? 有两种实现思路,一种是用border-left来表示左边的半圆,右边的半圆利用本身的宽度。 第二种方案其实是从《CSS揭秘》获得的灵感,可以利用linear-gradient颜色渐变的属性来调整。
接下来编码实现:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <style> body{ background-color: #ccc; } /* 大圆部分第一种思路 (注意下面的小圆定位要调整下)*/ /* .bagua{ position: relative; width: 150px; height: 300px; margin: 100px auto; border-radius: 50%; background-color: #fff; border-left: 150px solid #000; } */ /* 大圆部分第二种思路 */ .bagua{ position: relative; width: 300px; height: 300px; margin: 100px auto; border-radius: 50%; background-color: #000; /*从0-50%用背景色,50%开始到100%用#fff */ background-image: linear-gradient(to right, transparent 50%, #fff 50%); } .bagua::before{ content: ''; position: absolute; left: 75px; width: 0; height: 0; padding: 25px; border-radius: 50%; border: 50px solid #000; background: #fff; background-clip: padding-box; } .bagua::after{ content: ''; position: absolute; top: 150px; left: 75px; width: 0; height: 0; padding: 25px; border-radius: 50%; border: 50px solid #fff; background: #000; background-clip: padding-box; } </style> </head> <body> <div class="bagua"></div> </body> </html>
效果如下:
挑战6: 超级棒棒糖
这里直接摆出效果吧:
其中利用了两个CSS3中非常重要的属性————线性渐变和径向渐变。 其中圆形部分利用radial-gradient属性,也就是径向渐变,棒子的颜色利用linear-gradient,之前已经用过,也就是线性渐变。
代码参考如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <style> .linear{ width: 300px; height: 300px; margin: 20px auto; border-radius: 50%; /* 重复性径向渐变 */ background-image: repeating-radial-gradient(red 0px, green 30px, orange 40px); position: relative; } .linear::after{ content: ''; position: absolute; top: 100%; left: 50%; width: 10px; height: 500px; border-radius: 0 0 10px 10px; /* 线性渐变 */ background-image: linear-gradient(to top, red 20%, orange 40%, lightblue 60%, green 80%); } </style> </head> <body> <div class="linear"></div> </body> </html>
挑战7:跳动的字节
相当于是一个loading的效果。其实实现起来是非常简单的,这里直接用animation-delay即可控制五个元素的错落感。直接贴上代码,大家可以参考一下:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>JS Bin</title> <style> .spinner{ margin: 100px auto; width: 50px; height: 50px; text-align: center; font-size: 10px; } .spinner > div{ display: inline-block; background-color: rgb(43, 128, 226); height: 100%; width: 5px; margin-right:1px; animation: bytedance 1s infinite; } .spinner >div:nth-child(2) { background-color: rgb(49, 84, 124); animation-delay: -0.9s; } .spinner >div:nth-child(3) { background-color: rgb(88, 128, 173); animation-delay: -0.8s; } .spinner >div:nth-child(4) { background-color: rgb(88, 128, 173); animation-delay: -0.7s; } .spinner >div:nth-child(5) { background-color: rgb(142, 187, 240); animation-delay: -0.6s; } @keyframes bytedance{ 0%, 40%, 100%{ transform: scaleY(0.4); } 20%{ transform: scaleY(1); } } </style> </head> <body> <div class="spinner"> <div></div> <div></div> <div></div> <div></div> <div></div> </div> </body> </html>
挑战8: 涟漪缓动效果
这里显然可以分解成两个圆,仍然是利用animation-delay来实现错落感。 当一个圆缩小为0的时候,另一圆刚好扩展为最大,依次规律循环。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Loading</title> <style> .spinner{ width: 60px; height: 60px; position: relative; margin: 100px auto; } .spinner > div{ width: 100%; height: 100%; opacity: 0.6; border-radius: 50%; background-color: lightblue; position: absolute; top: 0; left: 0; animation: loading 1.4s infinite ease-in; } .spinner > div:nth-child(2){ animation-delay: -0.7s; } @keyframes loading{ 0%, 100% { transform: scale(0.0); } 50% { transform: scale(1.0); } } </style> </head> <body> <div class="spinner"> <div></div> <div></div> </div> </body> </html>
通过这些有趣的挑战,相信你已经体会到CSS3世界的奇妙了,但是但是,有部分属性并不是所有的浏览器都支持,保守起见,最好在CSS3新特性名之前加上浏览器的前缀,本文侧重效果的实现,兼容这块暂不做处理。
作为前端工程师,平时通常拿CSS做页面布局,甚至有时候会出现很多莫名其妙的bug,于是很多人不太愿意来写CSS,但实际上更多的时候是因为我们了解不够,功夫不到家,才会觉得这个东西不友好,感到不喜欢,当你开始摆脱门外汉的姿态,真正踏进那个广袤的世界,能够对它的各种特点信手拈来,又会情不自禁地爱上这个东西。因此,有时候我们缺少的不是能力,而是一种包容的心态。
*请认真填写需求信息,我们会在24小时内与您取得联系。