js 实现Material UI点击涟漪效果示例


Posted in Javascript onSeptember 23, 2022

正文

我个人而言还是挺喜欢Material UI这套设计风格的。一些细节方面做的还不错。就比如今天要给大家分享的点击涟漪效果。Material UI里面叫做Ripples。好了,话不多说,开始吧。

HTML

<div class="example">Click me</div>

CSS

.example {
    position: relative;
    width: 300px;
    height: 300px;
    line-height: 300px;
    text-align: center;
    margin-top: 30px;
    box-shadow: 0 2px 4px -1px #0003, 0 4px 5px #00000024, 0 1px 10px #0000001f;
    overflow: hidden;
    cursor: pointer;
    user-select: none;
    -webkit-tap-highlight-color: transparent;
}
.ripple {
    position: absolute;
    border-radius: 50%;
    background-color: #0000001a;
    animation: ripple 225ms cubic-bezier(0, 0, .2, 1) forwards;
    transform: scale3d(0, 0, 0);
    pointer-events: none;
}
@keyframes ripple {
    from {
        transform: scale3d(0, 0, 0);
    }
    to {
        transform: scale3d(1, 1, 1);
    }
}

JS

const exampleEl = document.querySelector('.example');
// 移动端触发顺序 touchstart => touchend => mousemove => mousedown => mouseup => click
// 文档https://w3c.github.io/touch-events/#mouse-events
let rippleEl = null, startTime, isMouseup = false;
// touchstart
function handleTouchstart(e) {
    createRipple(e);
}
// touchend
function handleTouchend(e) {
    removeRipple(e);
    // 阻止mouse事件触发
    e.preventDefault();
}
// touchcancel
function handleTouchcancel(e) {
    removeRipple(e);
}
// mousedown
function handleMousedown(e) {
    // 避免mouseup,mouseleave重复执行
    isMouseup = false;
    createRipple(e);
}
// mouseup
function handleMouseup(e) {
    isMouseup = true;
    removeRipple(e);
}
// mouseleave
function handleMouseleave(e) {
    if (isMouseup || rippleEl === null) {
        return;
    }
    removeRipple(e)
}
// 创建ripple
function createRipple(e) {
    startTime = e.timeStamp;
    const current = { x: e.clientX, y: e.clientY }
    if (e.type === 'touchstart') {
        current.x = e.touches[0].clientX;
        current.y = e.touches[0].clientY;
    }
    const rect = exampleEl.getBoundingClientRect();
    const vertex = {
        nw: { x: rect.left, y: rect.top },
        ne: { x: rect.left + rect.width, y: rect.top },
        se: { x: rect.left + rect.width, y: rect.top + rect.height },
        sw: { x: rect.left, y: rect.top + rect.height }
    }
    let max = 0;
    for (const key in vertex) {
        // ripple半径
        const radius = getDistance({ x: current.x, y: current.y }, vertex[key]);
        max = Math.max(max, radius);
    }
    rippleEl = document.createElement('div');
    rippleEl.className = 'ripple';
    rippleEl.style.left = (current.x - rect.left - max) + 'px';
    rippleEl.style.top = (current.y - rect.top - max) + 'px';
    rippleEl.style.width = (max * 2) + 'px';
    rippleEl.style.height = (max * 2) + 'px';
    exampleEl.appendChild(rippleEl);
}
// 移除ripple
function removeRipple(e) {
    if (e.timeStamp - startTime > 225) {
        rippleEl.remove();
        rippleEl = null;
    } else {
        // 采用animation属性实现动画效果。相比transition的好处在于不用手动触发重绘
        rippleEl.addEventListener('animationend', function () {
            this.remove();
            if (this === rippleEl) {
                rippleEl = null;
            }
        });
    }
}
// 绑定事件
exampleEl.addEventListener('mousedown', handleMousedown);
exampleEl.addEventListener('mouseup', handleMouseup);
exampleEl.addEventListener('mouseleave', handleMouseleave);
exampleEl.addEventListener('touchstart', handleTouchstart);
exampleEl.addEventListener('touchend', handleTouchend);
exampleEl.addEventListener('touchcancel', handleTouchcancel);
/**
 * 获取两点间距离
 * @param {object} a 第一个点坐标
 * @param {object} b 第二个点坐标
 * @returns
 */
function getDistance(a, b) {
    const x = a.x - b.x;
    const y = a.y - b.y;
    return Math.hypot(x, y); // Math.sqrt(x * x + y * y);
}

