前端开发 之 15个炫酷按钮特效下【附完整源码】

简介: 本篇文章内容展示了多颜色内波纹按钮、彩虹色外波纹按钮、手绘风格式按钮等众多炫酷按钮特效,并给出了完整代码及注释

八:多颜色内波纹按钮

1.效果展示
内波纹彩.gif

2.HTML完整代码

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<!-- 设置视口,使页面在移动设备上也能良好显示,宽度为设备宽度,初始缩放比例为1.0 -->
<title>多颜色内波纹按钮</title>
<style>
body {
    
    display: grid;
    /* 使用网格布局 */
    place-items: center;
    /* 将所有子元素居中 */
    min-height: 100vh;
    /* 设置最小高度为视口高度的100% */
    overflow: hidden;
    /* 隐藏超出容器的内容 */
    background-color: #97ccf3;
    /* 设置背景颜色 */
}
.ripple-btn {
    
    position: relative;
    /* 设置定位方式为相对定位 */
    overflow: hidden;
    /* 隐藏超出容器的内容 */
    border: none;
    /* 移除边框 */
    background-color: #3acb63;
    /* 设置背景颜色 */
    color: #fff;
    /* 设置文字颜色为白色 */
    padding: 30px 40px;
    /* 设置内边距 */
    font-size: 16px;
    /* 设置字体大小 */
    cursor: pointer;
    /* 设置鼠标悬停时的光标样式为指针 */
    outline: none;
    /* 移除元素被聚焦时的轮廓 */
    border-radius: 20px;
    /* 设置边框圆角 */
    box-shadow: none;
    /* 移除盒阴影 */
}

.ripple-effect {
    
    position: absolute;
    /* 设置定位方式为绝对定位 */
    border-radius: 50%;
    /* 设置边框圆角为50%,形成圆形 */
    background-color: rgba(243, 237, 237, 0.6); 
    /* 设置初始背景颜色,之后会被JS覆盖 */
    pointer-events: none;
    /* 禁止指针事件,使波纹不影响按钮的点击 */
    animation: ripple-animation 1s linear; 
    /* 应用动画,持续1秒,线性播放 */
    transform-origin: center center;
    /* 设置变换的原点为元素的中心 */
    box-shadow: none;
    /* 移除盒阴影 */
}

@keyframes ripple-animation {
    
    from {
    
        transform: scale(1);
        /* 起始状态,缩放比例为1 */
        opacity: 1;
        /* 起始状态,透明度为1 */
    }
    to {
    
        transform: scale(15);
        /* 结束状态,缩放比例为15 */
        opacity: 0;
        /* 结束状态,透明度为0 */
    }
}
</style>
</head>
<body>
    <button class="ripple-btn" id="button">
        按钮
    </button>
    <script>
        const button = document.querySelector('#button');
        // 获取ID为button的按钮元素
        const colors = ["#FF5733", "#33FF57", "#3357FF", "#FF33A1", "#33FFF6","#2CDDBF"]; 
        // 定义一个颜色数组,用于波纹的颜色

        button.onclick = function (evt) {
    
            // 为按钮添加点击事件监听器
            // 创建多个波纹
            for (let i = 0; i < 5; i++) {
    
                // 循环5次,创建5个波纹
                const ripple = document.createElement("span");
                // 创建一个span元素,作为波纹
                ripple.classList.add("ripple-effect");
                // 为该span元素添加ripple-effect类名

                // 使用固定颜色数组中的颜色
                const color = colors[i % colors.length];
                // 从颜色数组中选择颜色,使用取余运算符确保索引不越界
                const size = Math.random() * 30 + 20; 
                // 生成一个随机大小,范围在20px到50px之间

                ripple.style.height = `${
      size}px`;
                // 设置波纹的高度
                ripple.style.width = `${
      size}px`;
                // 设置波纹的宽度
                ripple.style.left = `${
      evt.offsetX - size / 2}px`;
                // 设置波纹的左边距,使其中心对齐点击位置
                ripple.style.top = `${
      evt.offsetY - size / 2}px`;
                // 设置波纹的上边距,使其中心对齐点击位置
                ripple.style.backgroundColor = color;
                // 设置波纹的背景颜色

                button.appendChild(ripple);
                // 将波纹添加到按钮中

                // 动画结束后移除波纹(不需要setTimeout了,因为动画不是无限循环)
                ripple.addEventListener('animationend', function () {
    
                    ripple.remove();
                    // 动画结束后,移除波纹元素
                });
            }
        }
    </script>
</body>
</html>

九:多颜色随机式内波纹按钮

1.效果展示
内波纹多.gif
2.HTML完整代码

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>多颜色随机式内波纹按钮</title>
<style>
body {
    
    display: grid;
    /* 将body布局设置为网格布局 */
    place-items: center;
    /* 将网格内的元素居中 */
    min-height: 100vh;
    /* 设置body的最小高度为视口高度的100% */
    overflow: hidden;
    /* 隐藏页面溢出内容 */
    background-color: #97c7e8;
    /* 设置背景颜色 */
}
.ripple-btn {
    
    position: relative;
    /* 设置按钮的定位方式为相对定位 */
    overflow: hidden;
    /* 隐藏按钮内容溢出部分 */
    border: none;
    /* 去掉按钮边框 */
    background-color: #3acbc6;
    /* 设置按钮背景颜色 */
    color: #fff;
    /* 设置按钮文字颜色为白色 */
    padding: 30px 40px;
    /* 设置按钮内边距 */
    font-size: 16px;
    /* 设置按钮文字大小 */
    cursor: pointer;
    /* 设置鼠标悬停时显示为指针 */
    outline: none;
    /* 去掉按钮点击时的轮廓线 */
    border-radius: 20px;
    /* 设置按钮边框圆角 */
    box-shadow: none;
    /* 去掉按钮的阴影效果 */
}

