用::after实现按钮波纹效果需JS动态设置点击坐标并绑定CSS动画:按钮设relative定位和overflow:hidden;::after初始隐藏、圆形、居中定位;点击时计算相对坐标写入--x/--y变量;动画从scale(0)opacity(0.6)扩散至scale(3)opacity(0),结束保留状态。
用 ::after 伪元素实现按钮波
纹点击效果,核心是:在点击时动态生成一个圆形遮罩,从点击位置中心向外扩散、透明度渐隐。关键在于获取点击坐标、定位伪元素、触发动画。
按钮本身需设为相对定位(position: relative),以便 ::after 能以它为参考进行绝对定位。伪元素初始隐藏,尺寸为 0,圆角设为 50% 实现圆形。
position: relative; overflow: hidden;(防止波纹溢出)::after 设为 content: ""、position: absolute、border-radius: 50%
opacity: 0; transform: scale(0);
CSS 无法自动读取鼠标位置,必须用 JavaScript 在点击时计算并写入自定义属性(如 --x、--y),再由 ::after 读取。
click 事件event.clientX - button.getBoundingClientRect().left 算出相对于按钮的 X 坐标(同理算 Y)button.style.setProperty('--x', x + 'px') 和 --y 写入伪元素通过 CSS 变量定位,并用 @keyframes 控制扩散+淡出。动画需设为 forwards 保证结束状态保留(避免闪回)。
::after 定位:left: var(--x); top: var(--y); transform: translate(-50%, -50) scale(0);
scale(0) opacity(0.6) → scale(3) opacity(0)
transition: transform 0.4s ease, opacity 0.4s ease; 或直接用 animation
快速连点可能导致多个波纹叠加或定位错误。可加简单节流或重置逻辑:
::after 的 transform 和 opacity
getComputedStyle 检查是否正在动画中,跳过重复触发animationend 事件自动清空 --x/--y
基本上就这些。不复杂但容易忽略 JS 坐标计算和伪元素定位的配合。做好这几点,波纹就能稳稳从指尖绽开。