实现效果 

js 实现Material UI点击涟漪效果示例

以上就是js 实现Material UI点击涟漪效果示例的详细内容,更多关于js Material UI点击涟漪效果的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
细品javascript 寻址,闭包,对象模型和相关问题
Apr 27 Javascript
jQuery.Validate 使用笔记(jQuery Validation范例 )
Jun 25 Javascript
一个非常全面的javascript URL解析函数和分段URL解析方法
Apr 12 Javascript
js实现网页右上角滑出会自动消失大幅广告的方法
Feb 27 Javascript
jquery判断input值不为空的方法
Jun 05 Javascript
Angular JS数据的双向绑定详解及实例
Dec 31 Javascript
jQuery实现遍历复选框的方法示例
Mar 06 Javascript
PHP 实现一种多文件上传的方法
Sep 20 Javascript
fetch 使用及如何接收JS传值
Nov 11 Javascript
vue elementUI table表格数据 滚动懒加载的实现方法
Apr 04 Javascript
解决LayUI数据表格复选框不居中显示的问题
Sep 25 Javascript
package.json中homepage属性的作用详解
Mar 11 Javascript
js 实现验证码输入框示例详解
Sep 23 #Javascript
TypeScript 内置高级类型编程示例
Sep 23 #Javascript
详解Anyscript开发指南绕过typescript类型检查
Sep 23 #Javascript
js基于div丝滑实现贝塞尔曲线
Sep 23 #Javascript
TS 类型兼容教程示例详解
Sep 23 #Javascript
TS 类型收窄教程示例详解
Sep 23 #Javascript
JavaScript实现简单的音乐播放器
Aug 14 #Javascript
You might like
PHPMailer 中文使用说明小结
2010/01/22 PHP
备份mysql数据库的php代码(一个表一个文件)
2010/05/28 PHP
php编写的简单页面跳转功能实现代码
2013/11/27 PHP
PHP使用ODBC连接数据库的方法
2015/07/18 PHP
laravel 查询数据库获取结果实现判断是否为空
2019/10/24 PHP
Aster vs KG BO3 第一场2.18
2021/03/10 DOTA
jquery 事件执行检测代码
2009/12/09 Javascript
jquery sortable的拖动方法示例详解
2014/01/16 Javascript
Javascript学习笔记之函数篇(五) : 构造函数
2014/11/23 Javascript
javascript中indexOf技术详解
2015/05/07 Javascript
微信小程序 表单Form实例详解(附源码)
2016/12/22 Javascript
Angular4学习教程之DOM属性绑定详解
2018/01/04 Javascript
vue通过点击事件读取音频文件的方法
2018/05/30 Javascript
JavaScript 2018 中即将迎来的新功能
2018/09/21 Javascript
通过原生vue添加滚动加载更多功能
2019/11/21 Javascript
小程序如何定位所在城市及发起周边搜索
2020/02/11 Javascript
react结合bootstrap实现评论功能
2020/05/30 Javascript
[02:04]2020年夜魇暗潮预告片
2020/10/30 DOTA
[54:18]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS BO3 第一场 1月22日
2021/03/11 DOTA
Python中的测试模块unittest和doctest的使用教程
2015/04/14 Python
利用numpy+matplotlib绘图的基本操作教程
2017/05/03 Python
创建pycharm的自定义python模板方法
2018/05/23 Python
Python实现模拟浏览器请求及会话保持操作示例
2018/07/30 Python
python实现Excel文件转换为TXT文件
2019/04/28 Python
python程序变成软件的实操方法
2019/06/24 Python
Form表单及django的form表单的补充
2019/07/25 Python
使用Keras画神经网络准确性图教程
2020/06/15 Python
Python爬虫实战案例之爬取喜马拉雅音频数据详解
2020/12/07 Python
利用python+request通过接口实现人员通行记录上传功能
2021/01/13 Python
描述RIP和OSPF区别以及特点
2015/01/17 面试题
捐书寄语赠言
2014/01/18 职场文书
计算机应届毕业生自荐信范文
2014/02/23 职场文书
走进敬老院活动总结
2014/07/10 职场文书
党的群众路线教育实践活动心得体会(医院)
2014/11/03 职场文书
银行柜员优质服务心得体会
2016/01/22 职场文书
win10电脑双屏显示一个黑屏怎么办?win10电脑双屏显示一个黑屏解决方法
2022/07/15 数码科技