前言

在本文中我讲述了7种CSS的特效,它们也许看起来并不惊艳,但是我认为却足够传达本文的理念:编写一些特殊的CSS样式的时候需要不拘于常理,要用特殊的认识角度看待标签和样式属性,从而用「绕个弯」的方式达到效果。

一.浮光掠影

首先我们看第一个实现效果:在鼠标浮动到图片上方时,让一片白影一闪而过。

实现思路

  1. 画一个竖直的长方形的白色div,设置opcity将其变为半透明

  2. 借助transform:skewX将长方形变成等高的平行四边形

  3. 白条div绝对定位,外层div相对定位,一开始left属性默认是0

  4. 在:hover伪元素中修改left值,例如left=600px(超出图片长度),通过transition指定left和时间,形成过渡

图示

HTML

  1. <div class="flash">
  2. <div class="flash-bar"></div>
  3. <img src="{图片地址}" />
  4. </div>

CSS

  1. .flash {
  2. position: relative;
  3. width: 500px;
  4. }
  5. .flash img {
  6. width: 100%;
  7. }
  8. .flash-bar {
  9. position: absolute;
  10. left:-100px;
  11. width: 20px;
  12. height: 100%;
  13. background: #fff;
  14. opacity: 0.5;
  15. transform: skewX(-30deg);
  16. transform-origin: 0 100%;
  17. }
  18. .flash:hover .flash-bar {
  19. left:900px;
  20. transition: left ease-in-out 1s;
  21. }

二.发光球体

实现思路

让一个球体散发光芒,一开始好像有点蒙,但是换个角度思考一下,光芒只是另一种颜色的box-shadow而已,然后我们通过animation让它动起来就好了

HTML

  1. <div class="light"></div>

CSS

  1. @keyframes light {
  2. from {
  3. box-shadow:0px 0px 4px #f00;
  4. }
  5. to {
  6. box-shadow:0px 0px 16px #f00;
  7. }
  8. }
  9. .light {
  10. margin:300px;
  11. width: 100px;
  12. height: 100px;
  13. margin:20px;
  14. border-radius: 50%;
  15. animation: light 2s ease-in-out infinite alternate;
  16. }

三.圆环进度条

很显然,圆框是通过border去实现的,但具体怎么做呢?

这个进度条,表面上看它是由一个div圆框组成,实则不然,它是由左右两个半圆的div组成的,其中一个div转动180度,然后另一个div再转180度。看一下下面的例子你就明白了,我们把颜色调成蓝色和红色,以对比

我们一步一步来解释,首先我们整个圆的外部是一个正方形,左右由两个div,div-left和div-right组成,各占一半,分别放左半圆和右半圆。而且两个div分别设置overflow:hidden实现溢出隐藏,这样的结果是,左边的圆的右半边被隐藏了,右边的圆的左半边被隐藏了。

而且更重要的是,两个因为溢出被隐藏的半圆分别被涂上了蓝色和红色,而没有溢出的两个半圆的圆框则是透明的。所以我们看到的初始的空进度条其实是下面这样的

这两个圆框转动的规则是:

  1. 左边的蓝色圆框先转完0度到180度,这段时间里红色圆框是不动的

  2. 接下来红色圆框转完180度到360度,这段时间里蓝框则是不动的

(备注:我们约定最上方为0/360度)

转到45度角的时候进度条是下面这样子

转角超过180时也是同理的,不过这个时候就轮到红色框转动了,蓝框保持不动

代码如下:

HTML

  1. <div class="progress">
  2. <div class="wrapper-circle left">
  3. <div class="circle"></div>
  4. </div>
  5. <div class="wrapper-circle right">
  6. <div class="circle"></div>
  7. </div>
  8. </div>

