想知道迅雷官网的波纹效果咋实现的

新手上路,请多包涵
阅读 2.1k
3 个回答

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>CSS实战 - 波纹扩散效果</title>
    <link rel="stylesheet" href="https://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.min.css">
    <link rel="stylesheet" href="https://cdn.bootcss.com/font-awesome/4.7.0/fonts/fontawesome-webfont.svg">
 
    <style type="text/css">
        body {
            margin: 0;
        }
 
        .container {  
            position: absolute;
            top: 30%;
            left: 30%;
            width: 40%;  
            height: 40%;
        } 
 
        .spliter {
            width: 100%;
            height: 20px;
        }
 
        /************以下为具体实现************/
 
        .wave {
            position: relative;
            width: 100px;
            height: 100px;
            text-align: center;
            line-height: 100px;
            font-size: 28px;
        }
 
        .wave .circle {
            position: absolute;
            border-radius: 50%;
            opacity: 0;
        }
 
        /* 波纹效果 */
        .wave.ripple .circle {
            width: calc(100% - 6px); /* 减去边框的大小 */
            height: calc(100% - 6px);/* 减去边框的大小 */
            border: 3px solid #fff;
        }
 
        .wave.ripple .circle:first-child {
            animation: circle-opacity 2s infinite;
        }
 
        .wave.ripple .circle:nth-child(2) {
            animation: circle-opacity 2s infinite;
            animation-delay: .3s;
        }
 
        .wave.ripple .circle:nth-child(3) {
             animation: circle-opacity 2s infinite;
            animation-delay: .6s;
        }
 
        .wave.ripple.danger {
            color: red;
        }
 
        .wave.ripple.danger .circle {
            border-color: red;
        }
 
        .wave.ripple.warning {
            color: orange;
        }
 
        .wave.ripple.warning .circle {
            border-color: orange;
        }
 
        /* 波动效果 */
        .wave.solid .circle{
            width: 100%;
            height: 100%;
            background: #fff;
        }
 
        .wave.solid .circle:first-child {
            animation: circle-opacity 2s infinite;
        }
 
        .wave.solid.danger {
            color: red;
        }
 
        .wave.solid.danger .circle{
            background: red;
        }
        
        .wave.solid.warning {
            color: orange;
        }
 
        .wave.solid.warning .circle{
            background: orange;
        }
 
        @keyframes circle-opacity{
            from {
                opacity: 1;
                transform: scale(0);
            }
            to {
                opacity: 0;
                transform: scale(1);
            }
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="wave ripple danger">
            <div class="circle"></div>
            <div class="circle"></div>
            <div class="circle"></div>
            <div class="content">
                <i class="fa fa-bell"></i>
            </div>
        </div>
 
        <div class="spliter"></div>
 
        <div class="wave solid warning">
            <div class="circle"></div>
            <div class="content">
                <i class="fa fa-bell"></i>
            </div>
        </div>
    </div>
</body>
</html>

它是用的 canvas,所以每个网格图像其实都是用 JavaScript 画出来的了,这样做大概是为了省尺寸,否则那些图片都可以用 gif 或者 webp 来代替的。
背景的景观应该是用 webGL 渲染的 3D 盒子,这个随便找个游戏引擎应该都可以做到。

使用css3的动画
像这个是有一个静态的轨道和动起来的图片,让图片旋转起来即可
可以研究下css的animation属性,有很多运动方式的
image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题