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 function使用心得
May 10 Javascript
jquery实现类似淘宝星星评分功能实例
Sep 12 Javascript
浅谈Javascript的静态属性和原型属性
May 07 Javascript
JavaScript获取浏览器信息的方法
Nov 20 Javascript
HTML5 Shiv完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法
Nov 25 Javascript
bootstrap布局中input输入框右侧图标点击功能
May 16 Javascript
浅析JavaScript Array和string的转换(推荐)
May 20 Javascript
AngularJS 购物车全选/取消全选功能的实现方法
Aug 14 Javascript
JS删除String里某个字符的方法
Jan 06 Javascript
使用p5.js临摹动态图片
Nov 04 Javascript
微信小程序select下拉框实现源码
Nov 08 Javascript
从表单校验看JavaScript策略模式的使用详解
Oct 17 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中截取中文字符串的代码小结
2011/07/17 PHP
PHP 实现explort() 功能的详解
2013/06/20 PHP
PHP获取客户端及服务器端IP的封装类
2016/07/21 PHP
关于php unset对json_encode的影响详解
2018/11/14 PHP
phpmyadmin在宝塔面板里进不去的解决方案
2020/07/06 PHP
Javascript中 关于prototype属性实现继承的原理图
2013/04/16 Javascript
javascript解析json数据的3种方式
2014/05/08 Javascript
javascript中in运算符用法分析
2015/04/28 Javascript
jquery+css3问卷答题卡翻页动画效果示例
2016/10/26 Javascript
几行js代码实现自适应
2017/02/24 Javascript
微信小程序 wx:for的使用实例详解
2017/04/27 Javascript
jQuery实现标签子元素的添加和赋值方法
2018/02/24 jQuery
vue中使用gojs/jointjs的示例代码
2018/08/24 Javascript
JSON生成Form表单的方法示例
2018/11/21 Javascript
vue 解决mintui弹窗弹起来,底部页面滚动bug问题
2020/11/12 Javascript
python执行等待程序直到第二天零点的方法
2015/04/23 Python
使用Python写CUDA程序的方法
2017/03/27 Python
python 时间信息“2018-02-04 18:23:35“ 解析成字典形式的结果代码详解
2018/04/19 Python
基于python requests库中的代理实例讲解
2018/05/07 Python
Python根据当前日期取去年同星期日期
2019/04/14 Python
Python编写带选项的命令行程序方法
2019/08/13 Python
PyTorch 对应点相乘、矩阵相乘实例
2019/12/27 Python
Pytorch之finetune使用详解
2020/01/18 Python
python绘制玫瑰的实现代码
2020/03/02 Python
Python ADF 单位根检验 如何查看结果的实现
2020/06/03 Python
美国学校校服,儿童和婴儿服装:Cookie’s Kids
2016/10/14 全球购物
输入N,打印N*N矩阵
2012/02/20 面试题
传媒专业推荐信范文
2013/11/23 职场文书
党建示范点实施方案
2014/03/12 职场文书
《天安门广场》教学反思
2014/04/23 职场文书
公司开会通知
2015/04/20 职场文书
(开源)微信小程序+mqtt,esp8266温湿度读取
2021/04/02 Javascript
带你了解CSS基础知识,样式
2021/07/21 HTML / CSS
redis中lua脚本使用教程
2021/11/01 Redis
sentinel支持的redis高可用集群配置详解
2022/04/01 Redis
keepalived + nginx 实现高可用方案
2022/12/24 Servers