news 2026/7/23 22:44:37

HarmonyOS7 嵌套滚动:Scroll + List 嵌套滚动的正确姿势

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HarmonyOS7 嵌套滚动:Scroll + List 嵌套滚动的正确姿势

文章目录

      • 前言
      • 嵌套滚动的坑
      • 滚动嵌套冲突分析
      • Scroll 嵌套 List 的正确写法
      • NestedScroll 属性详解
      • 自定义嵌套滚动
      • 踩坑记录
      • 写在最后

前言

搞了半天嵌套滚动,手指一划——要么外层 Scroll 疯狂滚动内层 List 一动不动,要么两个一起滚然后卡死。说实话,嵌套滚动这玩意儿,没搞懂nestedScroll之前就是玄学。

今天把 Scroll 嵌套 List 的正确姿势整理一下,踩过的坑也一并分享。
做商品详情页、个人中心这类页面,几乎都会碰到一个结构:外层整体可滚动,内部又有个列表区域也要滚动。这种滚动套滚动的场景,天然就有冲突——你的手指在 List 上划,系统该把滚动事件给谁?

Android 那边处理嵌套滚动要搞NestedScrollingParent/Child一套接口,HarmonyOS7 就简单多了,一个属性搞定。但前提是——你得搞懂那几个枚举值到底是啥意思。

嵌套滚动的坑

先看看不处理嵌套滚动是啥效果:

@Entry@Componentstruct BadNestScroll{build(){Scroll(){Column(){Text('顶部Banner区域').width('100%').height(200).backgroundColor('#ffdddd').textAlign(TextAlign.Center)List(){ForEach([1,2,3,4,5,6,7,8],(item:number)=>{ListItem(){Text(`列表项${item}`).width('100%').height(80).textAlign(TextAlign.Center)}})}.width('100%').height(400)}}.width('100%').height('100%')}}

跑起来你会发现:手指在 List 区域滑动,只有 List 在滚,顶部的 Banner 纹丝不动。想先滚 Banner 再滚 List?做不到。

滚动嵌套冲突分析

说白了,嵌套滚动的核心问题就一个:滚动事件的分发顺序

当手指在 List 上滑动时,系统面临选择:

  • 把事件给 List → List 先滚,外层 Scroll 不动
  • 把事件给 Scroll → Scroll 先滚,List 不动
  • 两个都给 → 双层同时滚,体验很诡异

不同场景要的效果不一样。商品详情页要的是先滚外层(把 Banner 滚走),再滚内层(浏览列表)——这叫"外层优先"。

Scroll 嵌套 List 的正确写法

上代码:

@Entry@Componentstruct GoodNestScroll{build(){Scroll(){Column(){Text('顶部Banner区域').width('100%').height(200).backgroundColor('#ffdddd').textAlign(TextAlign.Center)List(){ForEach([1,2,3,4,5,6,7,8],(item:number)=>{ListItem(){Text(`列表项${item}`).width('100%').height(80).textAlign(TextAlign.Center)}})}.width('100%').height(400).nestedScroll({scrollForward:NestedScrollMode.PARENT_FIRST,scrollBackward:NestedScrollMode.SELF_FIRST})}}.width('100%').height('100%')}}

关键代码讲解:

  • .nestedScroll()—— 这是 List 组件上的属性,告诉系统"我嵌套在 Scroll 里了,滚动事件该怎么分"
  • scrollForward: NestedScrollMode.PARENT_FIRST——往下滑时(向末尾方向),先让外层 Scroll 滚。这样 Banner 会先滚走,等 Scroll 滚不动了,List 才开始滚
  • scrollBackward: NestedScrollMode.SELF_FIRST——往上滑时(向起始方向),先让 List 自己滚。用户回看列表项时不会突然跳到顶部

划重点:nestedScroll是设在子滚动组件上的,不是外层 Scroll 上!

NestedScroll 属性详解

nestedScroll接收NestedScrollOptions对象,两个方向各自配置:

参数含义
scrollForward往末尾端滚动时的模式(下滑)
scrollBackward往起始端滚动时的模式(上滑)

每个方向可选的NestedScrollMode枚举:

枚举值说明典型场景
SELF_ONLY只自己滚,不跟父组件联动不想联动的时候
SELF_FIRST自己先滚,滚到边缘后父组件滚回滚时先看列表
PARENT_FIRST父组件先滚,滚到边缘后自己滚下滑时先看 Banner
PARALLEL自己和父组件同时滚特殊联动效果

最常见的组合就是:

scrollForward: PARENT_FIRST // 下滑先滚外层 scrollBackward: SELF_FIRST // 上滑先滚内层

这也是评论区吸顶、商品详情页的标准配置。

自定义嵌套滚动

更复杂的场景怎么办?比如我要实现评论区吸顶——List 到顶部后"粘住",再往下滑只滚 List,不滚 Banner。

