实现按钮涟漪效果

看到越来越多的App都会在点击的时候呈现一个涟漪的效果,好奇是怎么实现的。

效果

自己想了几个方案,发现都不太好实现。搜集了一些资料之后发现其实并不难,甚至也不需要jQuery。

先讲讲大体思路:

1,涟漪由按钮内的子元素去做,这个子元素脱离文档流,故不改变按钮内容的布局

2,点击按钮时,把点击坐标记录下来,作为涟漪的圆心

3,创建涟漪子元素,设置好圆心

4,把它添加到按钮里面去,它被渲染进DOM之后就会播放CSS动画

5,设置 timeout,在动画时长后把涟漪从按钮里删除

代码:

HTML

<div class="btn">
  <p>Button</p>
</div>

CSS

.btn {
  width: 100px;
  height: 50px;
  background-color: green;
  border-radius: 10px;
  position: relative;  /* 必须 */
  overflow: hidden;    /* 必须 */
}

.btn > p {
  text-align: center;
}

.btn > span {
  position: absolute;  /* 必须 */
  transform: translate(-50%, -50%);  /* 必须 */
  background: white;
  border-radius: 50%;
  animation: .75s ripple;  /* 必须 */
}

@keyframes ripple {
  from {
    width: 0px;
    height: 0px;
    opacity: .5;
  }
  to {
    width: 200px;
    height: 200px;
    opacity: 0;
  }
}

JS

const btn = document.querySelector('.btn');

btn.addEventListener('mousedown', function(e){
  const left = e.clientX - e.currentTarget.offsetLeft;
  const top = e.clientY - e.currentTarget.offsetTop;
  const rip = document.createElement('span');
  rip.style.left = left + 'px';
  rip.style.top = top + 'px';
  btn.appendChild(rip);
  setTimeout(()=>{rip.remove()}, 750);
})

源码:
https://jsbin.com/haxeyonuvo/1/edit?html,css,js,output

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 实现向右移动动画 如果我们想要一个按钮,控制一个div向右移动的动画效果,该怎么实现呢? 有三种实现的方法,下面我...
    LvyHuang阅读 470评论 0 0
  • 精选的四十五道vue自测题,每五道题公布一次答案。 一、 html js 问号处应该填入什么,才能使得 span ...
    littleyu阅读 1,487评论 0 14
  • vue.js网址:https://cn.vuejs.org/v2/guide/[https://cn.vuejs....
    MrTon_1965阅读 531评论 0 0
  • 主要通过更换 css 上的 animation 来实现涟漪效果。 但是大部分的实现方法会增加一个空白节点, 所以想...
    littleyu阅读 494评论 0 0
  • 1: DOM0 事件和DOM2级在事件监听使用方式上有什么区别?DOM0的事件添加形式为: 优点是:处理程序在元素...
    向前冲冲的蜗牛阅读 641评论 0 0