You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

hover下划线动画不生效问题求助 前端新手开发疑问

问题原因

和normalize样式库无关,你的代码存在3个可直接导致动画不生效的问题:

  • 伪元素选择器多了无效空格:.nav-links ul li a ::after里a和::after之间的空格会被CSS解析为「选中a标签内部子元素的伪元素」,但你的a标签内只有纯文本没有子元素,所以这段样式根本没有挂载到目标元素上。
  • hover触发逻辑不匹配:你把::after伪元素定义在了a标签上,但hover触发的是li的::after,两者指向完全不同的元素,自然不会触发宽度变化。
  • 变量未定义(大概率存在的问题):代码里用到的--primary-400(下划线颜色)和--transition(过渡规则)是CSS自定义变量,如果你没在全局提前定义,对应的样式也会失效。

修复方案

你可以根据想要的下划线效果选择任意一种写法:

写法1:下划线和文字同宽(伪元素挂载在a标签上)

/* 前面的nav、img、nav-links等公共样式不需要修改 */
.nav-links ul li {
  display: inline-block;
  padding: 8px 12px;
}
.nav-links ul li a {
  color: #fff;
  font-size: 16px;
  text-decoration: none;
  position: relative;
}
/* 去掉a和::after之间的空格 */
.nav-links ul li a::after {
  content: "";
  width: 0%;
  height: 2px;
  background: var(--primary-400);
  display: block;
  margin: auto;
  transition: var(--transition);
}
/* 改为hover a的时候触发对应伪元素的宽度变化 */
.nav-links ul li a:hover::after {
  width: 100%;
}

/* 没定义自定义变量的话全局补上,参数可自行调整 */
:root {
  --primary-400: #f44336;
  --transition: 0.3s all ease;
}

写法2:下划线和li容器同宽(伪元素挂载在li标签上)

/* 前面的公共样式不需要修改 */
.nav-links ul li {
  display: inline-block;
  position: relative;
  padding: 8px 12px;
}
.nav-links ul li a {
  color: #fff;
  font-size: 16px;
  text-decoration: none;
}
/* 伪元素直接挂载到li上 */
.nav-links ul li::after {
  content: "";
  width: 0%;
  height: 2px;
  background: var(--primary-400);
  display: block;
  margin: auto;
  transition: var(--transition);
}
/* 你原先的hover触发逻辑不需要改 */
.nav-links ul li:hover::after {
  width: 100%;
}

/* 同样需要补上全局自定义变量定义 */
:root {
  --primary-400: #f44336;
  --transition: 0.3s all ease;
}

内容的提问来源于stack exchange,提问作者ḞLØҜȈ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 16:06:07