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 相关文章推荐
$.ajax json数据传递方法
Nov 19 Javascript
一些Javascript的IE和Firefox(火狐)兼容性的问题总结及常用例子
May 21 Javascript
jquery的Tooltip插件 qtip使用详细说明
Sep 08 Javascript
JS 对象属性相关(检查属性、枚举属性等)
Apr 05 Javascript
JS按条件 serialize() 对应标签的使用方法
Jul 24 Javascript
详解VueJS 数据驱动和依赖追踪分析
Jul 26 Javascript
如何把vuejs打包出来的文件整合到springboot里
Jul 26 Javascript
微信小程序地图导航功能实现完整源代码附效果图(推荐)
Apr 28 Javascript
JavaScript实现抖音罗盘时钟
Oct 11 Javascript
BootstrapValidator验证用户名已存在(ajax)
Nov 08 Javascript
VUEX 数据持久化,刷新后重新获取的例子
Nov 12 Javascript
vue-preview动态获取图片宽高并增加旋转功能的实现
Jul 29 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/09 PHP
PHP iconv 解决utf-8和gb2312编码转换问题
2010/04/12 PHP
PHP编码转换函数 自动转换字符集支持数组转换
2012/12/16 PHP
Symfony2学习笔记之模板用法详解
2016/03/17 PHP
自己动手开发jQuery插件教程
2011/08/25 Javascript
javascript用户注册提示效果的简单实例
2013/08/17 Javascript
Js操作Select大全(取值、设置选中等等)
2013/10/29 Javascript
利用JS来控制键盘的上下左右键(示例代码)
2013/12/14 Javascript
js限制文本框只能输入数字方法小结
2014/06/16 Javascript
javascript常用方法汇总
2014/12/02 Javascript
jquery.ajax之beforeSend方法使用介绍
2014/12/08 Javascript
基于javascript html5实现多文件上传
2016/03/03 Javascript
酷炫jQuery全屏3D焦点图动画效果
2016/03/22 Javascript
Bootstrap3制作搜索框样式的方法
2016/07/11 Javascript
深入分析javascript中console命令
2016/08/14 Javascript
Vue.js教程之计算属性
2016/11/11 Javascript
jQuery 控制文本框自动缩小字体填充
2017/06/16 jQuery
详解nodejs通过代理(proxy)发送http请求(request)
2017/09/22 NodeJs
详解Angular6 热加载配置方案
2018/08/18 Javascript
elementUI select组件value值注意事项详解
2019/05/29 Javascript
JavaScript实现串行请求的示例代码
2020/09/14 Javascript
javascript前端实现多视频上传
2020/12/13 Javascript
原生JavaScript实现随机点名表
2021/01/14 Javascript
详解ES6实现类的私有变量的几种写法
2021/02/10 Javascript
python中stdout输出不缓存的设置方法
2014/05/29 Python
详解pandas数据合并与重塑(pd.concat篇)
2019/07/09 Python
详解Django3中直接添加Websockets方式
2020/02/12 Python
Numpy中np.max的用法及np.maximum区别
2020/11/27 Python
HTML5通用接口详解
2016/06/12 HTML / CSS
全球第二大家装零售商:Lowe’s
2018/01/13 全球购物
大客户经理岗位职责
2015/04/09 职场文书
高中班长竞选稿
2015/11/20 职场文书
Python3 类型标注支持操作
2021/06/02 Python
python异常中else的实例用法
2021/06/15 Python
Python函数中的不定长参数相关知识总结
2021/06/24 Python
关于Spring配置文件加载方式变化引发的异常详解
2022/01/18 Java/Android