@Entry@Componentstruct StickyNestScroll{privatescroller:Scroller=newScroller()@StatelistHeight:number=500build(){Scroll(this.scroller){Column(){Text('文章内容区域').width('100%').height(300).backgroundColor('#ddeeff').textAlign(TextAlign.Center)Text('评论区').width('100%').height(48).backgroundColor('#eeeeee').textAlign(TextAlign.Center).fontWeight(FontWeight.Bold)List(){ForEach([1,2,3,4,5,6,7,8,9,10],(item:number)=>{ListItem(){Row(){Text(`用户${item}:`).fontWeight(FontWeight.Bold).fontSize(14)Text('这是一条评论内容...').fontSize(14).margin({left:8})}.width('100%').padding(16)}})}.width('100%').height(this.listHeight).edgeEffect(EdgeEffect.None).nestedScroll({scrollForward:NestedScrollMode.PARENT_FIRST,scrollBackward:NestedScrollMode.SELF_FIRST})}}.width('100%').height('100%').edgeEffect(EdgeEffect.Spring)}}

关键代码讲解:

  • Scroll(this.scroller)—— 传入 Scroller 控制器,后面可以通过代码控制外层滚动
  • List.edgeEffect(EdgeEffect.None)——关掉 List 的边缘效果,滚到头不会有弹性回弹,体验更干净
  • Scroll.edgeEffect(EdgeEffect.Spring)—— 外层用弹性效果,手感更好

如果想让吸顶更"刚",可以监听 Scroll 的onDidScroll回调,动态调整 List 的高度。

踩坑记录

坑 1:nestedScroll 设反了方向

scrollForward是往末尾方向,不是"向下"。如果你的布局是反的(比如某些 RTL 场景),Forward 和 Backward 的含义会变。跑起来不对,先检查方向

坑 2:List 高度不设或设成 100%

List 嵌套在 Scroll 里时,必须给 List 一个固定高度,不然它会把所有内容撑开,失去滚动能力。设成height('100%')也不行——那等于占满 Scroll,嵌套就没意义了。

坑 3:两个方向的 nestedScroll 设成一样

有些人图省事,Forward 和 Backward 都设PARENT_FIRST。结果是往上滑也先滚外层,用户回看列表时体验极差。两个方向要根据交互需求分别设。

坑 4:Scroller 控制自己

onDidScroll里用 Scroller 控制自己所在的组件滚动,会导致索引错乱或者无限循环。控制别的组件可以,控制自己不行。

写在最后

嵌套滚动这事儿,核心就两步:

  1. 给子滚动组件加.nestedScroll()
  2. Forward 用PARENT_FIRST,Backward 用SELF_FIRST

90% 的场景这招就够用了。剩下 10% 的复杂交互,再配合 Scroller 和onDidScroll手动控制。

别怕嵌套滚动,也别硬写手动滚动逻辑——nestedScroll就是专门干这事的。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/23 22:41:25

ESC框架知识点

安装ECS在PackageManager中搜索并安装Entities Graphics烘焙Entitypublic class FallingCubeSpawnerAuthoring : MonoBehaviour{public class Baker : Baker<FallingCubeSpawnerAuthoring>{public override void Bake(FallingCubeSpawnerAuthoring authoring){Entity spa…

作者头像 李华
网站建设 2026/7/23 22:38:45

自主可控建设指南:Serv-u替代方案,实现平滑迁移业务不中断

在国家信创深化落地背景下&#xff0c;政府机构、国央企全面推进境外软件替换工作&#xff0c;Serv-U替代成为政务数字化改造核心任务。Serv-U作为海外闭源FTP工具&#xff0c;存在底层不可控、信创适配缺失、高危漏洞频发等多重硬伤&#xff0c;无法满足《数据安全法》、等保2…

作者头像 李华
网站建设 2026/7/23 22:35:30

PCBA贴片加工中影响回流焊接的因素

一、回流焊接基本原理回流焊接是PCBA加工中用于现代电子设备组件焊接的重要工艺方法。其基本原理是通过回流炉的温度曲线控制&#xff0c;将预涂在焊点上的焊膏熔化并回流&#xff0c;从而实现元器件与电路板的牢固连接。回流焊接具有高效、自动化程度高、焊接质量稳定等优点&a…

作者头像 李华
网站建设 2026/7/23 22:19:02

单目双目结构光ToF视觉相机全解|底层成像测距原理、优劣对比、场景选型、车载机器人感知落地实战

目录 一、前言 二、四大视觉相机底层成像与测距核心原理 2.1 2D单目RGB相机:量产感知基础核心硬件 2.2 2.5D双目立体视觉相机:仿生被动式物理测距方案 2.3 3D结构光相机:室内高精度主动式三维感知方案 2.4 3D ToF飞行时间相机:低延迟低成本动态测距方案 三、四大视觉…

作者头像 李华
网站建设 2026/7/23 22:15:07

怎么判断滚筒线是不是源头厂家?跑厂十余年,教你避开中间商套路

做自动化设备这行十多年&#xff0c;跟着不少工厂老板外出考察滚筒线厂家。跟大家说句行业实在话&#xff0c;市面上鱼龙混杂&#xff0c;至少一半对外宣称源头工厂的商家&#xff0c;本质就是中间商。好多客户都踩过这个坑&#xff0c;签完合同之后才发现&#xff0c;设备层层…

作者头像 李华
网站建设 2026/7/23 22:03:09

集团企业必看!国内知名ERP厂商精选榜单发布

一、引言 2026年上半年国内企业数字化管理软件市场持续迭代&#xff0c;赛迪顾问最新行业数据显示&#xff0c;国内ERP市场整体规模达326.8亿元&#xff0c;国产厂商市场占比提升至76.2%&#xff0c;本土软件的技术适配性、落地实用性已全面适配国内企业经营管理需求。在企业管…

作者头像 李华