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 实现的点击复制代码
Mar 24 Javascript
jQuery实现随意改变div任意属性的名称和值(部分原生js实现)
May 28 Javascript
纯Javascript实现ping功能的方法
Mar 20 Javascript
jQuery使用post方法提交数据实例
Mar 25 Javascript
Bootstrap框架下下拉框select搜索功能
Mar 26 Javascript
使用jquery/js获取iframe父子级、同级获取元素的方法
Aug 05 Javascript
js 判断登录界面的账号密码是否为空
Feb 08 Javascript
JS实现加载和读取XML文件的方法详解
Apr 24 Javascript
JS实现队列的先进先出功能示例
May 10 Javascript
利用Jasmine对Angular进行单元测试的方法详解
Jun 12 Javascript
Vue 一键清空表单的实现方法
Feb 07 Javascript
JS正则表达式验证密码强度
Mar 18 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 session 存储方式的详细介绍
2013/06/25 PHP
PHP错误处理函数
2016/04/03 PHP
PHP共享内存使用与信号控制实例分析
2018/05/09 PHP
JQuery 引发两次$(document.ready)事件
2010/01/15 Javascript
javascript 定义新对象方法
2010/02/20 Javascript
可以将word转成html的js代码
2010/04/11 Javascript
JavaScript中join()方法的使用简介
2015/06/09 Javascript
JavaScript使用DeviceOne开发实战(三)仿微信应用
2015/12/02 Javascript
浅谈JavaScript 数据属性和访问器属性
2016/09/01 Javascript
基于KO+BootStrap+MVC实现的分页控件代码分享
2016/11/07 Javascript
JavaScript仿百度图片浏览效果
2016/11/23 Javascript
微信小程序 省市区选择器实例详解(附源码下载)
2017/01/05 Javascript
详解js产生对象的3种基本方式(工厂模式,构造函数模式,原型模式)
2017/01/09 Javascript
javascript实现页面滚屏效果
2017/01/17 Javascript
Android中Okhttp3实现上传多张图片同时传递参数
2017/02/18 Javascript
Bootstrap导航中表单简单实现代码
2017/03/06 Javascript
JS字符串统计操作示例【遍历,截取,输出,计算】
2017/03/27 Javascript
AngularJS读取JSON及XML文件的方法示例
2017/05/25 Javascript
详解vue 组件之间使用eventbus传值
2017/10/25 Javascript
微信小程序实现通过双向滑动缩放图片大小的方法
2018/12/30 Javascript
[00:43]FTP典藏礼包 DOTA2三大英雄霸气新套装
2014/03/21 DOTA
[00:30]明星选手化身超级英雄!2018DOTA2亚洲邀请赛全明星赛来临!
2018/04/06 DOTA
[56:57]LGD vs VP 2019DOTA2国际邀请赛淘汰赛 胜者组赛BO3 第一场 8.20.mp4
2019/08/22 DOTA
Python enumerate索引迭代代码解析
2018/01/19 Python
Python使用Tkinter实现滚动抽奖器效果
2020/01/06 Python
Python 实现将某一列设置为str类型
2020/07/14 Python
Python-split()函数实例用法讲解
2020/12/18 Python
美国在线打印网站:Overnight Prints
2018/10/11 全球购物
购买正版游戏和游戏激活码:Green Man Gaming
2019/11/06 全球购物
应用艺术专业个人的自我评价
2014/01/03 职场文书
小学阳光体育活动总结
2014/07/05 职场文书
员工试用期自我鉴定范文
2014/09/15 职场文书
给校长的一封检讨书
2014/09/20 职场文书
2014乡镇党委副书记对照检查材料思想汇报
2014/10/09 职场文书
承诺书范本
2015/01/21 职场文书
捐书仪式主持词
2015/07/04 职场文书