JS特效三:波纹小球(绝对炫酷!)

JS特效三:波纹小球(绝对炫酷!)

今天来讲一个JS的特效,主要用到的是定时器选择器,也算是一个比较基础的但同时也是效果很炫的一个特效。老规矩,先来看看效果!

样式效果

1.这是一开始的时候
JS特效三:波纹小球(绝对炫酷!)

2.鼠标点击一个小球
JS特效三:波纹小球(绝对炫酷!)

3.随着时间慢慢变化
JS特效三:波纹小球(绝对炫酷!)

4.像波纹一样的传播
JS特效三:波纹小球(绝对炫酷!)

5.后续的小球会慢慢变小
JS特效三:波纹小球(绝对炫酷!)

视频还没过审核,过了我会发在评论区。

设计思路

1.首先是先用js生成一个15行15列的div矩阵,并添加到父级container中,然后设置小div的margin: 8px;border-radius: 50%;,让这些小的div呈现为圆形,并且有一定的间距。

2.css样式也是通过js控制的,js代码里写的很详细。其中transition: transform 0.3s linear;transform: scale(2);要说一下,第一个是让这些小球线性变化,第二个属性是让小球变大为之前小球的两倍。

3.将15行15列的小球存为一个二维数组,然后遍历添加点击事件

4.最后设置点击小秋后,当前小球先变大,然后延时0.1秒周围小球开始变大(变大的过程为0.3秒),然后延时0.3秒还原周围的小球的大小。

最后附上代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link rel="stylesheet" href="style.css" />
    <title>波纹小球</title>
</head>

<body>
    <h3>点击下方小球</h3>
    <div id="container" class="container"></div>

    <script src="main.js"></script>
</body>

</html>
* {
    box-sizing: border-box;
}

body {
    background-color: #333;
    color: #fff;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    /* 100vh就是全部的view的高度,也就是网页的全部高度 */
    height: 100vh;
    margin: 0;
}

h3 {
    color: #fff;
    letter-spacing: 1px;
}

.container {
    display: flex;
    align-items: center;
    justify-content: center;
    /* 设置子级div不换行 */
    flex-wrap: wrap;
    width: 450px;
}

.circle {
    background-color: #fff;
    /* 设置圆角,就是成了一个圆形 */
    border-radius: 50%;
    cursor: pointer;
    margin: 8px;
    height: 14px;
    width: 14px;
    transition: transform 0.3s linear;
}


/* 变大两倍 */

.circle.grow {
    transform: scale(2);
}
// 获取节点
const container = document.getElementById("container");
const circlesArr = [];
// 行和列
let rows = 15;
let cols = 15;

// for循环创建所有的小球,并push到circlesArr保存
for (let i = 0; i < cols; i++) {
    circlesArr[i] = [];
    for (let j = 0; j < rows; j++) {
        // 生成子元素div
        const circle = document.createElement("div");
        // 添加class属性circle
        circle.classList.add("circle");
        // 将div添加到container中
        container.appendChild(circle);
        // 将div添加到数组中
        circlesArr[i].push(circle);
    }
}
// 遍历并为每个div小球添加点击事件
circlesArr.forEach((cols, i) => {
    cols.forEach((circle, j) => {
        circle.addEventListener("click", () => {
            growCircles(i, j);
        });
    });
});

function growCircles(i, j) {
    // 确认位置
    if (circlesArr[i] && circlesArr[i][j]) {
        // 保证身上没有grow的类名(grow是一个css样式)
        if (!circlesArr[i][j].classList.contains("grow")) {
            circlesArr[i][j].classList.add("grow");
            // 周围小球依次变大
            setTimeout(() => {
                growCircles(i - 1, j);
                growCircles(i + 1, j);
                growCircles(i, j - 1);
                growCircles(i, j + 1);
            }, 100);
            // 周围小球再依次还原
            setTimeout(() => {
                circlesArr[i][j].classList.remove("grow");
            }, 300);
        }
    }
}
上一篇:简单工厂模式


下一篇:C#9.0新特性详解系列之六:增强的模式匹配