.ripple-effect {
    
    position: absolute;
    /* 设置波纹的定位方式为绝对定位 */
    border-radius: 50%;
    /* 设置波纹为圆形 */
    background-color: rgba(255, 255, 255, 0.6);
    /* 设置波纹的初始背景颜色及透明度 */
    pointer-events: none;
    /* 禁止波纹响应鼠标事件 */
    animation: ripple-animation 0.6s linear infinite;
    /* 应用波纹动画,动画时长0.6秒,匀速,无限循环 */
    transform-origin: center center;
    /* 设置波纹动画的变形原点为中心点 */
    box-shadow: none;
    /* 去掉波纹的阴影效果 */
}

@keyframes ripple-animation {
    
    from {
    
        transform: scale(1);
        opacity: 1;
        /* 动画开始时,波纹大小为原始大小,透明度为1 */
    }
    to {
    
        transform: scale(15);
        opacity: 0;
        /* 动画结束时,波纹放大到15倍,透明度为0 */
    }
}
</style>
</head>
<body>
    <button class="ripple-btn" id="button">
        按钮
    </button>
    <!-- 创建一个按钮,并赋予其类名和ID -->
    <script>
        const button = document.querySelector('#button');
        // 通过ID选择器获取按钮元素
        button.onclick = function (evt) {
    
            // 为按钮添加点击事件监听器
            // 创建多个波纹
            for (let i = 0; i < 5; i++) {
    
                // 循环5次,每次创建一个波纹
                const ripple = document.createElement("span");
                // 创建一个span元素作为波纹
                ripple.classList.add("ripple-effect");
                // 为波纹添加类名,应用样式

                // 随机颜色和大小
                const color = `rgba(${
      Math.floor(Math.random() * 256)}, ${
      Math.floor(Math.random() * 256)}, ${
      Math.floor(Math.random() * 256)}, 0.6)`;
                // 生成随机颜色,RGBA格式,透明度为0.6
                const size = Math.random() * 30 + 20; // 随机大小在20px到50px之间
                // 生成随机大小

                ripple.style.height = `${
      size}px`;
                // 设置波纹高度
                ripple.style.width = `${
      size}px`;
                // 设置波纹宽度
                ripple.style.left = `${
      evt.offsetX - size / 2}px`;
                // 设置波纹左偏移量,使波纹中心对准点击位置
                ripple.style.top = `${
      evt.offsetY - size / 2}px`;
                // 设置波纹上偏移量,使波纹中心对准点击位置
                ripple.style.backgroundColor = color;
                // 设置波纹背景颜色

                button.appendChild(ripple);
                // 将波纹添加到按钮中

                // 在动画结束后移除波纹
                setTimeout(() => {
    
                    button.removeChild(ripple);
                    // 通过setTimeout在600毫秒后移除波纹
                }, 600);
            }
        }
    </script>
</body>
</html>

十:自定义颜色式内波纹按钮

1.效果展示
内波纹自定义.gif
2.HTML完整代码

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>自定义颜色式内波纹按钮</title>
<style>
body {
    
    display: flex;
    /* 设置body为flex容器 */
    flex-direction: column;
    /* 设置flex子项的排列方向为垂直方向 */
    align-items: center;
    /* 设置flex子项在主轴上的对齐方式为居中 */
    justify-content: center;
    /* 设置flex子项在交叉轴上的对齐方式为居中 */
    min-height: 100vh;
    /* 设置最小高度为视口高度的100% */
    overflow: hidden;
    /* 隐藏超出容器的内容 */
    background-color: #a2ceee;
    /* 设置背景颜色 */
    margin: 0;
    /* 设置外边距为0 */
}

#colorPicker {
    
    margin-bottom: 20px;
    /* 设置下边距为20px */
}

.ripple-btn {
    
    position: relative;
    /* 设置定位方式为相对定位 */
    overflow: hidden;
    /* 隐藏溢出内容 */
    border: none;
    /* 去除边框 */
    background-color: #3acbc6;
    /* 设置背景颜色 */
    color: #fff;
    /* 设置文字颜色为白色 */
    padding: 30px 40px;
    /* 设置内边距 */
    font-size: 16px;
    /* 设置字体大小 */
    cursor: pointer;
    /* 设置鼠标悬停时的光标样式为指针 */
    outline: none;
    /* 去除元素获得焦点时的轮廓线 */
    border-radius: 20px;
    /* 设置边框圆角 */
    box-shadow: none;
    /* 去除盒阴影 */
}

.ripple-effect {
    
    position: absolute;
    /* 设置定位方式为绝对定位 */
    border-radius: 50%;
    /* 设置圆形边框 */
    pointer-events: none;
    /* 禁止鼠标事件 */
    animation: ripple-animation 0.6s linear forwards;
    /* 设置动画 */
    transform-origin: center center;
    /* 设置变换的原点为元素的中心 */
    box-shadow: none;
    /* 去除盒阴影 */
}

