js点击按钮实现水波纹效果代码(CSS3和Canves)

JS点击按钮实现水波纹效果是一种很炫酷的UI效果,可以为网站增加动态和交互的效果,本文将详细讲解实现这种效果的完整攻略。实现方法有两种,分别是使用CSS3和使用Canvas。

CSS3 实现 js 点击按钮水波纹效果

HTML 结构

首先需要在HTML文件中添加一个按钮,如下所示:

<button class="wave-button">Button</button>

CSS 样式

需要设置.wave-button按钮的样式。这里使用伪类:before:after为按钮添加水波纹效果。

.wave-button {
    background-color: blue;
    color: white;
    border: none;
    padding: 10px 20px;
    font-size: 16px;
    position: relative;
    overflow: hidden;
}

.wave-button:hover:before,
.wave-button:focus:before {
    content: "";
    display: block;
    position: absolute;
    z-index: 1;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    width: 0;
    height: 0;
    border-radius: 100%;
    background-color: rgba(255, 255, 255, 0.5);
    animation: wave 0.8s linear;
}

@keyframes wave {
    from {
        width: 0;
        height: 0;
        opacity: 0.5;
    }

    to {
        width: 300px;
        height: 300px;
        opacity: 0;
    }
}

JS 代码

当按钮被点击时,调用以下JavaScript代码:

document.querySelector('.wave-button').addEventListener('click', function (event) {
    const button = event.target;
    const wave = button.querySelector('.wave');
    const buttonPos = button.getBoundingClientRect();

    if (wave) {
        wave.remove();
    }

    const posX = event.clientX - buttonPos.left;
    const posY = event.clientY - buttonPos.top;

    const ripple = document.createElement('span');
    ripple.classList.add('wave');
    ripple.style.top = `${posY}px`;
    ripple.style.left = `${posX}px`;

    button.appendChild(ripple);

    setTimeout(() => {
        ripple.remove();
    }, 800);
});

Canvas 实现 js 点击按钮水波纹效果

HTML 结构

与CSS3实现方式一样,需要在HTML文件中添加一个按钮,如下所示:

<button class="wave-button">Button</button>

JS 代码

先创建画布和配置:

const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');

canvas.width = canvas.height = 100;
canvas.classList.add('wave-canvas');

document.querySelector('.wave-button').appendChild(canvas);

const circle = {
    x: 0,
    y: 0,
    width: 0,
    height: 0,
    lineWidth: 3,
    alpha: 0.5,
    strokeStyle: '#ffffff',
};

为按钮添加事件监听器,在事件触发时绘制水波纹:

document.querySelector('.wave-button').addEventListener('click', function (event) {
    const button = event.target;
    const buttonPos = button.getBoundingClientRect();

    circle.x = event.clientX - buttonPos.left - canvas.width / 2;
    circle.y = event.clientY - buttonPos.top - canvas.width / 2;

    // 绘制水波纹
    const wave = setInterval(() => {
        circle.width += 3;
        circle.height += 3;
        circle.alpha -= 0.02;
        circle.lineWidth -= 0.03;

        ctx.beginPath();
        ctx.arc(circle.x, circle.y, circle.width, 0, 2 * Math.PI);
        ctx.lineWidth = circle.lineWidth;
        ctx.globalAlpha = circle.alpha;
        ctx.strokeStyle = circle.strokeStyle;
        ctx.stroke();

        if (circle.alpha <= 0) {
            clearInterval(wave);
            waveEnd();
        }
    }, 30);
});

function waveEnd() {
    // 恢复初始值
    circle.width = 0;
    circle.height = 0;
    circle.alpha = 0.5;
    circle.lineWidth = 3;
    ctx.clearRect(0, 0, canvas.width, canvas.height);
}

