HTML5技术

纯 CSS 实现波浪效果! - ChokCoco(2)

字号+ 作者:H5之家 来源:H5之家 2017-07-18 16:02 我要评论( )

后面漂浮的波浪效果,其实就是利用了上面的border-radius: 45%的椭圆形,只是放大了很多倍,视野之外的图形都overflow: hidden,只留下了一条边的视野,并且增加了一些相应的transform变换。 注意,这里背景是蓝色

后面漂浮的波浪效果,其实就是利用了上面的 border-radius: 45% 的椭圆形,只是放大了很多倍,视野之外的图形都 overflow: hidden ,只留下了一条边的视野,并且增加了一些相应的 transform 变换。

注意,这里背景是蓝色静止的,运动是白色的椭圆形。

代码也很简单,SCSS 代码如下:

body { position: relative; align-items: center; min-height: 100vh; background-color: rgb(118, 218, 255); overflow: hidden; &:before, &:after { content: ""; position: absolute; left: 50%; min-width: 300vw; min-height: 300vw; background-color: #fff; animation-name: rotate; animation-iteration-count: infinite; animation-timing-function: linear; } &:before { bottom: 15vh; border-radius: 45%; animation-duration: 10s; } &:after { bottom: 12vh; opacity: .5; border-radius: 47%; animation-duration: 10s; } } @keyframes rotate { 0% { transform: translate(-50%, 0) rotateZ(0deg); } 50% { transform: translate(-50%, -2%) rotateZ(180deg); } 100% { transform: translate(-50%, 0%) rotateZ(360deg); } }

为了方便写 DEMO,用到的长度单位是 VW 与 VH,不太了解这两个单位的可以戳这里:vh、vw、vmin、vmax 知多少

可能有部分同学,还存在疑问,OK,那我们把上面的效果缩小 10 倍,将视野之外的动画也补齐,那么其实生成波浪的原理是这样的:

scalewave

图中的虚线框就是我们实际的视野范围。

image

值得探讨的点

值得注意的是,要看到,这里我们生成波浪,并不是利用旋转的椭圆本身,而是利用它去切割背景,产生波浪的效果。那为什么不直接使用旋转的椭圆本身模拟波浪效果呢?因为

  • 中间高,两边低的效果不符合物理学原理,看上去十分别扭;
  • 可以点进去看看下面这个例子:

    CodePen Demo -- pure css wave

     

    使用纯 CSS 实现波浪进度图

    好,既然掌握了这种方法,下面我们就使用纯 CSS 实现上面最开始使用 SVG 或者 CANVAS 才能实现的波浪进度图。

    HTML 结构如下:

    <div> <div></div> </div>

    CSS 代码如下:

    .wave { position: relative; width: 200px; height: 200px; background-color: rgb(118, 218, 255); border-radius: 50%; &::before, &::after{ content: ""; position: absolute; width: 400px; height: 400px; top: 0; left: 50%; background-color: rgba(255, 255, 255, .4); border-radius: 45%; transform: translate(-50%, -70%) rotate(0); animation: rotate 6s linear infinite; z-index: 10; } &::after { border-radius: 47%; background-color: rgba(255, 255, 255, .9); transform: translate(-50%, -70%) rotate(0); animation: rotate 10s linear -5s infinite; z-index: 20; } } @keyframes rotate { 50% { transform: translate(-50%, -73%) rotate(180deg); } 100% { transform: translate(-50%, -70%) rotate(360deg); } }

    效果图:

    waveloading

    CodePen Demo -- Pure Css Wave Loading

    虽然效果差了一点点,但是相较于要使用学习成本更高的 SVG 或者 CANVAS,这种纯 CSS 方法无疑可使用的场景更多,学习成本更低!

     

    一些小技巧

    单纯的让一个 border-radius 接近 50 的椭圆形旋转,动画效果可能不是那么好,我们可以适当的添加一些其他变换因素,让动画效果看上去更真实:

      

    最后

    系列 CSS 文章汇总在我的 Github ,持续更新,欢迎点个 star 订阅收藏。

    好了,本文到此结束,希望对你有帮助 :)

    如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。

     

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • css进行中打点效果 - _/

      css进行中打点效果 - _/

      2017-07-15 14:00

    • 4个小时实现一个HTML5音乐播放器 - Scott丶

      4个小时实现一个HTML5音乐播放器 - Scott丶

      2017-07-09 15:05

    • 每天一个Js小demo之移动端全景图场景实现-全景装修图。主要知识点:css3,旋转角度检测 - catEatBird

      每天一个Js小demo之移动端全景图场景实现-全景装修图。主要知识点:c

      2017-07-06 11:05

    • 实现excel导入导出功能,excel导入数据到页面中,页面数据导出生成excel文件 - 还是盼盼好

      实现excel导入导出功能,excel导入数据到页面中,页面数据导出生成ex

      2017-07-02 13:00

    网友点评
    a