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 相关文章推荐
js中创建对象的几种方式示例介绍
Jan 26 Javascript
让input框实现类似百度的搜索提示(基于jquery事件监听)
Jan 31 Javascript
Javascript对象Clone实例分析
Jun 09 Javascript
极易被忽视的javascript面试题七问七答
Feb 15 Javascript
jQuery判断元素是否显示 是否隐藏的简单实现代码
May 19 Javascript
jquery的 filter()方法使用教程
Mar 22 jQuery
Vue编程式跳转的实例代码详解
Jul 10 Javascript
vue项目中极验验证的使用代码示例
Dec 03 Javascript
JS获取当前时间的年月日时分秒及时间的格式化的方法
Dec 18 Javascript
vue和小程序项目中使用iconfont的方法
May 19 Javascript
Vue记住滚动条和实现下拉加载的完美方法
Jul 31 Javascript
微信小程序基于高德地图API实现天气组件(动态效果)
Oct 22 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代码(星期六,星期日总和)
2009/11/12 PHP
PHP XML操作的各种方法解析(比较详细)
2010/06/17 PHP
PHP获取photoshop写入图片文字信息的方法
2015/03/31 PHP
PHP实现的大文件切割与合并功能示例
2018/04/10 PHP
Yii2框架自定义类统一处理url操作示例
2019/05/25 PHP
JS控件autocomplete 0.11演示及下载 1月5日已更新
2007/01/09 Javascript
根据判断浏览器类型屏幕分辨率自动调用不同CSS的代码
2007/02/22 Javascript
Gird事件机制初级读本
2007/03/10 Javascript
csdn 论坛技术区平均给分功能
2009/11/07 Javascript
js 利用image对象实现图片的预加载提高访问速度
2013/03/29 Javascript
jQuery中:visible选择器用法实例
2014/12/30 Javascript
AngularJs IE Compatibility 兼容老版本IE
2016/09/01 Javascript
Js动态设置rem来实现移动端字体的自适应代码
2016/10/14 Javascript
完美解决JS文件页面加载时的阻塞问题
2016/12/18 Javascript
JS实现的五级联动菜单效果完整实例
2017/02/23 Javascript
微信小程序开发入门基础教程
2017/04/19 Javascript
bootstrap table使用入门基本用法
2017/05/24 Javascript
js实现轮播图的完整代码
2020/10/26 Javascript
vue实现一个炫酷的日历组件
2018/10/08 Javascript
vue-cli3 karma单元测试的实现
2019/01/18 Javascript
es6中let和const的使用方法详解
2020/02/24 Javascript
python实现在sqlite动态创建表的方法
2015/05/08 Python
python机器学习理论与实战(四)逻辑回归
2018/01/19 Python
tensorflow实现softma识别MNIST
2018/03/12 Python
Linux下python3.7.0安装教程
2018/07/30 Python
Python字符串逆序的实现方法【一题多解】
2019/02/18 Python
python实现将列表中各个值快速赋值给多个变量
2020/04/02 Python
python多进程 主进程和子进程间共享和不共享全局变量实例
2020/04/25 Python
详解css3 flex弹性盒自动铺满写法
2020/09/17 HTML / CSS
学习党课思想汇报
2013/12/29 职场文书
迷你西餐厅创业计划书范文
2013/12/31 职场文书
运动会表扬稿大全
2014/01/16 职场文书
学生干部的自我评价分享
2014/01/18 职场文书
2014新年元旦活动策划方案
2014/02/18 职场文书
党风廉政承诺书
2014/03/27 职场文书
迎新生标语大全
2014/10/06 职场文书