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 04 Javascript
JS常用字符串处理方法应用总结
May 22 Javascript
45个JavaScript编程注意事项、技巧大全
Feb 11 Javascript
JavaScript模拟实现继承的方法
Mar 30 Javascript
jquery插件jquery.beforeafter.js实现左右拖拽分隔条对比图片的方法
Aug 07 Javascript
JavaScript获取页面中超链接数量的方法
Nov 09 Javascript
jquery.validate表单验证插件使用详解
Jun 21 jQuery
JavaScript笛卡尔积超简单实现算法示例
Jul 30 Javascript
微信小程序iBeacon测距及稳定程序的实现解析
Jul 31 Javascript
vue-router两种模式区别及使用注意事项详解
Aug 01 Javascript
Vue form表单动态添加组件实战案例
Sep 02 Javascript
比较node.js和Deno
Apr 27 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
PHP6 mysql连接方式说明
2009/02/09 PHP
libmysql.dll与php.ini是否真的要拷贝到c:\windows目录下呢
2010/03/15 PHP
php HtmlReplace输入过滤安全函数
2010/07/03 PHP
destoon利用Rewrite规则设置网站安全
2014/06/21 PHP
php获取远程文件大小
2015/10/20 PHP
详解YII关联查询
2016/01/10 PHP
功能强大的PHP POST提交数据类
2016/07/15 PHP
thinkphp的dump函数无输出实例代码
2016/11/15 PHP
PHP实现的用户注册表单验证功能简单示例
2019/02/25 PHP
js实现倒计时时钟的示例代码
2013/12/17 Javascript
nodejs 整合kindEditor实现图片上传
2015/02/03 NodeJs
Javascript中的作用域和上下文深入理解
2015/07/03 Javascript
JavaScript实现删除,移动和复制文件的方法
2015/08/05 Javascript
javascript HTML5文件上传FileReader API
2020/03/27 Javascript
轻松掌握JavaScript享元模式
2016/08/27 Javascript
vue resource post请求时遇到的坑
2017/10/19 Javascript
使用sessionStorage解决vuex在页面刷新后数据被清除的问题
2018/04/13 Javascript
jQuery+CSS实现的标签页效果示例【测试可用】
2018/08/14 jQuery
koa-router路由参数和前端路由的结合详解
2019/05/19 Javascript
layUI的验证码功能及校验实例
2019/10/25 Javascript
Vue中父子组件的值传递与方法传递
2020/09/28 Javascript
Python中使用MELIAE分析程序内存占用实例
2015/02/18 Python
介绍Python中的fabs()方法的使用
2015/05/14 Python
Python实现的桶排序算法示例
2017/11/29 Python
python使用magic模块进行文件类型识别方法
2018/12/08 Python
详解python itertools功能
2020/02/07 Python
Django 实现对已存在的model进行更改
2020/03/28 Python
在Tensorflow中实现leakyRelu操作详解(高效)
2020/06/30 Python
如何用 Python 制作一个迷宫游戏
2021/02/25 Python
纯HTML+CSS3制作导航菜单(附源码)
2013/04/24 HTML / CSS
攀岩、滑雪、徒步旅行装备:Black Diamond Equipment
2019/08/16 全球购物
学校消防安全责任书
2014/07/23 职场文书
区政府领导班子个人对照检查材料
2014/09/25 职场文书
服务明星事迹材料
2014/12/29 职场文书
详解Python+OpenCV绘制灰度直方图
2022/03/22 Python
Vue3实现简易音乐播放器组件
2022/08/14 Vue.js