跳转到主内容
极星编程网:以代码为星,赴技术山海!

uni-app怎么做类似于闲鱼的分类滑动菜单 uni-app水平滚动导航实现【代码】

正确姿势是:scroll-view需设宽高、white-space: nowrap,子项用inline-block+固定宽;滚动用scrollIntoView或计算offsetLeft居中;点击驱动current,scroll-end校准;禁用scroll-with-animation和可聚焦组件。 uni-app里用
scroll-view
实现水平滚动导航的正确姿势 直接说结论:不能只靠
scroll-x
开个开关就完事,得配合
white-space: nowrap
、
display: inline-block
和精确的
scroll-left
控制,否则在iOS和部分安卓WebView里会卡顿、跳项、甚至不滚动。 常见错误是把
scroll-view
当
div
用,里面塞一堆
view
却不设父容器宽度或子项排列方式——结果就是“看着写了滚动,实际点不动、滑不走、回弹错位”。
scroll-view
必须显式设置
width
和
height
(哪怕只是
height: 80rpx
),不能依赖内容撑开 子元素要用
display: inline-block
(不是
flex
),并加
white-space: nowrap
到父
scroll-view
上 每个分类项建议固定
width
(如
160rpx
),避免不同文字长度导致布局抖动 触发滚动时别直接改
scroll-left
为像素值,要用
scrollIntoView
或计算
offsetLeft
,否则H5端容易失准 点击分类自动居中滚动的实现逻辑(含兼容处理) 闲鱼那种“点哪个,哪个就滑到中间”,不是靠
scroll-to
,而是靠
scroll-into-view
+ 动态
id
,但uni-app的
scroll-into-view
在小程序和H5行为不一致:H5需要先
setTimeout
等DOM渲染完成,小程序则要确保
id
唯一且非动态生成。 典型翻车场景:用
v-for
循环生成
id="cate-{{index}}"
,但没加
:key
,导致Vue复用节点后
scroll-into-view
找不到目标。 每个分类
view
必须带
id
,且
id
值静态可预测(如
cate-0
、
cate-1
) H5端调用
this.$nextTick(() => { this.scrollLeft = ... })
比直接赋值更稳 想居中,不能只靠
scroll-into-view
,得手动算偏移:
scrollLeft = target.offsetLeft - (containerWidth - itemWidth) / 2
安卓低端机上频繁滚动可能丢帧,建议加
throttle
节流,300ms内最多触发一次 tab高亮同步与
current
状态管理的坑 很多人把
current
绑定到
scroll-view
的
scroll-left
,然后监听
scroll
事件反推当前项——这在快速滑动时极易误判,尤其列表项宽度不均或有padding时。 真正靠谱的方式是:只响应点击,滑动仅作视觉反馈;高亮状态完全由
data.current
驱动,滑动结束再用
scroll-end
事件校准一次(仅兜底)。 不要在
scroll
中实时计算当前项,性能差还不准;
scroll-end
才是唯一可信时机
current
变量必须是
Number
类型,别传字符串,否则
v-if
判断会失效 高亮样式别用
border-bottom
(安卓下常模糊),改用
box-shadow: 0 -4rpx 0 #ff6700
更清晰 如果分类过多(>15个),建议做懒加载:只渲染可视区域前后各2个,其余用占位
view
真机调试时iOS滚动卡顿的三个硬解法 iOS微信/支付宝小程序里
scroll-view
水平滚动卡,90%是因为开启了
scroll-with-animation
或者用了
transform
动画干扰了原生滚动线程。 别信“加
will-change: scroll-position
就行”,uni-app里这个CSS根本不起作用;真正有效的只有三条: 关掉
scroll-with-animation
,所有滚动用
scroll-left
赋值+
scrollIntoView
代替 整个
scroll-view
外层加
style="overflow: hidden;"
,防止父容器截断滚动事件 分类项内部禁用
input
、
textarea
、
picker
等可聚焦组件,iOS会强制切输入法上下文导致卡顿 复杂点在于:滑动惯性、回弹、边界吸附这些体验细节,uni-app没暴露底层API,只能靠反复测
scroll-left
变化速率+手写缓动函数模拟,这部分没标准解法,得按机型微调。

相关文章