html5已废弃标签,须用css动画重写:横向滚动用@keyframes+translatex(),垂直滚动需同步容器高、行高与位移值,safari需加transform: translatez(0)稳定渲染。

HTML5 已废弃 <marquee></marquee> 标签,所有现代浏览器(Chrome 90+、Firefox 80+、Edge 90+、Safari 15+)默认不渲染或完全忽略它——这不是兼容性问题,而是标准移除。必须用 CSS 动画重写。
用 @keyframes + animation 模拟横向滚动
核心是把内容包裹进固定宽高的容器,用 transform: translateX() 实现平滑位移,避免重排开销:
.marquee {
overflow: hidden;
white-space: nowrap;
}
.marquee span {
display: inline-block;
animation: scroll-left 20s linear infinite;
}
@keyframes scroll-left {
0% { transform: translateX(100%); }
100% { transform: translateX(-100%); }
}注意点:
-
animation-duration值越小滚动越快,但低于 10s 容易造成文字闪动;建议按内容长度动态调整 - 必须设
white-space: nowrap防止换行打断滚动流 - 若内容过短,可复制一次文本(如
<span>text</span><span>text</span>)实现无缝循环
处理多行/垂直滚动时的常见翻车点
垂直滚动不能只改 translateY 就完事——父容器高度、子元素行高、动画起止值都要同步调整:
立即学习“前端免费学习笔记(深入)”;
.marquee-vertical {
height: 60px; /* 必须显式设高 */
overflow: hidden;
}
.marquee-vertical span {
display: block;
line-height: 60px; /* 行高 = 容器高 */
animation: scroll-down 4s linear infinite;
}
@keyframes scroll-down {
0% { transform: translateY(-60px); } /* 起始位置:上移一行 */
100% { transform: translateY(60px); } /* 结束位置:下移一行 */
}关键细节:
- 动画总位移需覆盖「一行高度 × 2」才能视觉无缝,否则会卡顿或留白
- 若用
flex布局替代block,line-height失效,得靠margin-top或padding手动对齐 - Safari 对
transform动画有渲染延迟,加will-change: transform可缓解
需要 JS 控制暂停/鼠标悬停时的最小安全写法
纯 CSS 的 :hover 暂停在部分安卓 WebView 和旧版 Safari 中失效,稳妥做法是用 JS 切换 class:
<div class="marquee" id="news-ticker"> <span>新闻1 | 新闻2 | 新闻3</span> </div>
对应 JS:
const el = document.getElementById('news-ticker');
el.addEventListener('mouseenter', () => el.classList.add('paused'));
el.addEventListener('mouseleave', () => el.classList.remove('paused'));CSS 补充:
.marquee.paused span {
animation-play-state: paused;
}注意:animation-play-state 不支持 transition,所以无法做淡入淡出效果;若需更精细控制(如点击跳转某条),就得用 JS 重置 animation 的 currentTime,但 iOS Safari 不支持该属性——这时候只能降级为 requestAnimationFrame 手动驱动。
最易被忽略的是字体抗锯齿和 subpixel rendering:Chrome 和 Firefox 在 transform 动画中默认启用亚像素渲染,而 Safari 有时会强制整像素对齐导致文字抖动。加 transform: translateZ(0) 或 backface-visibility: hidden 能强制 GPU 加速并稳定渲染,但会增加内存占用,长列表滚动时得权衡。











