用::after伪元素配合transform:scalex()实现居中展开下划线,需设position:relative、content:""、transform-origin:center及transition,避免width动画以提升性能。

用 ::after 伪元素配合 transform: scaleX() 实现居中展开
直接用 text-decoration: underline 无法控制动画起点,必须换伪元素方案。核心是让下划线初始缩放为 0、transform-origin: center,再通过 hover 触发 scaleX(1)。
- 下划线容器(如
a)需设position: relative,否则::after无法精确定位 -
::after必须设content: ""、display: block、height(建议2px)和background-color - 动画需加在
::after上,不是父元素;否则会触发重排,影响性能 - 推荐用
transform: scaleX(0)而非width: 0,前者 GPU 加速,更流畅
关键 CSS 属性组合与常见错误
很多人写完发现下划线不动或偏移,多半是这几点没对齐:
-
left: 50%+transform: translateX(-50%)是水平居中的安全写法,别只靠left: 0 - 漏写
transition: transform 0.3s ease—— 没这个就没有动画,只有瞬切 -
transform-origin: center必须写在::after上,且不能被其他transform覆盖(比如同时用了rotate) - 如果父元素有
padding或line-height异常,下划线 Y 轴位置容易错,用bottom: -2px微调更稳
完整可粘贴代码示例
/* 假设作用于链接 */
a {
position: relative;
color: inherit;
text-decoration: none;
}
a::after {
content: "";
position: absolute;
left: 50%;
bottom: -2px;
width: 100%;
height: 2px;
background-color: currentColor;
transform: translateX(-50%) scaleX(0);
transform-origin: center;
transition: transform 0.3s ease;
}
a:hover::after {
transform: translateX(-50%) scaleX(1);
}
注意:currentColor 让下划线自动继承文字颜色;若需固定色,把 currentColor 换成 #333 等值即可。
兼容性与移动端注意事项
这个方案在 Chrome/Firefox/Safari(含 iOS 14+)都跑得稳,但有两点容易被忽略:
- 旧版 Safari(transform-origin 在伪元素上生效,可加
-webkit-transform-origin: center兜底 - 移动端点击区域小,建议给
a加padding-bottom: 4px扩大热区,避免下划线太贴近文字难触发 - 如果页面用了
will-change: transform优化,只加在::after上,别加在父元素,否则可能引发渲染异常
真正卡住的往往不是写法,而是 transform-origin 的作用对象没搞清——它必须落在 ::after 元素自身,而不是父级。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











