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 加速并稳定渲染,但会增加内存占用,长列表滚动时得权衡。






