CSS

  1. @keyframes left_cirlce_spin {
  2. 0%,50% {
  3. transform: rotate(-45deg);
  4. }
  5. 100%{
  6. transform: rotate(135deg);
  7. }
  8. }
  9. @keyframes right_cirlce_spin {
  10. 0% {
  11. transform: rotate(45deg);
  12. }
  13. 50%,100%{
  14. transform: rotate(225deg);
  15. }
  16. }
  17. .progress {
  18. overflow: hidden;
  19. width: 100px;
  20. height: 100px;
  21. }
  22. .progress .wrapper-circle {
  23. overflow: hidden;
  24. width: 50%;
  25. height: 100%;
  26. }
  27. .left {
  28. float: left;
  29. }
  30. .right {
  31. float: right;
  32. }
  33. .progress {
  34. margin: 20px;
  35. }
  36. .progress .circle {
  37. border-radius: 50%;
  38. width: 90px;
  39. height: 90px;
  40. }
  41. .progress .left .circle {
  42. float: left;
  43. border: 5px solid red;
  44. border-top-color: transparent;
  45. border-left-color: transparent;
  46. animation: left_cirlce_spin 4s linear infinite;
  47. }
  48.  
  49. .progress .right .circle {
  50. float: right;
  51. border: 5px solid red;
  52. border-top-color: transparent;
  53. border-right-color: transparent;
  54. animation: right_cirlce_spin 4s linear infinite;
  55. }

四.三角形

这个话题已经是老生常谈了,我第一个了解的比较有趣的CSS实现就是它。它是通过一个宽高设置为0的div的border去实现的。

要实现三角形,首先我们要改变心里对border形状的刻板认知。border其实是一个等腰梯形而不是长方形

当width和height被减小为0,只有border的时候,border就从等腰梯形变成了等腰三角形:

然后我们需要哪一块三角形,就把剩余的部分border都设为transparent(透明)就可以了

代码很简单,这里就不加赘述了。

五.有色到透明的渐变

下面这张图是从知乎的发现栏目上摘来的,很显然它是利用渐变去实现的。思路也很简单,主要是要有两方面的认知:

    • 这张图其实可以分成两部分,右边控制图形和渐变,左边就是一张纯色背景,和渐变无关

    • 透明transparent也是一种颜色,也是渐变可以设置的

代码如下

HTML

  1. <!-- 有色到透明的背景渐变 -->
  2. <div class="background-gradient">
  3. <div class="mask"></div>
  4. </div>