@keyframes ripple-animation {
    
    /* 定义动画关键帧 */
    from {
    
        transform: scale(1);
        /* 起始状态,缩放比例为1 */
        opacity: 1;
        /* 起始状态,不透明度为1 */
    }
    to {
    
        transform: scale(15);
        /* 结束状态,缩放比例为15 */
        opacity: 0;
        /* 结束状态,不透明度为0 */
    }
}
</style>
</head>
<body>
    <input type="color" id="colorPicker" value="#ffffff" />
    <!-- 颜色选择器的初始颜色为白色 -->
    <button class="ripple-btn" id="button">
        按钮
    </button>
    <!-- 带有波纹效果的按钮 -->
    <script>
        const button = document.querySelector('#button');
        // 获取按钮元素
        const colorPicker = document.querySelector('#colorPicker');
        // 获取颜色选择器元素

        button.onclick = function (evt) {
    
            // 当按钮被点击时执行此函数,evt为事件对象
            const selectedColor = colorPicker.value;
            // 获取用户选择的颜色

            // 创建多个波纹
            for (let i = 0; i < 5; i++) {
    
                const ripple = document.createElement("span");
                // 创建一个span元素作为波纹
                ripple.classList.add("ripple-effect");
                // 给span元素添加ripple-effect类

                // 随机大小
                const size = Math.random() * 30 + 20; 
                // 生成一个20px到50px之间的随机数作为波纹大小

                ripple.style.height = `${
      size}px`;
                // 设置波纹的高度
                ripple.style.width = `${
      size}px`;
                // 设置波纹的宽度
                ripple.style.left = `${
      evt.offsetX - size / 2}px`;
                // 设置波纹的左边距,使其中心对齐点击位置
                ripple.style.top = `${
      evt.offsetY - size / 2}px`;
                // 设置波纹的上边距,使其中心对齐点击位置
                // 使用用户选择的颜色
                ripple.style.backgroundColor = selectedColor;
                // 设置波纹的背景颜色为用户选择的颜色

                button.appendChild(ripple);
                // 将波纹添加到按钮中

                // 在动画结束后移除波纹
                setTimeout(() => {
    
                    button.removeChild(ripple);
                    // 0.6秒后移除波纹
                }, 600);
            }
        }
    </script>
</body>
</html>

十一:外波纹彩虹按钮

1.效果展示
外波纹.gif
2.HTML完整代码

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>外波纹彩虹按钮</title>
<style>
body {
    
    display: grid;
    /* 使用网格布局 */
    place-items: center;
    /* 将子元素居中放置 */
    min-height: 100vh;
    /* 设置最小高度为视口高度的100% */
    margin: 0;
    /* 去除默认的边距 */
    background-color: #b3eec4;
    /* 设置背景颜色 */
    overflow: hidden; 
    /* 初始时禁止滚动,但会在JS中动态控制 */
}

.ripple-btn {
    
    position: relative;
    /* 设置相对定位,以便子元素(波纹)可以绝对定位 */
    border: none;
    /* 去除边框 */
    background-color: #23ea00;
    /* 设置背景颜色 */
    color: #fff;
    /* 设置文字颜色为白色 */
    padding: 20px 40px;
    /* 设置内边距 */
    font-size: 18px;
    /* 设置字体大小 */
    font-weight: bold;
    /* 设置字体加粗 */
    cursor: pointer;
    /* 设置鼠标悬停时的光标样式为指针 */
    outline: none;
    /* 去除点击时的轮廓 */
    border-radius: 20px;
    /* 设置圆角 */
    box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
    /* 设置阴影效果 */
    transition: background-color 0.3s, transform 0.3s;
    /* 设置背景颜色和变换的过渡效果 */
}

.ripple-btn:hover {
    
    background-color: #46cbec;
    /* 设置鼠标悬停时的背景颜色 */
}

.ripple-effect {
    
    position: absolute;
    /* 设置绝对定位,相对于最近的已定位祖先元素(这里是.ripple-btn) */
    border-radius: 50%;
    /* 设置圆形 */
    background: radial-gradient(circle, red, yellow, lime, aqua, blue, magenta, red);
    /* 设置径向渐变背景色 */
    pointer-events: none;
    /* 禁止鼠标事件,使波纹不影响按钮的点击 */
    animation: ripple-animation 0.8s forwards; 
    /* 应用动画,持续0.8秒,动画结束后保持最终状态 */
    transform-origin: center;
    /* 设置变换的原点为中心 */
}

@keyframes ripple-animation {
    
    /* 定义动画关键帧 */
    from {
    
        transform: scale(1);
        /* 起始时波纹大小为原始大小 */
        opacity: 1;
        /* 起始时不透明度为1 */
    }
    to {
    
        transform: scale(15);
        /* 结束时波纹大小放大到15倍 */
        opacity: 0;
        /* 结束时不透明度为0 */
    }
}

.no-scroll {
    
    overflow: hidden;
    /* 禁止滚动 */
}
</style>
</head>
<body>
    <button class="ripple-btn" id="button">
        按钮
    </button>
    <script>
        const button = document.querySelector('#button');
        button.onclick = function (evt) {
    
            // 禁止页面滚动
            document.body.classList.add('no-scroll');
            // 给body元素添加no-scroll类,禁止滚动

            // 创建一个新的波纹元素
            const ripple = document.createElement("span");
            // 创建一个span元素作为波纹
            ripple.classList.add("ripple-effect");
            // 给波纹元素添加ripple-effect类

            // 根据按钮和点击位置,计算波纹的大小和起始位置
            const {
     offsetX, offsetY, target } = evt;
            // 从事件对象中获取点击位置相对于按钮的偏移量和目标元素(按钮)
            const size = Math.max(target.clientWidth, target.clientHeight) * 2; 
            // 计算波纹的大小,为按钮宽高最大值的两倍
            ripple.style.width = ripple.style.height = `${
      size}px`;
            // 设置波纹的宽度和高度
            ripple.style.left = `${
      offsetX - size / 2}px`;
            ripple.style.top = `${
      offsetY - size / 2}px`;
            // 设置波纹的left和top,使其中心对准点击位置

            // 将波纹元素添加到按钮中,并在动画结束后移除
            target.appendChild(ripple);
            // 将波纹元素添加到按钮中
            ripple.addEventListener('animationend', function () {
    
                // 为波纹元素添加动画结束事件处理函数
                ripple.remove();
                // 动画结束后移除波纹元素
                document.body.classList.remove('no-scroll');
                // 移除no-scroll类,恢复滚动
            });
        }
    </script>
