scroll-view需显式设置高度或容器约束才能滚动,否则塌陷为0;横向滚动需scroll-x+white-space:nowrap;滚动操作必须在$nextTick中执行并配合boundingClientRect计算位置。

局部滚动不是加个 scroll-view 就能动的,必须显式控制高度或容器约束,否则在小程序里它会塌成 0 高度、不滚动也不报错。
scroll-view 必须设 height 才能纵向滚动
uni-app 的 scroll-view 默认不占空间,scroll-y="true" 单独写没用。它不像浏览器 div 那样自动撑开,必须通过 CSS 给一个明确的 height(或 max-height,但注意小程序不支持内容超长时自动出现滚动条)。
- 固定高度最稳妥:比如
style="height: 400px;",适合模块高度可预估的场景(如商品列表区、评论区) - 自适应高度需计算:用
uni.getSystemInfoSync().windowHeight减去上下模块高度,再赋给scroll-view;或者用 flex 布局让父容器占满,中间层flex: 1,scroll-view设height: 100% - 别信
max-height+overflow: auto:小程序里这组合无效,内容少时留白,内容多时不滚动
横向滚动只需 scroll-x + white-space: nowrap
横向工具栏、标签页滑动这类场景,核心就两点:scroll-x="true" 和子元素不换行。
- 外层
scroll-view必须设white-space: nowrap(写在 class 或style里),否则子view会自动折行,滚动失效 - 每个子项用
display: inline-block或flex横向排列,不能用block(默认会独占一行) - 慎用
scroll-left做初始偏移:它的单位是 px,不是 rpx;如果要居中某一项,得先用createSelectorQuery算出目标元素 left 值再赋值
滚动到底部/指定位置必须用 $nextTick + boundingClientRect
直接改 scroll-top 或 scroll-into-view 绑定值,常因 DOM 还未渲染而失效——尤其是动态追加数据后立即滚动。
- 必须套
this.$nextTick(() => { ... }),确保视图更新完成 - 用
uni.createSelectorQuery().select('#id').boundingClientRect()获取目标元素真实位置,再算出scroll-top值(例如:总高度 − 容器高度) -
scroll-into-view要求目标view有唯一id,且该id在数据更新后已存在于 DOM 中;上拉加载时,记得把新元素的id赋给scroll-into-view变量,而不是旧 id
嵌套滚动时父子 scroll-view 会互相干扰
页面顶部有吸顶栏、中间是 scroll-view、内部又嵌了一个横向 scroll-view,这时容易出现:内层一滚、外层也跳,或内层滚不动。
- 外层
scroll-view加enhanced="true"(仅 App 平台有效),启用增强模式减少嵌套冲突 - 避免同时开启父子的
scroll-y和scroll-x:比如外层纵滚、内层横滚,就关闭外层的scroll-x,内层关scroll-y - 真需要协同滚动(如聊天记录上拉加载后保持位置),靠
scroll-into-view+ 上一条数据的id控制,别依赖scroll-top数值同步
最易忽略的一点:所有高度计算和 DOM 查询,都得等数据渲染完再执行;mounted 钩子不一定够,尤其涉及异步加载或 v-for 动态列表时,$nextTick 不是可选项,是必选项。











