最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何利用HTML实现点击水波纹反馈效果_使用CSS transition与scale变换
时间:2026-06-23 09:55:54 编辑:袖梨 来源:一聚教程网
纯 CSS 的 :active 水波纹总从按钮中心炸开,因为 :active 无法读取点击坐标,圆心只能固定在 left: 50%、top: 50%;需 JavaScript 结合 getBoundingClientRect() 与 touches[0] 动态计算真实点击位置,并用 transform: translate(x, y) scale(s) 定位缩放,配合 will-change: transform 和 overflow: hidden 确保 Safari 兼容性。
为什么纯 CSS 的 :active 水波纹总从按钮中心炸开
因为 CSS 无法读取点击坐标,:active 只能触发预设动画,圆心固定在 left: 50%、top: 50%。这适合图标按钮或尺寸统一的场景,但用户点左下角时波纹却从正中弹出,反馈失真。
常见错误是以为加了 border-radius: 50% 和 transform: scale() 就够了——漏掉 position: relative,伪元素会相对于 body 定位;没设 overflow: hidden,波纹放大后会撑出圆角边界。
- 按钮必须声明
position: relative,否则::after找不到定位基准 -
::after必须含content: ""、position: absolute、border-radius: 50% - 动画只写
transition: transform 0.6s, opacity 0.6s,禁用transition: all - 加
pointer-events: none防止伪元素遮挡连续点击
移动端波纹失效?检查 touchstart 和 touch-action
iOS Safari 和部分安卓 WebView 对 click 有 300ms 延迟,且 :active 在无焦点元素上根本不会激活。仅靠 cursor: pointer 没用,那是桌面端逻辑。
必须用 JavaScript 监听 touchstart,并给按钮显式设置 touch-action: manipulation。否则 Safari 会等待判断是否双指缩放,导致波纹延迟或不触发。
立即学习“前端免费学习笔记(深入)”;
-
touch-action: manipulation要写在按钮自身上,父容器无效 - 移动端坐标必须取
e.touches[0].clientX,不是e.clientX - 若按钮是
<div>,需加tabindex="0"获取焦点,否则:active不生效 - 监听到
touchstart后,立即调用e.preventDefault()(仅当不需要滚动时)
用 getBoundingClientRect() 算坐标时最容易错哪几处
所有偏移问题都源于没把视口坐标转成相对坐标。浏览器里 e.clientX 是相对于整个窗口的,而伪元素的 left/top 是相对于最近的 position: relative 父元素——不转换就必然错位。
漏掉 const rect = button.getBoundingClientRect() 这一行,后面全白算。更隐蔽的坑是:嵌套了 transform 的容器里,e.offsetX 失真且 IE 不支持,必须坚持用 clientX - rect.left。
- 每次点击前先清空旧值:
button.style.setProperty('--x', '0px'),否则新波纹继承上一次位置 - 用
Math.max(0, Math.min(x, width - diameter))限制圆心不越界,避免波纹从按钮外侧“挤”进来 - 移动端必须用
e.touches?.[0] || e兼容 touch/click 双事件 - Safari 15.4 以下对
top/left + scale()组合有渲染 bug,强制改用transform: translate(x, y) scale(s)
Safari 卡顿、闪一下、边缘发虚怎么硬性修复
这些问题集中在高 DPR 屏幕和 Safari,跟缓动函数无关,是渲染管线层面的缺陷。不加 will-change: transform,Safari 就不触发硬件加速,首帧空白或卡顿;小数像素缩放引发 subpixel 插值模糊,导致边缘发虚。
最稳妥的组合是:transform: translate(-50%, -50%) scale(s) + will-change: transform + overflow: hidden。别信“加个 backface-visibility: hidden 就行”,它不如 will-change 有效。
- 伪元素必须加
will-change: transform,Safari 必须这个才走 GPU 渲染 - scale 目标值用
Math.round(s * 10) / 10截断小数,比如scale(2.345)→scale(2.3) - 父按钮加
overflow: hidden,否则 Safari 会裁切动画轨迹,尤其圆角按钮 - 动画结束必须手动移除节点或重置自定义属性,否则快速连点会残留多个波纹
真实项目里,最常被忽略的是 Safari 对 transform-origin 和 top/left 混用的兼容性断裂——它要求你彻底放弃 top/left 定位,只用 transform: translate(),哪怕多写两行 JS 计算也得换。
相关文章
- centos 时间戳转换办法 06-27
- centos 时间戳如何获取 06-27
- 如何查看CentOS文件系统UUID 06-27
- CentOS怎样管理文件系统权限 06-27
- 如何修复CentOS文件系统故障 06-27
- CentOS 如何选择适合的文件系统 06-27