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 相关文章推荐
图片之间的切换
Jun 26 Javascript
jQuery 标题的自动翻转实现代码
Oct 14 Javascript
javascript控制swfObject应用介绍
Nov 29 Javascript
js window.onload 加载多个函数和追加函数详解
Jan 08 Javascript
jQuery删除一个元素后淡出效果展示删除过程的方法
Mar 18 Javascript
原生JS实现响应式瀑布流布局
Apr 02 Javascript
node.js调用C++开发的模块实例
Jul 03 Javascript
JavaScript实现的伸展收缩型菜单代码
Oct 14 Javascript
js实现三级联动效果(简单易懂)
Mar 27 Javascript
javascript设计模式 ? 解释器模式原理与用法实例分析
Apr 17 Javascript
Vue watch响应数据实现方法解析
Jul 10 Javascript
原生JS实现相邻月份日历
Oct 13 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
PHP并发多进程处理利器Gearman使用介绍
2016/05/16 PHP
浅谈PHP正则中的捕获组与非捕获组
2016/07/18 PHP
PHP中overload与override的区别
2017/02/13 PHP
php mysql数据库操作类(实例讲解)
2017/08/06 PHP
关于laravel模板中生成URL的几种模式总结
2019/10/18 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
jquery checkbox,radio是否选中的判断代码
2010/03/20 Javascript
JQuery最佳实践之精妙的自定义事件
2010/08/11 Javascript
css值转换成数值请抛弃parseInt
2011/10/24 Javascript
javascript中负数算术右移、逻辑右移的奥秘探索
2013/10/17 Javascript
jQuery实现指定区域外单击关闭指定层的方法【经典】
2016/06/22 Javascript
完美解决node.js中使用https请求报CERT_UNTRUSTED的问题
2017/01/08 Javascript
分析javascript原型及原型链
2018/03/18 Javascript
nodeJS模块简单用法示例
2018/04/21 NodeJs
如何利用@angular/cli V6.0直接开发PWA应用详解
2018/05/06 Javascript
关于微信小程序登录的那些事
2019/01/08 Javascript
Echarts实现单条折线可拖拽效果
2019/12/19 Javascript
Python实现的ini文件操作类分享
2014/11/20 Python
Python字符串逐字符或逐词反转方法
2015/05/21 Python
深入了解Python数据类型之列表
2016/06/24 Python
谈谈如何手动释放Python的内存
2016/12/17 Python
python中多个装饰器的执行顺序详解
2018/10/08 Python
Appium+python自动化怎么查看程序所占端口号和IP
2019/06/14 Python
pygame实现打字游戏
2021/02/19 Python
python环境搭建和pycharm的安装配置及汉化详细教程(零基础小白版)
2020/08/19 Python
Python request中文乱码问题解决方案
2020/09/17 Python
Huda Beauty官方商店:化妆和美容产品
2020/09/05 全球购物
大学毕业生自我鉴定
2013/11/05 职场文书
教导处工作制度
2014/01/18 职场文书
土木工程师职业规划范文
2014/03/07 职场文书
读书伴我成长演讲稿
2014/05/07 职场文书
HR求职自荐信范文
2014/06/21 职场文书
预防艾滋病宣传标语
2014/06/25 职场文书
小兵张嘎观后感
2015/06/03 职场文书
教务处教学工作总结
2015/08/10 职场文书
k-means & DBSCAN 总结
2021/04/27 Python