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 相关文章推荐
广泛收集的jQuery拖放插件集合
Apr 09 Javascript
js获取单选框或复选框值及操作
Dec 18 Javascript
datagrid框架的删除添加与修改
Apr 08 Javascript
jQuery JSON实现无刷新三级联动实例探讨
May 28 Javascript
js实现日期级联效果
Jan 23 Javascript
JavaScript中5种调用函数的方法
Mar 12 Javascript
JS+CSS实现表格高亮的方法
Aug 05 Javascript
Javascript实现的StopWatch功能示例
Jun 13 Javascript
js截取字符串功能的实现方法
Sep 27 Javascript
JQuery实现table中tr上移下移的示例(超简单)
Jan 08 jQuery
JS集合set类的实现与使用方法示例
Feb 01 Javascript
JS浮点数运算结果不精确的Bug解决
Aug 01 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
JavaScript 学习笔记 Black.Caffeine 09.11.28
2009/11/30 Javascript
Javascript实现飞动广告效果的方法
2015/05/25 Javascript
jQuery源码分析之sizzle选择器详解
2017/02/13 Javascript
js实现数字递增特效【仿支付宝我的财富】
2017/05/05 Javascript
利用HBuilder打包前端开发webapp为apk的方法
2017/11/13 Javascript
简单理解Vue中的nextTick方法
2018/01/30 Javascript
javascript中的隐式调用
2018/02/10 Javascript
bootstrap模态框关闭后清除模态框的数据方法
2018/08/10 Javascript
开发用到的js封装方法(20种)
2018/10/12 Javascript
vue中destroyed方法的使用说明
2020/07/21 Javascript
js编写简易的计算器
2020/07/29 Javascript
Vue 根据条件判断van-tab的显示方式
2020/08/03 Javascript
详解Typescript里的This的使用方法
2021/01/08 Javascript
urllib2自定义opener详解
2014/02/07 Python
在Mac OS上使用mod_wsgi连接Python与Apache服务器
2015/12/24 Python
python使用Pycharm创建一个Django项目
2018/03/05 Python
python使用tornado实现简单爬虫
2018/07/28 Python
浅谈Pycharm中的Python Console与Terminal
2019/01/17 Python
Django csrf 两种方法设置form的实例
2019/02/03 Python
python+selenium+Chrome options参数的使用
2020/03/18 Python
python 解决mysql where in 对列表(list,,array)问题
2020/06/06 Python
python实现数字炸弹游戏程序
2020/07/17 Python
python 操作excel表格的方法
2020/12/05 Python
html5 localStorage本地存储_动力节点Java学院整理
2017/07/06 HTML / CSS
Charlotte Tilbury澳大利亚官网:英国美妆品牌
2018/10/05 全球购物
Fenty Beauty官网:蕾哈娜创立的美妆品牌
2021/01/07 全球购物
会话Bean的种类
2013/11/07 面试题
说出ArrayList,Vector, LinkedList的存储性能和特性
2015/01/04 面试题
办公室内勤岗位职责范本
2013/12/09 职场文书
建设投标担保书
2014/05/13 职场文书
优秀电子工程系毕业生求职信
2014/05/24 职场文书
关于九一八事变的演讲稿2014
2014/09/17 职场文书
幼儿园小班家长评语
2014/12/30 职场文书
骨干教师个人总结
2015/02/11 职场文书
2015年父亲节活动总结
2015/02/12 职场文书
2019餐饮行业创业计划书!
2019/06/27 职场文书