ol元素默认垂直布局,需用flex+white-space实现横向滚动;设display: flex、overflow-x: auto,并为li加flex-shrink: 0和white-space: nowrap;ios需加-webkit-overflow-scrolling: touch;原生序号消失时用counter-reset/increment恢复。

ol元素默认不支持横向滚动,必须用CSS强制改写布局
HTML的<ol></ol>天生是垂直流式布局,移动端不会自动变成横向滑动。直接加overflow-x: auto没用——因为子项<li>仍按块级元素换行堆叠,容器宽度还是撑满父容器,根本没“可滚动内容”。关键得先让<li>不换行、并排排列,再暴露横向溢出。
用flex + white-space实现横向排列+防换行
最稳的组合是给<ol></ol>设display: flex,再控制<li>为flex-shrink: 0(防止被压缩)和white-space: nowrap(防文字折行影响宽度)。别用inline-block——它受空白符影响,间隙难控;也别只靠float,清理浮动在flex时代已过时。
<ol class="horizontal-list"> <li>第一项</li> <li>第二项</li> <li>第三项</li> </ol>
.horizontal-list {<br> display: flex;<br> overflow-x: auto;<br> scroll-behavior: smooth;<br> -webkit-overflow-scrolling: touch; /* iOS惯性滚动 */<br>}<br>.horizontal-list li {<br> flex-shrink: 0;<br> white-space: nowrap;<br> padding: 0 12px;<br>}
-
-webkit-overflow-scrolling: touch必须加,否则iOS上滚动卡顿、无惯性 - 去掉
<ol></ol>默认的padding-left,否则左侧留白过大 - 如果
<li>内有图片或复杂结构,确保它们宽度固定或max-width: 100%,否则会撑破布局
序号丢失?用counter-reset + counter-increment手动补
flex布局下<ol></ol>的原生序号(1. 2. 3.)会消失——因为<li>脱离了文档流的计数上下文。得用CSS计数器自己实现:
.horizontal-list {<br> counter-reset: item;<br>}<br>.horizontal-list li {<br> counter-increment: item;<br relative>}<br>.horizontal-list li::before {<br> content: counters(item, ".") ". ";<br> position: absolute;<br> left: -24px;<br>}
- 不用
<ol></ol>的type属性(如type="A"),它在flex下完全失效 - 如果要支持多层嵌套序号(如1.1、1.2),用
counters(item, ".")而非counter(item) -
::before用position: absolute避免干扰<li>自身宽度计算
触摸体验差?加padding和min-width兜底
纯文字<li>在小屏上点击区域太小,容易误操作;同时某些安卓WebView对超窄元素滚动不敏感。必须给每个项设最小宽度和内边距:
- 加
min-width: 80px(根据字体大小调整),防止文字过短时滑动失灵 - 用
padding: 8px 16px扩大触控热区,别只依赖文字本身 - 禁用
user-select: none——虽然看起来“更像UI组件”,但会阻止长按复制,且对滚动无实质提升 - 测试时务必真机连Chrome DevTools远程调试,模拟器常漏掉
-webkit-overflow-scrolling失效问题
横向<ol></ol>不是改一个属性就能跑起来的事,序号、滚动惯性、触控反馈、响应式断点——每个点都得单独抠。尤其当<li>里塞了按钮或图标时,flex-shrink: 0和min-width谁先谁后,直接影响是否闪跳。动手前先在真机上测三遍宽度计算逻辑。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











