CSS 在按钮上做个涟漪效果(Ripple Animation)

栏目: CSS · 发布时间: 7年前

内容简介:作为一个 CSS 渣,这次在看到一个 Vue 组件库的按钮里有个点按之后的效果之后跃跃欲试。效果大概长这样:

作为一个 CSS 渣,这次在看到一个 Vue 组件库的按钮里有个点按之后的效果之后跃跃欲试。

效果大概长这样:

CSS 在按钮上做个涟漪效果(Ripple Animation)

首先先观察了一番,大概得到以下特征:

  1. 以鼠标按下的位置为原点,以 某个值 为半径进行扩散
  2. 在长宽、以及透明度上,均有渐变

原本是 Vue 实现的,但剥离框架实现,就还得在 JavaScript 上哲学一番,为此,我实现了一个较为简单的效果,这篇文章基本上是逐行总结解读:

HTML 结构:

<button>
  <span class="background"></span>
  <span class="content">涟漪效果</span>
</button>

勿用说明,这个按钮是由内容和涟漪效果的背景组成的,内容在 Vue 中也就是 <slot> 进来的文本。

之后,大致写一些基本样式,和动画核心代码没有太大关系:

button {
  overflow: hidden;
  border: 1px solid #000;
  padding: 12px;
  cursor: pointer;
  position: relative;
  margin: 10px;
}

.content {
  position: relative;
  display: inline-block;
}

要实现这个效果,我们主要考虑的就是上述总结的两点,首先,如何以一个地方为中心点,向两边扩散。

为了获取鼠标位置,我们使用的是 event.offsetXevent.offsetY ,但是如果光这样对 background 进行绝对定位,达到的效果是以起始点为左上角开始的动画,为了变成中心点,我们自然想到了 transform: translate(-50%, -50%) ,成功把左上角转成了中心点。

接下来,我们需要确定动画中圆的半径,考虑到 button 通常都是宽 > 长的,所以取宽( button.clientWidth )为半径做圆。

另外,我们要保证鼠标点击在任一按钮区域都可以填充满,所以宽度至少需要为本身的 3 倍。

最终,我们的样式是:

{
    left: event.offsetX + 'px',
    top: event.offsetY + 'px',
    width: button.clientWidth * 3 + 'px',
    height: button.clientWidth * 3 + 'px'
}

全部准备完成之后,使用 transition 对我们的动画进行补间:

transition: width 3s ease, height 3s ease, opacity 1s ease;

全部的代码和效果见下方 jsfiddle 的演示:

但是,如果我们使用 CSS Houdini,整个动画的实现将会是非常容易的:

.ripple {
  --gradient: linear-gradient(to bottom right, deeppink, orangered);
  background: var(--gradient);
}
.ripple.animating {
  background: paint(ripple), var(--gradient);
}

效果可见: https://css-houdini.rocks/ripple/


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

一个人的电商

一个人的电商

许晓辉 / 电子工业出版社 / 2015-5-1 / CNY 59.00

首次披露电商的运营与操盘内幕,徐小平、梁宁作序,雷军、陈彤、张向东、刘韧、王峰力荐! 这个时代在经历前所未有的转型甚至颠覆,任何行业都将与互联网无缝融合,成为“互联网+”。有很多写电商的书,大多都用浓墨重彩阐释互联网转型的必要性,而讲到如何落地实操则浅尝即止,令人心潮澎拜之后不知如何下手。于是有了这本既有方法论,更重视实操细节的书。 许晓辉,在知名电商公司凡客诚品做过高管,有海......一起来看看 《一个人的电商》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

在线进制转换器
在线进制转换器

各进制数互转换器

随机密码生成器
随机密码生成器

多种字符组合密码