本文介绍一种实用方案:通过 javascript 动态判断文本是否溢出容器,仅在溢出时添加可 hover 触发的 css 滚动动画,避免短文本无效滚动,兼顾性能与体验。
在构建响应式 UI 组件(如标签芯片、状态徽章、单行信息卡片)时,常需实现「悬停滚动长文本」的效果。但若直接对所有元素统一启用 @keyframes 动画,会导致短文本也产生无意义的位移,影响可读性与视觉一致性。纯 CSS 无法检测内容溢出(offsetWidth > parent.clientWidth 等判定逻辑不可用),因此必须借助 JavaScript 进行运行时判断。
lass:仅当 scrollWidth > clientWidth 时,添加可交互的动画类。.chip-container {
max-width: 400px;
height: 32px;
font-size: 0.8125rem;
display: inline-flex;
align-items: center;
border-radius: 16px;
white-space: nowrap;
overflow: hidden;
background-color: #666;
color: white;
margin: 3px;
}
.chip-value {
display: inline-block;
position: relative;
margin: 0 5px;
text-overflow: clip; /* 防止默认省略号干扰 */
}
/* 可选:添加平滑过渡 */
.scrolled {
transition: transform 0.3s ease;
}
.scrolled:hover {
animation: scroll-rtl 15s linear forwards;
}
@keyframes scroll-rtl {
0% { transform: translateX(0); }
100% { transform: translateX(-100%); }
}Very very very very very very very very very very long text Short
// 页面加载后执行(推荐放在 DOMContentLoaded 或使用 defer)
document.addEventListener('DOMContentLoaded', () => {
document.querySelectorAll('.chip-value').forEach(el => {
const parent = el.parentElement;
// 关键判断:scrollWidth > parent.clientWidth(考虑 padding 和 border)
if (el.scrollWidth > parent.clientWidth) {
el.classList.add('scrolled');
}
});
});@media (prefers-reduced-motion: reduce) {
.scrolled:hover { animation: none; }
}虽然 CSS 动画简洁高效,但“按需启用”依赖运行时布局信息——这正是 JavaScript 的优势所在。本方案以最小侵入方式实现智能滚动:短文本静默展示,长文本悬停即动,语义清晰、兼容性强,是现代前端组件中值得复用的最佳实践。