• 技术文章 >web前端 >css教程

    如何使用CSS和D3实现光斑粒子交相辉映的效果 (附源码)

    不言不言2018-09-20 16:28:54原创1688
    本篇文章给大家带来的内容是关于如何使用CSS和D3实现光斑粒子交相辉映的效果 (附源码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

    效果预览

    981403899-5ba2d8eea4413_articlex.gif


    源代码下载

    每日前端实战系列的全部源代码请从 github 下载:

    https://github.com/comehope/front-end-daily-challenges

    代码解读

    定义 dom,容器中包含 3 个子元素:

    <div class='container'>
        <span></span>
        <span></span>
        <span></span>
    </div>

    设置页面背景:

    body {
        margin: 0;
        width: 100vw;
        height: 100vh;
        background: radial-gradient(circle at center, #222, black 20%);
    }

    定义容器尺寸:

    .container {
        width: 100%;
        height: 100%;
    }

    设置光斑的样式,其中定义了偏亮和偏暗的 2 个颜色变量:

    .container {
        position: relative;
    }
    
    .container span {
        --bright-color: #d4ff00;
        --dark-color: #e1ff4d;
        position: absolute;
        width: 30px;
        height: 30px;
        margin-left: -15px;
        margin-top: -15px;
        background: radial-gradient(var(--bright-color), var(--dark-color));
        border-radius: 50%;
        box-shadow: 0 0 25px 3px var(--dark-color);
    }

    把光斑定位到页面中心:

    .container span {
        transform: translateX(50vw) translateY(50vh);
    }

    增加光斑从中心向四周扩散和收缩的动画效果:

    .container span {
        animation: animate 1.5s infinite alternate;
        animation-delay: calc(var(--n) * 0.015s);
    }
    
    @keyframes animate {
        80% {
            filter: opacity(1);
        }
    
        100% {
            transform: translateX(calc(var(--x) * 1vw)) translateY(calc(var(--y) * 1vh));
            filter: opacity(0);
        }
    }

    定义动画中用到的变量 --x--y--n

    .container span:nth-child(1) {
        --x: 20;
        --y: 30;
        --n: 1;
        
    }
    
    .container span:nth-child(2) {
        --x: 60;
        --y: 80;
        --n: 2;
    }
    
    .container span:nth-child(3) {
        --x: 10;
        --y: 90;
        --n: 3;
    }

    设置容器的景深,使光斑的运动有从远到近的感觉:

    .container {
        perspective: 500px;
    }
    
    .container span {
        transform: translateX(50vw) translateY(50vh) translateZ(-1000px);
    }

    至此,少量元素的动画效果完成,接下来用 d3 批量创建 dom 元素和 css 变量。
    引入 d3 库,同时删除 html 文件中的子元素和 css 文件中的子元素变量:

    <script src="https://d3js.org/d3.v5.min.js"></script>

    定义光斑粒子数量:

    const COUNT = 3;

    批量创建 dom 元素:

    d3.select('.container')
        .selectAll('span')
        .data(d3.range(COUNT))
        .enter()
        .append('span');

    为 dom 元素设置 --x--y--n 的值,其中 --x--y 是 1 到 99 的随机数:

    d3.select('.container')
        /* 略 */
        .style('--x', () => d3.randomUniform(1, 99)())
        .style('--y', () => d3.randomUniform(1, 99)())
        .style('--n', d => d);

    再为 dom 元素设置 --bright-color--dark-color 的值:

    d3.select('.container')
        /* 略 */
        .style('--dark-color', (d) => d3.color(`hsl(${70 + d * 0.1}, 100%, 50%)`))
        .style('--bright-color', (d) => d3.color(`hsl(${70 + d * 0.1}, 100%, 50%)`).brighter(0.15));

    最后,把光斑粒子数量设置为 200 个:

    const COUNT = 200;

    大功告成!

    以上就是如何使用CSS和D3实现光斑粒子交相辉映的效果 (附源码)的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:CSS页面布局常用知识汇总(超链接样式) 下一篇:CSS页面布局常用知识汇总(列表样式)
    Web大前端开发直播班

    相关文章推荐

    • 如何使用CSS和D3实现无尽六边形空间的效果• 如何使用CSS和D3实现用文字组成的心形动画效果(附代码)• 如何使用CSS和D3实现一组彩灯(附代码)• 如何使用CSS和D3实现小鱼游动的交互动画(附代码)• 如何使用CSS和D3和GSAP实现横条 loader (附源码)

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网