使用css 动画实现,水波纹的效果

每日鸡汤:每个你想要学习的瞬间都是未来的你向自己求救

需求,实现水波纹动画效果,要求中心一个圆点,然后有3个圈,一圈一圈的向里面缩小。

说实话我第一个想到了给3个圈设置不同的宽高,然后设置动画0-100%,一次缩小宽高!

但是,我转念一想,我是不是也可以用padding设置,就是给每个圈设定一个padding, 逐渐缩小padding, 貌似也能达到相同的效果。 确实可以,但是无论用哪种方法,要想让动画变得顺滑**,就需要给最外圈设置0-1的透明度的变化,要不然总是会有卡顿的感觉,你可以自己尝试一下加与不加的区别**

1. 使用 padding 实现

动画实现:大圈padding缩到中圈的初始padding(同时不透明度从0-1)、中圈的padding缩到小圈的初始padding,小圈padding缩到0

html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="./dist/bundle.js"></script>
    <style>
      .flex-c {
        display: inline-flex;
        align-items: center;
        justify-content: center;
      }
      .wrapper {
        border: 1px solid red;
        width: 800px;
        height: 800px;
      }
      .center {
        width: 100px;
        height: 100px;
        background: red;
        border-radius: 50%;
      }
      .circle {
        border: 1px solid;
        border-radius: 50%;
      }
      .circle-1 {
        padding: 200px;
        /*最外圈要加一个透明度的变化*/
        border-color: rgba(0, 0, 0, 0);
        animation: animate1 2.5s linear infinite;
      }
      .circle-2 {
        padding: 100px;
        animation: animate2 2.5s linear infinite;
      }
      .circle-3 {
        padding: 50px;
        animation: animate3 2.5s linear infinite;
      }

      @keyframes animate1 {
        0% {
          padding: 200px;
          /*最外圈要加一个透明度的变化*/
          border-color: rgba(0, 0, 0, 0);
        }
        100% {
          padding: 100px;
          /*最外圈要加一个透明度的变化*/
          border-color: rgba(0, 0, 0, 1);
        }
      }

      @keyframes animate2 {
        0% {
          padding: 100px;
        }
        100% {
          padding: 50px;
        }
      }
      @keyframes animate3 {
        0% {
          padding: 50px;
        }
        100% {
          padding: 0px;
        }
      }
    </style>
  </head>
  <body>
    <div class="wrapper flex-c">
      <div class="flex-c circle circle-1">
        <div class="flex-c circle circle-2">
          <div class="flex-c circle circle-3">
            <div class="center flex-c">中心</div>
          </div>
        </div>
      </div>
    </div>
  </body>
</html>

2. 使用宽高实现

动画实现:大圈宽高缩到中圈的初始尺寸(同时不透明度从0-100)、中圈宽高缩到小圈的初始尺寸,小圈缩到中心的尺寸

html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="./dist/bundle.js"></script>
    <style>
      .flex-c {
        display: inline-flex;
        align-items: center;
        justify-content: center;
      }
      .wrapper {
        border: 1px solid rgba(0, 0, 0, 0.5);
        width: 1500px;
        height: 1500px;
        background: #000;
      }
      .center {
        width: 248px;
        height: 248px;
        background: rgba(255, 255, 255, 0.5);
        border-radius: 50%;
        opacity: 0.4;
        color: #fff;
      }
      .circle {
        border: 1px solid rgba(255, 255, 255, 0.5);
        border-radius: 50%;
      }
      .circle-1 {
        width: 1297px;
        height: 1297px;
        animation: animate1 2.5s linear infinite;
      }
      .circle-2 {
        width: 833px;
        height: 833px;
        animation: animate2 2.5s linear infinite;
      }
      .circle-3 {
        width: 503px;
        height: 503px;
        animation: animate3 2.5s linear infinite;
      }

      @keyframes animate1 {
        0% {
          width: 1297px;
          height: 1297px;
          /*最外圈要加一个透明度的变化*/
          border-color: rgba(255, 255, 255, 0);
        }
        100% {
          width: 833px;
          height: 833px;
          /*最外圈要加一个透明度的变化*/
          border-color: rgba(255, 255, 255, 0.6);
        }
      }

      @keyframes animate2 {
        0% {
          width: 833px;
          height: 833px;
        }
        100% {
          width: 503px;
          height: 503px;
        }
      }
      @keyframes animate3 {
        0% {
          width: 503px;
          height: 503px;
        }
        100% {
          width: 248px;
          height: 248px;
        }
      }
    </style>
  </head>
  <body>
    <div class="wrapper flex-c">
      <div class="flex-c circle circle-1">
        <div class="flex-c circle circle-2">
          <div class="flex-c circle circle-3">
            <div class="center flex-c">中心</div>
          </div>
        </div>
      </div>
    </div>
  </body>
</html>
相关推荐
HjhIron1 分钟前
React Router 通关指南:从入门到鉴权,一个项目全搞定
前端
kyson_3 分钟前
如何做一款自适应的数据大屏:`vw/vh`、`rem`、`scale` 应该怎么选?
前端
雪隐7 分钟前
WPF + MVVM 实战系列02-告别 INPC 手写时代,做个体面的现代 WPF 人
前端·后端·c#
肉肉不吃 肉12 分钟前
无渲染组件和组合式函数
前端·javascript·vue.js
未来智慧谷16 分钟前
从 Atlas 关停复盘:AI 应用的三种载体形态怎么选(独立应用 / 浏览器扩展 / 桌面宿主)
前端·人工智能·ai·架构·浏览器
sugar__salt21 分钟前
前端路由技术详解:从传统多页到 React SPA 的完整进化之路
前端·javascript·react.js·前端框架
Canace37 分钟前
Harness Engineering 到底在做什么
前端·人工智能·ai编程
用户842981424181039 分钟前
JS代码压缩实测:可减小体积、提高执行效率!
前端·javascript·后端
snow@li42 分钟前
Vue Axios封装与SpringBoot Payload封装全景关联分析(前后端数据交互底层闭环)
前端·vue.js·spring boot
Csvn1 小时前
🐛 React StrictMode 下 useEffect 执行两次:不是 Bug,是特性
前端