两种实现方式都可以让按钮实现水波纹效果,选择使用哪种方法需要根据实际情况进行考虑。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js点击按钮实现水波纹效果代码(CSS3和Canves) - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • 使用CSS3的rem属性制作响应式页面布局的要点解析

    下面就是使用CSS3的rem属性制作响应式页面布局的要点解析攻略: 1. 什么是rem属性 rem是CSS3新增的一个相对单位,其值相对于根元素(html)的字体大小而定。通俗来说,1rem等于根元素(html)的字体大小。比如,如果当前页面的根元素(html)的字体大小为16px,则1rem等于16px。 2. 使用rem属性制作响应式页面布局的要点 2.…

    css 2023年6月9日
    00
  • 仅仅使用 HTML/CSS 实现各类进度条的方式汇总

    针对 “仅仅使用 HTML/CSS 实现各类进度条的方式汇总”,我给您提供以下的完整攻略: 1.通过 background 和 width 属性来实现 可以通过 background 和 width 属性来实现一个简单的进度条。首先,通过 CSS 样式将进度条的容器进行设置: .progress { width: 300px; height: 20px; b…

    css 2023年6月10日
    00
  • antd table长表格出现滚动条的操作方法

    针对“antd table长表格出现滚动条的操作方法”,我们可以采用如下步骤进行处理: 1. 设置表格滚动条 使用antd table时,如果出现了长表格,我们需要手动添加滚动条。首先需要在Table组件中设置两个参数: scroll: 设置纵向和横向滚动条的参数; pagination: 隐藏分页,仅保留滚动条。 代码示例: <Table scrol…

    css 2023年6月10日
    00
  • react基本安装与测试示例

    以下是React基本安装和测试示例的完整攻略: 安装Node.js和npm 首先,你需要在你的计算机上安装Node.js和npm(包管理器),如果你已经安装过了,可以跳过这一步骤。 如果你还没有安装Node.js和npm,请参考以下步骤: 访问Node.js官网:https://nodejs.org/en/ 下载LTS版本的Node.js,根据你的操作系统选…

    css 2023年6月9日
    00
  • 详解BootStrap中Affix控件的使用及保持布局的美观的方法

    当我们制作网页时,我们通常希望页面保持固定的布局,同时支持导航栏在页面滚动时保持位置不变。这时,我们可以通过使用Bootstrap中的Affix控件来实现此功能。下面是关于如何使用Bootstrap中的Affix控件及保持布局美观的完整攻略: 什么是affix控件 Affix控件是Bootstrap中提供的一种样式控件,它可以在页面元素滚动至屏幕顶端时停止滚…

    css 2023年6月11日
    00
  • javaScript checkbox 全选/反选及批量删除

    下面我来详细讲解一下“JavaScript checkbox 全选/反选及批量删除”的完整攻略。 核心思路 JavaScript实现checkbox全选/反选及批量删除的核心思路如下: 获取页面上所有的checkbox元素,并添加相应的事件监听函数; 创建一个“全选”checkbox元素,点击全选时,遍历所有checkbox,将它们的checked属性设置为…

    css 2023年6月10日
    00
  • 20 个 CSS 高级技巧汇总(推荐)

    20 个 CSS 高级技巧汇总(推荐) 本篇文章从以下几个方面介绍了 20 项 CSS 高级技巧: CSS 渐变 多列布局 background-clip 透明度 混合模式 CSS 坐标系统 CSS 形状 文字阴影 overflow 自定义下划线 格子背景 CSS 动画 filter border-radius CSS 变量 边栏布局 伸缩容器 text-o…

    css 2023年6月9日
    00
  • CSS样式分离之再分离达到精简与重用

    即使现代浏览器几乎可以处理任意大小的CSS,仍然有许多好处将CSS与HTML代码分离。首先,这使得HTML代码具有更高的可读性,使其更易于阅读和理解。其次,它允许您在需要的时候更轻松地重用CSS代码,并且可以使您的代码更易于维护。 以下是“CSS样式分离之再分离达到精简与重用”的完整攻略: 步骤1:将CSS从HTML中分离出来 将CSS分离出HTML代码的最…

    css 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部