-
Notifications
You must be signed in to change notification settings - Fork 2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
谈谈一些有趣的CSS题目(31)-- 纯 CSS 实现波浪效果! #22
Comments
厉害, 牛X, 佩服!! |
66666 |
awesome |
学习 |
xuexi |
我照这样写可是动画显示不出来耶。是 &:before &:after 的关系吗? |
@Janemon |
@chokcoco |
有帮助,感谢 |
大佬,怎么才能成为国服第二切图仔,还望指点迷津啊 |
@jawil |
我还是把目标降低一点,成为国服第三切图仔,这样就不用从删库到跑路,从跑路到监狱了。 |
正好需要,非常感谢此教程!!!! |
还有这种操作吗? |
学习了 |
厉害厉害 |
不错不错~ |
强👍 |
少年我看你思路清奇,果断加入watch了 |
思路真奇特 |
碉堡了。 |
龟龟,这也太秀了 |
我佛辣 |
css怪 |
CSS真是我学过最难的语言了。手动微笑.jpg |
666,点赞 |
我怎么就没有那种想象力呢( •̥́ ˍ •̀) |
666 |
牛啊 |
邮件已收到!
|
一直以来,使用纯 CSS 实现波浪效果都是十分困难的。
因为实现波浪的曲线需要借助贝塞尔曲线。
而使用纯 CSS 的方式,实现贝塞尔曲线,额,暂时是没有很好的方法。
当然,借助其他力量(SVG、CANVAS),是可以很轻松的完成所谓的波浪效果的,先看看,非 CSS 方式实现的波浪效果。
使用 SVG 实现波浪效果
借助 SVG ,是很容易画出三次贝塞尔曲线的。
看看效果:
代码如下:
CodePen Demo -- SVG Wave
画出三次贝塞尔曲线的核心在于
<path id="wave-2" fill="rgba(154, 205, 50, .8)" d="M 0 100 C 133.633 85.12 51.54 116.327 200 100 A 95 95 0 0 1 0 100 Z">
这一段。感兴趣的可以自行去研究研究。使用 canvas 实现波浪效果
使用 canvas 实现波浪效果的原理与 SVG 一样,都是利用路径绘制出三次贝塞尔曲线并赋予动画效果。
使用 canvas 的话,代码如下:
CodePen Demo -- Canvas Wave
主要是利用了动态绘制
ctx.bezierCurveTo()
三次贝塞尔曲线实现波浪的运动效果,感兴趣的可以自行研究。纯 CSS 实现波浪效果
好,接下来才是本文的重点!使用纯 CSS 的方式,实现波浪的效果。
你 TM 在逗我?刚刚不是还说使用 CSS 无能为力吗?
是,我们没有办法直接绘制出三次贝塞尔曲线,但是我们可以利用一些讨巧的方法,模拟达到波浪运动时的效果,姑且把下面这种方法看作一种奇技淫巧。
原理
原理十分简单,我们都知道,一个正方形,给它添加
border-radius: 50%
,将会得到一个圆形。好的,如果
border-radius
没到 50%,但是接近 50% ,我们会得到一个这样的图形:注意边角,整个图形给人的感觉是有点圆,却不是很圆。额,这不是废话吗
好的,那整这么个图形又有什么用?还能变出波浪来不成?
没错!就是这么神奇。:) 我们让上面这个图形滚动起来(rotate) ,看看效果:
可能很多人看到这里还没懂旋转起来的意图,仔细盯着一边看,是会有类似波浪的起伏效果的。
而我们的目的,就是要借助这个动态变换的起伏动画,模拟制造出类似波浪的效果。
实现
当然,这里看到是全景实现图,所以感觉并不明显,OK,让我们用一个个例子看看具体实现起来能达到什么样的效果。
我们利用上面原理可以做到的一种波浪运动背景效果图:
后面漂浮的波浪效果,其实就是利用了上面的
border-radius: 45%
的椭圆形,只是放大了很多倍,视野之外的图形都overflow: hidden
,只留下了一条边的视野,并且增加了一些相应的transform
变换。代码也很简单,SCSS 代码如下:
CodePen Demo -- Pure Css Wave
可能有部分同学,还存在疑问,OK,那我们把上面的效果缩小 10 倍,将视野之外的动画也补齐,那么其实生成波浪的原理是这样的:
图中的虚线框就是我们实际的视野范围。
值得探讨的点
值得注意的是,要看到,这里我们生成波浪,并不是利用旋转的椭圆本身,而是利用它去切割背景,产生波浪的效果。那为什么不直接使用旋转的椭圆本身模拟波浪效果呢?因为
可以点进去看看下面这个例子:
CodePen Demo -- pure css wave
使用纯 CSS 实现波浪进度图
好,既然掌握了这种方法,下面我们就使用纯 CSS 实现上面最开始使用 SVG 或者 CANVAS 才能实现的波浪进度图。
HTML 结构如下:
CSS 代码如下:
效果图:
CodePen Demo -- Pure Css Wave Loading
虽然效果差了一点点,但是相较于要使用学习成本更高的 SVG 或者 CANVAS,这种纯 CSS 方法无疑可使用的场景更多,学习成本更低!
一些小技巧
单纯的让一个
border-radius
接近 50 的椭圆形旋转,动画效果可能不是那么逼真,我们可以适当的添加一些其他变换因素,让动画效果看上去更真实:border-radius
的值;The text was updated successfully, but these errors were encountered: