IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> JavaScript实现按钮波纹点击效果 -> 正文阅读

[JavaScript知识库]JavaScript实现按钮波纹点击效果

按钮波纹

我们经常使用安卓手机知道,当我点击这个按钮的时候,这个按钮周围就会有波纹,这个效果用户体验是比较好的,那么我们如何使用JavaScript来实现呢

实现思路

我们代码实现的思路是,我们首先使用css做一个一次性播放的动画。然后我们用js动态获取用户点击按钮的相对位置,然后在指定位置添加合适的带有动画的元素,来播放css波纹特效

代码实现

css代码

button {
   position: relative;
    overflow: hidden;
    margin: auto;
    padding: 1rem 2rem;
    color: #fff;
    background: #6200ee;
    font-family: "Roboto", sans-serif;
    border-radius: 0.25rem;
    box-shadow: 0 0 0.5rem rgba(0, 0, 0, 0.3);
    outline: 0;
    border: 0;
    cursor: pointer;
}

span.ripple {
    position: absolute;
    border-radius: 50%;
    transform: scale(0);
    opacity: 1;
    background-color: rgba(255, 255, 255, 0.7);
    animation: ripple 600ms linear;
}

@keyframes ripple {
  to {
        transform: scale(4);
        opacity: 0;
    }
}

html

<button id="ripple" onclick="submit()">BUTTON</button>

js

 var createRipple=function (event) {
    const button = event.currentTarget;
    const rippleSize = Math.max(button.clientWidth, button.clientHeight)
    const moved = rippleSize / 2;
    const circle = document.createElement("span")
    circle.style.width = circle.style.height = `${rippleSize}px`
    circle.style.top = `${event.clientY - button.offsetTop - moved}px`
    circle.style.left = `${event.clientX - button.offsetLeft - moved}px`
    circle.classList.add("ripple")
    const isExist = button.getElementsByClassName("ripple")[0]
    if (isExist) {
        isExist.remove()
    }
    button.append(circle)
}
document.getElementById("ripple").addEventListener("click",createRipple)
function submit(){
    console.log("按钮被点击")
}

实现效果:

代码解读

css中对sapn标签使用了绝对定位,把span标签定位在button上面,但是还没有设置span元素的具体位置和宽高。我们还对span设置了一个波纹特效,让它从scale(0)变成scale(10),opacity从1变到0,这个动画只执行一次。

对应代码:

span.ripple {
    position: absolute;
    border-radius: 50%;
    transform: scale(0);
    opacity: 1;
    background-color: rgba(255, 255, 255, 0.7);
    animation: ripple 600ms linear;
}

@keyframes ripple {
  to {
        transform: scale(4);
        opacity: 0;
    }
}

注:span.ripple是属性选择器,等价于span[class=“ripple”]

首先我们创造一个span标签

const circle = document.createElement("span")

然后我们使用js获取按钮的宽高,也就是clientWidth和clientHeight,然后我们取较长的作为span标签的宽度和高度,(注:span标签是正方形的,设置border-radius:50%后变成圆形)

//取button中较长的宽度作为span的宽度
const rippleSize = Math.max(button.clientWidth, button.clientHeight)
circle.style.width = circle.style.height = `${rippleSize}px`

其次,我们接下来就是计算这个span标签应该定位在button上的位置,为了确保鼠标光标在span圆的最中央,我们要进行减去span标签一半的操作,确保居中对齐。(不用担心缩放函数scale,它是参照中心进行缩放的,我们就放心减去真实span宽高的一半就行了)

circle.style.top = `${event.clientY - button.offsetTop - moved}px`
circle.style.left = `${event.clientX - button.offsetLeft - moved}px`

最后我们给span标签添加类名ripple

circle.classList.add("ripple")

给button内部追加上去这个span标签,注意每次追加前都要先移除span然后再追加span

讲解结束,仔细看代码就能懂了。重点是理解动画只执行一次,我们依靠不断移除添加一次动画的span标签来实现动画效果。

注意:点击时候先移除已经有的span标签,确保button中的span始终是一个

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-29 23:25:14  更:2021-07-29 23:25:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/6 22:10:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码