CSS

  1. .background-gradient {
  2. background: rgb(44, 136, 207);
  3. position: relative;
  4. width: 500px;
  5. height: 200px;
  6. }
  7. .background-gradient .mask {
  8. background-image: linear-gradient(to right, rgb(44, 136, 207), transparent), url("https://pic1.zhimg.co
  9. m/50/v2-6c5aa2304a93b7fbaf903e3560543d7b_hd.jpg");
  10. background-position:center;
  11. background-blend-mode:normal;
  12. position: absolute;
  13. height: 100%;
  14. width: 180px;
  15. right:;
  16. }

六.模糊效果和毛玻璃效果

知乎上,在发表文章或回答时引入链接就会有下面模糊的效果。它其实是由CSS3的filter属性去实现的

  1. <img class="blur" src="https://pic1.zhimg.com/50/v2-6c5aa2304a93b7fbaf903e3560543d7b_hd.jpg" />

CSS

  1. .blur {
  2. width: 100px;
  3. filter: url(blur.svg#blur); /* FireFox, Chrome, Opera */
  4.  
  5. -webkit-filter: blur(2px); /* Chrome, Opera */
  6. -moz-filter: blur(2px);
  7. -ms-filter: blur(2px);
  8. filter: blur(2px);
  9.  
  10. filter: progid:DXImageTransform.Microsoft.Blur(PixelRadius=2, MakeShadow=false); /* IE6~IE9 */
  11. }

效果如下

要注意兼容,兼容各个浏览器的方法如上图所示,顺便一提这份代码由大神张鑫旭提供,链接如下

CSS滤镜让图片模糊(毛玻璃效果)

模糊效果和IOS中的毛玻璃效果还是不一样的。(其实我也感觉毛玻璃效果比起模糊效果会漂亮很多),而IOS的毛玻璃效果可以借助backdrop-filter去实现,链接如下,大家可以自行尝试

backdrop-filter

CSS原生毛玻璃效果

不过注意,目前backdrop-filter在较高版本的浏览器才会支持

七.斜角标签

有的时候,在显示一些时效性的UI数据的时候,例如一个商品卡片的打折标签的时候,我们可能会需要在卡片上显示一个等腰梯形,那么我们该怎么实现呢?

实际上,我们可以通过一个横向的div通过transform:rotate逆时针旋转45度角得到它。如下图所示,同时要注意给外层div设置overflow:hidden实现溢出隐藏。

除此之外,还需要进行简单的计算,因为旋转上去后,形成的是一个等腰直角三角形,所以标签div的长度需要是它距离外层div顶部距离的√2(根号2)倍,如上图所示。

代码如下:

HTML

  1. <div class="label">
  2. <div class="label-bar">打折</div>
  3. <img src="https://pic1.zhimg.com/50/v2-6c5aa2304a93b7fbaf903e3560543d7b_hd.jpg" />
  4. </div>

CSS

  1. .label {
  2. position: relative;
  3. overflow: hidden;
  4. }
  5. .label-bar {
  6. text-align: center;
  7. background: red;
  8. position: absolute;
  9. top:80px;
  10. left: 0px;
  11. width: 141px;
  12. height:20px;
  13. transform-origin: 0 100%;
  14. transform: rotate(-45deg);
  15. }

技术总结

OK,下面进行CSS3的技术(坑点)总结~

1.转换行为(rotate,skew等)的2D坐标系是这样的,Y轴是向下的!原点是div的左上角。根据transform-origin可以设置转换(例如旋转或者倾斜)的参考点,默认的参考点是(50%,50%),即中心。如下图所示

2.改变大小的transform方法scale不接受百分比! 只能是用数字表示倍数,如transform:scale(2),

transform:scale(0.5)等等

3.skewX和skewY在2D参考系里相当于具有倾斜的效果,倾斜时候变成高度不变的平行四边形。但是skewX和skewY具有相反的差异,skewX是X轴方向不动,Y轴方向逆时针倾斜, skewY是Y轴不动,X轴方向向顺时针倾斜,两者连倾斜的方向都是不一样的,具体可以参考

https://link.zhihu.com/?target=http%3A//www.lvyestudy.com/css3/css3_9.5.aspx

4.transition和animation在使用最明显的区别是什么?

  1. transition的使用是很受限制的,而animation非常灵活,在不借助JS的前提下,它只能在CSS的伪元素中起相应的作用,因为transition只能对发生变化的属性起作用,而除了伪元素外,其他元素选择器会出现后面的选择器覆盖前面选择器属性的现象,到最后属性只有一个值,怎么实现过渡呢?当然就不可以了。

  2. 在不借助JS的前提下,transition只能来一遍,而animation可以指定次数:1次,2次或无数次(指定infinite表示无限次数),还可以指定方向(altertive,表示播放结束后倒退播放)

  3. 甚至animation还可以通过百分比指定每一阶段的细节变化,这一点transition就做不到了

本文完

知乎主页和专栏

知乎主页:https://www.zhihu.com/people/peng-hu-wan-56/activities

知乎专栏:  https://zhuanlan.zhihu.com/c_135367198

CSS动效集锦,视觉魔法的碰撞与融合(一)的更多相关文章

  1. CSS动效集锦,视觉魔法的碰撞与融合(二)

    引言 长久以来,我认识到.CSS,是存在极限的.正如曾经替你扛下一切的那个男人,也总有他眼含热泪地拼上一切,却也无法帮你做到的事情,他只能困窘地让你看到他的无能为力,怅然若失. 然后和曾经他成长的时代 ...

  2. CSS特效集锦:视觉魔法的碰撞与融合(二)

    引言 长久以来,我认识到.CSS,是存在极限的.正如曾经替你扛下一切的那个男人,也总有他眼含热泪地拼上一切,却也无法帮你做到的事情,他只能困窘地让你看到他的无能为力,怅然若失. 然后和曾经他成长的时代 ...

  3. CSS动效集锦,视觉魔法的碰撞与融合(三)

    本文讲述的原理和相关demo 扇形DIV的使用——实现雷达扫描图 DIV环形布局—实现loading圈 动画的向量合成—实现抛物线动画 无限滚动动画—实现跑马灯效果 perspective和trans ...

  4. js+css 动效+1的效果

    点击数值 +1 的动效 vue data:{ timer: null,plus:''// 次数 } method:{ animate(plus) { var _this = this; clearIn ...

  5. css动效库animate.css和swiper.js

    animate.css https://daneden.github.io/animate.css/ 学习的文档:http://www.jq22.com/jquery-info819 腾讯团队的JXa ...

  6. 前端必须收藏的CSS3动效库!!!

    现在的网站和App的设计中越来越重视用户体验,而优秀的动效则能使你的应用更具交互性,从而吸引更多用户的使用. 如果你对CSS3中定义动效还不熟练,或希望采用更加简单直接的方式在你的应用中引入动效的话, ...

  7. 【总结】前端必须收藏的CSS3动效库!!!

    现在的网站和App的设计中越来越重视用户体验,而优秀的动效则能使你的应用更具交互性,从而吸引更多用户的使用. 如果你对CSS3中定义动效还不熟练,或希望采用更加简单直接的方式在你的应用中引入动效的话, ...

  8. 前端读者 | 前端用户体验-UI动效设计

    本文来自互联网 @羯瑞 整理 UI动效现如今在 APP 和网页中几乎已经成为了基本的组成部分,经过仔细打磨的 UI动效对于整个界面的提升是显著的. 动效呈现出状态切换的过程,展现了元素之间的逻辑关系, ...

  9. CSS揭秘—打字动效(四)

    前言:     所有实例均来自<CSS揭秘>,该书以平时遇到的疑难杂症为引,提供解决方法,只能说秒极了,再一次刷新了我对CSS的认知 该书只提供了关键CSS代码,虽然有在线示例代码链接,但 ...

随机推荐

  1. vue+element项目中使用el-dialog弹出Tree控件报错问题

    1. 按正常的点击按钮,显示dialog弹出的Tree控件,然后把该条数据下的已经选中的checkbox , 用setCheckedNodes或者setCheckedKeys方法选择上 , 报下面这个 ...

  2. Elasticsearch 技术分析(九):Elasticsearch的使用和原理总结

    前言 之前已经分享过Elasticsearch的使用和原理的知识,由于近期在公司内部做了一次内部分享,所以本篇主要是基于之前的博文的一个总结,希望通过这篇文章能让读者大致了解Elasticsearch ...

  3. 个人永久性免费-Excel催化剂功能第76波-图表序列信息维护

    在之前开发过的图表小功能中,可以让普通用户瞬间拥有高级图表玩家所制作的精美图表,但若将这些示例数据的图表转换为自己实际所要的真实数据过程中,仍然有些困难,此篇推出后,再次拉低图表制作门槛,让真实的数据 ...

  4. 个人永久性免费-Excel催化剂功能第31波-数量金额分组凑数功能,财务表哥表姐最爱

    在财务工作过程中,很大时候需要使用到凑数的需求,花了两三天时间认真研究了一下,本人水平也只能做代码搬运工,在用户体验上作了一下完善.完成了Excel版的凑数功能. 文章出处说明 原文在简书上发表,再同 ...

  5. Y服务-你真的懂 Yaml 吗

    目录 一.什么是 Yaml 二.Yaml 的语法 三.操作 Yaml A. 引入框架 B. 代码片段 C. 完整案例 参考文档 在Java 的世界里,配置的事情都交给了 Properties,要追溯起 ...

  6. [leetcode] 105. Construct Binary Tree from Preorder and Inorder Traversal (Medium)

    原题 题意: 根据先序和中序得到二叉树(假设无重复数字) 思路: 先手写一次转换过程,得到思路. 即从先序中遍历每个元素,(创建一个全局索引,指向当前遍历到的元素)在中序中找到该元素作为当前的root ...

  7. 《ElasticSearch6.x实战教程》之实战ELK日志分析系统、多数据源同步

    第十章-实战:ELK日志分析系统 ElasticSearch.Logstash.Kibana简称ELK系统,主要用于日志的收集与分析. 一个完整的大型分布式系统,会有很多与业务不相关的系统,其中日志系 ...

  8. 脱壳系列_2_IAT加密壳_详细版解法1(含脚本)

    1 查看壳程序信息 使用ExeInfoPe 分析: 发现这个壳的类型没有被识别出来,Vc 6.0倒是识别出来了,Vc 6.0的特征是 入口函数先调用GetVersion() 2 用OD找OEP 拖进O ...

  9. android 基于wifi模块通信开发

    这篇文章主要是我写完手机与wifi模块通信后所用来总结编写过程的文章,下面,我分几点来说一下编写的大概流程. 一.拉出按钮控件并设置它的点击事件 二.设置wifi权限 三.打开和关闭wifi 四.扫描 ...

  10. poj2909 欧拉素数筛选

    刚刚学了一种新的素数筛选法,效率比原先的要高一些,据说当n趋近于无穷大时这个的时间复杂度趋近O(n).本人水平有限,无法证明. 这是道水题,贴代码出来重点是欧拉筛选法.我把原来普通的筛选法贴出来. / ...