</body>
</html>

十二:手绘风格式按钮

1.效果展示
小饼干空.gif
2.HTML完整代码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>手绘风格式按钮</title>
  <style>
    /* 定义按钮的样式 */
    button {
    
      --clr: #F9F6EF; /* 定义一个CSS变量--clr,用于后续的颜色引用 */
      --fg: #1f2020; /* 定义一个CSS变量--fg,用于文字颜色 */
      border: none; /* 去掉按钮的边框 */
      cursor: pointer; /* 鼠标悬停时显示为手指图标,表示可点击 */
      color: var(--fg); /* 使用--fg变量设置文字颜色 */
      background: transparent; /* 设置按钮背景为透明 */
      padding: 0.7em 1.2em; /* 设置按钮的内边距 */
      font-size: 1.4rem; /* 设置字体大小 */
      font-weight: 700; /* 设置字体加粗 */
      font-family: inherit; /* 字体家族继承父元素 */
      width: max-content; /* 宽度自适应内容 */
      position: relative; /* 设置相对定位,为伪元素定位做准备 */
      text-align: center; /* 文字居中 */
      transition: transform 0.1s linear, filter 0.1s linear; /* 添加过渡效果,改变transform和filter属性时产生动画效果 */
      filter: drop-shadow(0.1em 0.1em 0.1em rgba(249, 246, 239, 0.5)); /* 添加阴影效果 */
    }
    /* 定义按钮的伪元素::before,用于创建手绘风格的边框 */
    button::before {
    
      position: absolute; /* 绝对定位,相对于最近的已定位祖先元素(这里是button) */
      content: ""; /* 伪元素必须有内容,这里为空字符串 */
      top: 0; right: 0; bottom: 0; left: 0; /* 使伪元素覆盖整个按钮 */
      padding: 0.1em; /* 内边距,使边框与按钮内容有间距 */
      border: 4px double var(--clr); /* 使用--clr变量设置双线边框 */
      border-radius: 0.1em 0.2em/0.5em 0.23em; /* 边框圆角 */
      z-index: -1; /* 使伪元素位于按钮内容之下 */
      transition: 0.25s ease; /* 过渡效果,使边框变化更平滑 */
      background-clip: content-box; /* 背景只应用到内容区域,不包括边框 */
    }
    /* 定义按钮按下时的样式 */
    button:active {
    
      transform: translate(0.05em, 0.1em); /* 按下时按钮稍微移动,模拟按下效果 */
      filter: drop-shadow(-0.1em -0.1em 0.1em rgba(249, 246, 239, 0.5)); /* 阴影方向改变,模拟按下效果 */
    }
    /* 定义按钮获得焦点时的样式 */
    button:focus {
    
      outline: 2px dashed rgba(249, 246, 239, 0.9); /* 焦点时的外边框样式 */
      outline-offset: 0.5rem; /* 外边框与元素内容的距离 */
      border-radius: 0.25em; /* 外边框圆角 */
    }

    /* 定义.but1类的样式,用于特定按钮 */
    .but1{
    
      --clr: hsl(80, 75%, 75%); /* 覆盖--clr变量的值,改变按钮边框颜色 */
    }
    /* 为.but1类的伪元素::before添加滤镜效果 */
    .but1::before {
    
      filter: url("#squiggly-1"); /* 应用SVG滤镜,实现手绘效果 */
    }

    /* 定义.squigglysvg类的样式,用于隐藏SVG元素 */
    .squigglysvg {
    
      display: none; /* 隐藏SVG元素 */
      position: absolute; /* 绝对定位,确保不影响页面布局 */
      width: 0; height: 0; /* 尺寸设置为0,确保不占用空间 */
    }

    /* 定义body的样式 */
    body {
    
      font-family: "Merienda", cursive; /* 设置字体为"Merienda",如果不可用则使用默认的cursive字体 */
      min-height: 100vh; /* 最小高度为视口高度的100% */
      margin: 0; /* 去掉默认的外边距 */
      display: grid; /* 使用网格布局 */
      grid-template-columns: 1fr 1fr; /* 定义两列,每列占据相等的空间 */
      place-content: center; /* 内容在网格中居中 */
      place-items: center; /* 每个网格项在其单元格中居中 */
      gap: 2em; /* 网格项之间的间距 */
      background-color: #1f2020; /* 背景颜色 */
      background-image: radial-gradient(#535150, #1f2020); /* 背景图像为径向渐变 */
    }

    /* 定义奇数按钮的样式,使其靠右对齐 */
    button:nth-of-type(2n-1) {
    
      justify-self: right; /* 在网格单元格中靠右对齐 */
    }

    /* 定义偶数按钮的样式,使其靠左对齐 */
    button:nth-of-type(2n) {
    
      justify-self: left; /* 在网格单元格中靠左对齐 */
    }
  </style>
</head>
<body>
<button class="but1">按钮</button>

<!-- 定义SVG元素,包含多个滤镜定义,用于实现手绘效果 -->
<svg class="squigglysvg" xmlns="http://www.w3.org/2000/svg">
  <defs>
    <!-- 定义滤镜id="squiggly-0",通过湍流和位移映射实现手绘效果 -->
    <filter id="squiggly-0">
      <feTurbulence id="turbulence" baseFrequency="0.02" numOctaves="3" result="noise" seed="0"></feTurbulence>
      <feDisplacementMap in="SourceGraphic" in2="noise" scale="6"></feDisplacementMap>
    </filter>
    <!-- 类似地,定义其他滤镜,通过改变seed和scale实现不同的手绘效果 -->
    <filter id="squiggly-1">
      <feTurbulence id="turbulence" baseFrequency="0.02" numOctaves="3" result="noise" seed="1"></feTurbulence>
      <feDisplacementMap in="SourceGraphic" in2="noise" scale="8"></feDisplacementMap>
    </filter>
   <filter id="squiggly-2">
      <feTurbulence id="turbulence" baseFrequency="0.02" numOctaves="3" result="noise" seed="2"></feTurbulence>
      <feDisplacementMap in="SourceGraphic" in2="noise" scale="6"></feDisplacementMap>
    </filter>
    <filter id="squiggly-3">
      <feTurbulence id="turbulence" baseFrequency="0.02" numOctaves="3" result="noise" seed="3"></feTurbulence>
      <feDisplacementMap in="SourceGraphic" in2="noise" scale="8"></feDisplacementMap>
    </filter>
    <filter id="squiggly-4">
      <feTurbulence id="turbulence" baseFrequency="0.02" numOctaves="3" result="noise" seed="4"></feTurbulence>
      <feDisplacementMap in="SourceGraphic" in2="noise" scale="6"></feDisplacementMap>
    </filter>
    <filter id="squiggly-5">
      <feTurbulence id="turbulence" baseFrequency="0.02" numOctaves="3" result="noise" seed="9"></feTurbulence>
      <feDisplacementMap in="SourceGraphic" in2="noise" scale="6"></feDisplacementMap>
    </filter>
  </defs>
</svg>
</body>
</html>

十三:手绘风格式波纹填充按钮

1.效果展示
小饼干虚.gif
2.HTML完整代码

<!DOCTYPE html>
<html lang="en" >
<head>
  <meta charset="UTF-8">
  <title>手绘风格式波纹填充按钮</title>
  <style>
    button {
    
      --clr: #F9F6EF; /* 设置CSS变量clr,用于后续的颜色引用 */
      --fg: #1f2020; /* 设置CSS变量fg,用于文字颜色 */
      border: none; /* 移除按钮边框 */
      cursor: pointer; /* 鼠标悬停时显示为指针 */
      color: var(--fg); /* 使用CSS变量设置文字颜色 */
      background: transparent; /* 设置按钮背景透明 */
      padding: 0.7em 1.2em; /* 设置按钮内边距 */
      font-size: 1.4rem; /* 设置字体大小 */
      font-weight: 700; /* 设置字体加粗 */
      font-family: inherit; /* 继承父元素的字体家族 */
      width: max-content; /* 设置宽度为内容最大宽度 */
      position: relative; /* 设置相对定位 */
      text-align: center; /* 文字居中 */
      transition: transform 0.1s linear, filter 0.1s linear; /* 设置变换和滤镜的过渡效果 */
      filter: drop-shadow(0.1em 0.1em 0.1em rgba(249, 246, 239, 0.5)); /* 添加阴影效果 */
    }
    button::before {
    
      /* 为button元素添加伪元素 */
      --clrs1: rgba(0, 0, 0, 0.5); /* 设置CSS变量clrs1 */
      --clrs2: rgba(0, 0, 0, 0.2); /* 设置CSS变量clrs2 */
      --clrs3: rgba(0, 0, 0, 0.6); /* 设置CSS变量clrs3 */
      --clrs4: rgba(0, 0, 0, 0.98); /* 设置CSS变量clrs4 */
      position: absolute; /* 设置绝对定位 */
      content: ""; /* 必须设置内容以生成伪元素 */
      top: 0; right: 0; bottom: 0; left: 0; /* 使伪元素覆盖整个按钮 */
      padding: 0.1em; /* 设置内边距 */
      border: 4px double var(--clr); /* 使用CSS变量设置边框样式 */
      border-radius: 0.1em 0.2em/0.5em 0.23em; /* 设置边框圆角 */
      z-index: -1; /* 使伪元素位于按钮下方 */
      transition: 0.25s ease; /* 设置过渡效果 */
      background: linear-gradient(178deg, var(--clrs1), var(--clrs2) 20% 70%, var(--clrs3) 90%, var(--clrs4)) 0 0/100% 0.3rem; 
      /* 设置线性渐变背景 */
      background-clip: content-box; /* 背景裁剪到内容框 */
    }
    button:active {
    
      /* 当按钮处于活动状态(被点击)时的样式 */
      transform: translate(0.05em, 0.1em); /* 设置位移效果 */
      filter: drop-shadow(-0.1em -0.1em 0.1em rgba(249, 246, 239, 0.5)); /* 修改阴影效果 */
    }
    button:focus {
    
      /* 当按钮获得焦点时的样式 */
      outline: 2px dashed rgba(249, 246, 239, 0.9); /* 设置焦点轮廓 */
      outline-offset: 0.5rem; /* 设置轮廓偏移 */
      border-radius: 0.25em; /* 设置轮廓圆角 */
    }
    .but1 {
    
        --clr: #F9F6EF; /* 为.but1类设置CSS变量clr */
      }
      .but1::before {
    
        filter: url("#squiggly-0"); /* 应用SVG滤镜效果 */
      }
      .but1:active::before {
    
        filter: url("#squiggly-5"); /* 当按钮处于活动状态时应用不同的SVG滤镜效果 */
      }

    .squigglysvg {
    
      display: none; /* 隐藏SVG元素 */
    }

    body {
    
      font-family: "Merienda", cursive; /* 设置页面字体 */
      min-height: 100vh; /* 设置页面最小高度为视口高度 */
      margin: 0; /* 移除页面边距 */
      display: grid; /* 设置页面为网格布局 */
      grid-template-columns: 1fr 1fr; /* 设置两列,等宽 */
      place-content: center; /* 内容居中 */
      place-items: center; /* 项目居中 */
      gap: 2em; /* 设置网格项之间的间隙 */
      background-color: #1f2020; /* 设置背景颜色 */
      background-image: radial-gradient(#535150, #1f2020); /* 设置径向渐变背景 */
    }

    button:nth-of-type(2n-1) {
    
      justify-self: right; /* 奇数按钮右对齐 */
    }

    button:nth-of-type(2n) {
    
      justify-self: left; /* 偶数按钮左对齐 */
    }
  </style>
</head>
<body>

<button class="but1">按钮</button>
<!-- 创建一个带有.but1类的按钮,按钮文字为“按钮” -->

<svg class="squigglysvg" xmlns="http://www.w3.org/2000/svg" version="1.1">
  <!-- 定义一个SVG元素,用于滤镜效果 -->
   <defs>
        <filter id="squiggly-0">
      <feturbulence id="turbulence" basefrequency="0.02" numoctaves="3" result="noise" seed="0"></feturbulence>
      <fedisplacementmap id="displacement" in="SourceGraphic" in2="noise" scale="6"></fedisplacementmap>
    </filter>
    <filter id="squiggly-1">
      <feturbulence id="turbulence" basefrequency="0.02" numoctaves="3" result="noise" seed="1"></feturbulence>
      <fedisplacementmap in="SourceGraphic" in2="noise" scale="8"></fedisplacementmap>
    </filter>
    <filter id="squiggly-2">
      <feturbulence id="turbulence" basefrequency="0.02" numoctaves="3" result="noise" seed="2"></feturbulence>
      <fedisplacementmap in="SourceGraphic" in2="noise" scale="6"></fedisplacementmap>
    </filter>
    <filter id="squiggly-3">
      <feturbulence id="turbulence" basefrequency="0.02" numoctaves="3" result="noise" seed="3"></feturbulence>
      <fedisplacementmap in="SourceGraphic" in2="noise" scale="8"></fedisplacementmap>
    </filter>
    <filter id="squiggly-4">
      <feturbulence id="turbulence" basefrequency="0.02" numoctaves="3" result="noise" seed="4"></feturbulence>
      <fedisplacementmap in="SourceGraphic" in2="noise" scale="6"></fedisplacementmap>
    </filter>
    <filter id="squiggly-5">
      <feturbulence id="turbulence" basefrequency="0.02" numoctaves="3" result="noise" seed="9"></feturbulence>
      <fedisplacementmap in="SourceGraphic" in2="noise" scale="6"></fedisplacementmap>
    </filter>
  </defs>
</svg>
</body>
</html>

十四:手绘风格式水波纹按钮

1.效果展示
小饼干水.gif
2.HTML完整代码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>手绘风格式水波纹按钮</title>
  <style>
    button {
    
      --clr: #F9F6EF; /* 定义CSS变量--clr,用于背景色 */
      --fg: #1f2020; /* 定义CSS变量--fg,用于文字颜色 */
      border: none; /* 去掉按钮的边框 */
      cursor: pointer; /* 鼠标悬停时显示为手型 */
      color: var(--fg); /* 使用CSS变量设置文字颜色 */
      background: transparent; /* 设置按钮背景为透明 */
      padding: 0.7em 1.2em; /* 设置按钮内边距 */
      font-size: 1.4rem; /* 设置字体大小 */
      font-weight: 700; /* 设置字体加粗 */
      font-family: inherit; /* 继承父元素的字体 */
      width: max-content; /* 设置宽度为内容最大宽度 */
      position: relative; /* 设置定位方式为相对定位 */
      text-align: center; /* 设置文本居中 */
      transition: transform 0.1s linear, filter 0.1s linear; /* 设置变换和滤镜的过渡效果 */
      filter: drop-shadow(0.1em 0.1em 0.1em rgba(0, 0, 0, 0.5)); /* 添加阴影效果 */
    }
    /* 定义按钮伪元素::before的样式,用于创建按钮的外框和背景 */
    button::before {
    
      position: absolute; /* 设置定位方式为绝对定位 */
      content: ""; /* 必须设置内容以生成盒子模型 */
      top: 0; right: 0; bottom: 0; left: 0; /* 设置四边距离为0,覆盖整个按钮 */
      padding: 0.1em; /* 设置内边距 */
      border: 4px double var(--clr); /* 使用CSS变量设置边框样式 */
      border-radius: 0.1em 0.2em/0.5em 0.23em; /* 设置边框圆角 */
      z-index: -1; /* 设置层级,使其在按钮文字下方 */
      transition: 0.25s ease; /* 设置过渡效果 */
      background: linear-gradient(178deg, #5ec49d, #2ec1bc 20% , #326f99 90%, #4031c4) 0 0/100% 0.3rem;
      /* 设置背景为线性渐变,并定义渐变方向和颜色 */
      background-clip: content-box; /* 背景被裁剪到内容框 */
    }
    /* 定义按钮活动状态的样式 */
    button:active {
    
      transform: translate(0.05em, 0.1em); /* 点击时按钮略微移动 */
      filter: drop-shadow(-0.1em -0.1em 0.1em rgba(0, 0, 0, 0.5)); /* 点击时阴影方向改变 */
    }
    /* 定义按钮获得焦点时的样式 */
    button:focus {
    
      outline: 2px dashed rgba(249, 246, 239, 0.9); /* 设置焦点时的外轮廓样式 */
      outline-offset: 0.5rem; /* 设置轮廓偏移 */
      border-radius: 0.25em; /* 设置轮廓圆角 */
    }
    /* 定义.but3类的样式,用于特定按钮 */
    .but3 {
    
      --clr: hsl(180, 75%, 75%); /* 修改CSS变量--clr的值 */
    }
    /* 定义.but3类按钮伪元素::before的样式 */
    .but3::before {
    
      filter: url("#squiggly-2"); /* 应用SVG滤镜效果 */
    }
    /* 定义.but3类按钮活动状态时伪元素::before的样式 */
    .but3:active::before {
    
      filter: url("#squiggly-5"); /* 活动状态时应用不同的SVG滤镜效果 */
    }
    /* 定义.squigglysvg类的样式,用于隐藏SVG元素 */
    .squigglysvg {
    
      display: none; /* 隐藏SVG元素 */
      position: absolute; /* 设置定位方式为绝对定位 */
      width: 0; height: 0; /* 设置宽高为0 */
    }
    /* 定义body元素的样式 */
    body {
    
      font-family: "Merienda", cursive; /* 设置字体 */
      min-height: 100vh; /* 设置最小高度为视口高度 */
      margin: 0; /* 去掉外边距 */
      display: grid; /* 设置布局方式为网格布局 */
      grid-template-columns: 1fr 1fr; /* 设置网格列模板,两列等分 */
      place-content: center; /* 设置内容居中 */
      place-items: center; /* 设置项目居中 */
      gap: 2em; /* 设置网格项之间的间距 */
      background-color: #1f2020; /* 设置背景颜色 */
      background-image: radial-gradient(#535150, #1f2020); /* 设置背景为径向渐变 */
    }
    /* 设置奇数按钮的样式,使其靠右对齐 */
    button:nth-of-type(2n-1) {
    
      justify-self: right; 
    }
    /* 设置偶数按钮的样式,使其靠左对齐 */
    button:nth-of-type(2n) {
    
      justify-self: left;
    }
  </style>
</head>
<body>
<button class="but3">按钮</button>
<!-- 定义SVG元素,包含多个滤镜定义,用于按钮的特效 -->
<svg class="squigglysvg" xmlns="http://www.w3.org/2000/svg">
  <defs>
        <!-- 定义滤镜squiggly-0,使用湍流和位移映射创建特效 -->
        <filter id="squiggly-0">
      <feturbulence id="turbulence" basefrequency="0.02" numoctaves="3" result="noise" seed="0"></feturbulence>
      <fedisplacementmap id="displacement" in="SourceGraphic" in2="noise" scale="6"></fedisplacementmap>
    </filter>
    <filter id="squiggly-1">
      <feturbulence id="turbulence" basefrequency="0.02" numoctaves="3" result="noise" seed="1"></feturbulence>
      <fedisplacementmap in="SourceGraphic" in2="noise" scale="8"></fedisplacementmap>
    </filter>
    <filter id="squiggly-2">
      <feturbulence id="turbulence" basefrequency="0.02" numoctaves="3" result="noise" seed="2"></feturbulence>
      <fedisplacementmap in="SourceGraphic" in2="noise" scale="6"></fedisplacementmap>
    </filter>
    <filter id="squiggly-3">
      <feturbulence id="turbulence" basefrequency="0.02" numoctaves="3" result="noise" seed="3"></feturbulence>
      <fedisplacementmap in="SourceGraphic" in2="noise" scale="8"></fedisplacementmap>
    </filter>
    <filter id="squiggly-4">
      <feturbulence id="turbulence" basefrequency="0.02" numoctaves="3" result="noise" seed="4"></feturbulence>
      <fedisplacementmap in="SourceGraphic" in2="noise" scale="6"></fedisplacementmap>
    </filter>
    <filter id="squiggly-5">
      <feturbulence id="turbulence" basefrequency="0.02" numoctaves="3" result="noise" seed="9"></feturbulence>
      <fedisplacementmap in="SourceGraphic" in2="noise" scale="6"></fedisplacementmap>
    </filter>
  </defs>
</svg>
</body>
</html>

十五:手绘风格式填充色按钮

1.效果展示
小饼干按钮实.gif
2.HTML完整代码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>手绘风格式填充色按钮</title>
  <style>
    button {
    
      --clr: #F9F6EF;
      --fg: #1f2020;
      border: none;
      cursor: pointer;
      color: var(--fg);
      background: var(--clr); /* 使用自定义属性设置背景色 */
      padding: 0.7em 1.2em;
      font-size: 1.4rem;
      font-weight: 700;
      font-family: inherit;
      width: max-content;
      position: relative;
      text-align: center;
      transition: transform 0.1s linear, filter 0.1s linear;
      filter: drop-shadow(0.1em 0.1em 0.1em rgba(0, 0, 0, 0.2));
    }
    button::before {
    
      position: absolute;
      content: "";
      top: 0;
      right: 0;
      bottom: 0;
      left: 0;
      padding: 0.1em;
      border: 4px double var(--fg);
      border-radius: 0.1em 0.2em/0.5em 0.23em;
      z-index: -1;
      transition: 0.25s ease;
      background-clip: content-box;
    }
    button:active {
    
      transform: translate(0.05em, 0.1em);
      filter: drop-shadow(-0.1em -0.1em 0.1em rgba(0, 0, 0, 0.2));
    }
    button:focus {
    
      outline: 2px dashed rgba(249, 246, 239, 0.9);
      outline-offset: 0.5rem;
      border-radius: 0.25em;
    }

    .but1 {
    
      --clr: #F9F6EF;
    }
    .but1::before {
    
      filter: url("#squiggly-0");
    }
    .but1:active::before {
    
      filter: url("#squiggly-5");
    }

    .squigglysvg {
    
      display: none;
      position: absolute;
      width: 0;
      height: 0;
    }

    body {
    
      font-family: "Merienda", cursive;
      min-height: 100vh;
      margin: 0;
      display: grid;
      grid-template-columns: 1fr 1fr;
      place-content: center;
      place-items: center;
      gap: 2em;
      background-color: #1f2020;
      background-image: radial-gradient(#535150, #1f2020);
    }

    button:nth-of-type(2n-1) {
    
      justify-self: right;
    }

    button:nth-of-type(2n) {
    
      justify-self: left;
    }
  </style>
</head>
<body>
<button class="but1">按钮</button>
<svg class="squigglysvg" xmlns="http://www.w3.org/2000/svg">

  <defs>
    <filter id="squiggly-0">
      <feTurbulence id="turbulence" baseFrequency="0.02" numOctaves="3" result="noise" seed="0"></feTurbulence>
      <feDisplacementMap in="SourceGraphic" in2="noise" scale="6"></feDisplacementMap>
    </filter>
    <filter id="squiggly-1">
      <feTurbulence id="turbulence" baseFrequency="0.02" numOctaves="3" result="noise" seed="1"></feTurbulence>
      <feDisplacementMap in="SourceGraphic" in2="noise" scale="8"></feDisplacementMap>
    </filter>
    <filter id="squiggly-2">
      <feTurbulence id="turbulence" baseFrequency="0.02" numOctaves="3" result="noise" seed="2"></feTurbulence>
      <feDisplacementMap in="SourceGraphic" in2="noise" scale="6"></feDisplacementMap>
    </filter>
    <filter id="squiggly-3">
      <feTurbulence id="turbulence" baseFrequency="0.02" numOctaves="3" result="noise" seed="3"></feTurbulence>
      <feDisplacementMap in="SourceGraphic" in2="noise" scale="8"></feDisplacementMap>
    </filter>
    <filter id="squiggly-4">
      <feTurbulence id="turbulence" baseFrequency="0.02" numOctaves="3" result="noise" seed="4"></feTurbulence>
      <feDisplacementMap in="SourceGraphic" in2="noise" scale="6"></feDisplacementMap>
    </filter>
    <filter id="squiggly-5">
      <feTurbulence id="turbulence" baseFrequency="0.02" numOctaves="3" result="noise" seed="9"></feTurbulence>
      <feDisplacementMap in="SourceGraphic" in2="noise" scale="6"></feDisplacementMap>
    </filter>
  </defs>
</svg>
</body>
</html>

END~

目录
相关文章
|
8天前
|
人工智能 安全 Linux
【OpenClaw保姆级图文教程】阿里云/本地部署集成模型Ollama/Qwen3.5/百炼 API 步骤流程及避坑指南
2026年,AI代理工具的部署逻辑已从“单一云端依赖”转向“云端+本地双轨模式”。OpenClaw(曾用名Clawdbot)作为开源AI代理框架,既支持对接阿里云百炼等云端免费API,也能通过Ollama部署本地大模型,完美解决两类核心需求:一是担心云端API泄露核心数据的隐私安全诉求;二是频繁调用导致token消耗过高的成本控制需求。
5179 9
|
16天前
|
人工智能 JavaScript Ubuntu
5分钟上手龙虾AI!OpenClaw部署(阿里云+本地)+ 免费多模型配置保姆级教程(MiniMax、Claude、阿里云百炼)
OpenClaw(昵称“龙虾AI”)作为2026年热门的开源个人AI助手,由PSPDFKit创始人Peter Steinberger开发,核心优势在于“真正执行任务”——不仅能聊天互动,还能自动处理邮件、管理日程、订机票、写代码等,且所有数据本地处理,隐私完全可控。它支持接入MiniMax、Claude、GPT等多类大模型,兼容微信、Telegram、飞书等主流聊天工具,搭配100+可扩展技能,成为兼顾实用性与隐私性的AI工具首选。
21120 114
|
7天前
|
JavaScript Linux API
保姆级教程,通过GACCode在国内使用Claudecode、Codex!
保姆级教程,通过GACCode在国内使用Claudecode、Codex!
4676 1
保姆级教程,通过GACCode在国内使用Claudecode、Codex!
|
12天前
|
人工智能 安全 前端开发
Team 版 OpenClaw:HiClaw 开源,5 分钟完成本地安装
HiClaw 基于 OpenClaw、Higress AI Gateway、Element IM 客户端+Tuwunel IM 服务器(均基于 Matrix 实时通信协议)、MinIO 共享文件系统打造。
8067 7
|
14天前
|
人工智能 JavaScript API
保姆级教程:OpenClaw阿里云/本地部署配置Tavily Search skill 实时联网,让OpenClaw“睁眼看世界”
默认状态下的OpenClaw如同“闭门造车”的隐士,仅能依赖模型训练数据回答问题,无法获取实时新闻、最新数据或训练截止日期后的新信息。2026年,激活其联网能力的最优方案是配置Tavily Search技能——无需科学上网、无需信用卡验证,每月1000次免费搜索额度完全满足个人需求,搭配ClawHub技能市场,还能一键拓展天气查询、邮件管理等实用功能。
8112 5

热门文章

最新文章