
当容器内文本高度超出设定区域时,通过 JavaScript 动态检测并启用平滑垂直滚动动画,适用于实时交通信息板等需自适应长文本的场景。
当容器内文本高度超出设定区域时,通过 JavaScript 动态检测并启用平滑垂直滚动动画,适用于实时交通信息板等需自适应长文本的场景。
在铁路信息看板等实时数据展示场景中,via(经停站)等字段内容长度不可预知,常因文字过长导致溢出截断。为保障可读性,需实现「仅在内容真正溢出时才启动垂直自动滚动」的智能行为。核心思路是:用 JavaScript 精确比对元素实际内容高度与容器可视高度,动态启用/禁用滚动逻辑,避免无效动画消耗性能。
以下是一个轻量、兼容性强且无需第三方插件的纯 JS + CSS 实现方案:
✅ 正确检测垂直溢出
关键在于使用 scrollHeight(内容总高度)与 clientHeight(容器可视高度)对比,而非误用 clientWidth(原问题中水平检测逻辑被错误复用于垂直场景):
function setupVerticalScrollers(selector = '.rvias') {
document.querySelectorAll(selector).forEach(el => {
// 检查是否垂直溢出
if (el.scrollHeight > el.clientHeight) {
el.classList.add('autoscroll-active');
startVerticalMarquee(el);
} else {
el.classList.remove('autoscroll-active');
stopVerticalMarquee(el);
}
});
}
// 启动垂直滚动(基于 margin-top 位移)
function startVerticalMarquee(el) {
let pos = 0;
const speed = 0.3; // 像素/帧,可调
const resetHeight = el.scrollHeight;
function animate() {
pos += speed;
if (pos >= resetHeight - el.clientHeight) {
pos = 0;
el.style.marginTop = '0';
// 强制重排,确保下一帧从起点开始
void el.offsetHeight;
}
el.style.marginTop = `-${pos}px`;
requestAnimationFrame(animate);
}
// 清除已有动画(防重复绑定)
if (el._scrollAnimationId) {
cancelAnimationFrame(el._scrollAnimationId);
}
el._scrollAnimationId = requestAnimationFrame(animate);
}
function stopVerticalMarquee(el) {
if (el._scrollAnimationId) {
cancelAnimationFrame(el._scrollAnimationId);
el._scrollAnimationId = null;
}
el.style.marginTop = '0';
}
? 必备 CSS 样式(确保滚动生效)
.rvias {
position: relative;
overflow: hidden;
height: 4em; /* 固定可视高度,如 4 行文本 */
line-height: 1.2;
font-size: 1.6vh;
}
.rvias.autoscroll-active {
/* 启用滚动时允许内部位移 */
}
/* 可选:添加淡入淡出过渡增强可读性 */
.rvias::before,
.rvias::after {
content: '';
position: absolute;
left: 0;
width: 100%;
height: 1.5em;
pointer-events: none;
z-index: 1;
}
.rvias::before {
top: 0;
background: linear-gradient(to bottom, rgba(0,0,0,0.8), transparent);
}
.rvias::after {
bottom: 0;
background: linear-gradient(to top, rgba(0,0,0,0.8), transparent);
}
⚠️ 注意事项与优化建议
-
性能优先:使用
requestAnimationFrame替代setInterval,避免丢帧;滚动前务必检查scrollHeight > clientHeight,杜绝无意义动画; -
响应式适配:若容器尺寸随窗口变化(如
vh单位),应在resize事件中重新调用setupVerticalScrollers(); -
无障碍友好:为滚动区域添加
aria-live="polite",并在暂停/播放时更新aria-busy属性; -
jQuery 兼容提示:若坚持使用
jquery-scroller,请将原代码中clientWidth替换为clientHeight,scrollText[i].clientWidth→scrollText[i].scrollHeight,并确保direction: 'vertical'已正确生效(部分旧版插件需显式设置axis: 'y')。
最后,在 DOM 加载完成后初始化:
<script>
document.addEventListener('DOMContentLoaded', () => {
setupVerticalScrollers('.rvias');
// 如需响应窗口缩放
window.addEventListener('resize', () => {
setupVerticalScrollers('.rvias');
});
});
</script>
该方案零依赖、高可控,已在多块实时公交/铁路信息屏中稳定运行,兼顾视觉流畅性与系统资源效率。










