For AI agents: the complete documentation index is available at /next/zh/llms.txt, the full documentation bundle is available at /next/zh/llms-full.txt, and this page is available as Markdown at /next/zh/api/elements/built-in/scroll-coordinator.md.
Lynx
  • 简体中文
  • <scroll-coordinator> XElement

    <scroll-coordinator> 是一个嵌套滚动协调组件,用于实现多层可滚动容器之间的联动滚动,常见于滚动吸顶等主流 APP 页面结构中,一般搭配 <viewpager><list> 等组件一起构建嵌套滚动 + 分页切换的复合场景。

    Info

    <scroll-coordinator> 通过 <scroll-coordinator-header><scroll-coordinator-slot> 对嵌套结构进行协调,实现以下效果:

    • 外层滚动到底部时,自动将滚动权交给内层
    • 内层滚动到顶部时,自动将滚动权交还外层
    • 滚动权的交接过程顺畅无断裂
    // ❌ 不支持:直接嵌套 listen
    <scroll-view id="outer">
      <list id="inner" />
    </scroll-view>
    
    // ✅ 支持:使用 scroll-coordinator 协调嵌套滚动
    <scroll-coordinator>
      <scroll-coordinator-header id="outer" />
      <scroll-coordinator-slot>
        <list id="inner" />
      </scroll-coordinator-slot>
    </scroll-coordinator>

    使用指南

    <scroll-coordinator> 的布局核心诉求是通过 CSS 控制:scroll-coordinator 的高度 == scroll-coordinator-slot 的高度 + toolbar 的高度

    布局规范

    • <scroll-coordinator>:纵向 flex 布局,display: flex; flex-direction: column;
    • <scroll-coordinator-header>:脱离布局流,position: absolute;
    • <scroll-coordinator-toolbar>:参与布局,display: flex;
    • <scroll-coordinator-slot>:填充剩余空间,flex: 1;
    .coordinator {
      width: 100%;
      height: 100%
      display: flex;
      flex-direction: column;
    }
    
    .coordinator-toolbar {
      display: flex;
      width: 100%;
    }
    
    .coordinator-header {
      position: absolute;
      width: 100%;
    }
    
    .coordinator-slot {
      width: 100%;
      flex-direction: column;
      flex: 1;
    }

    纵向协同滚动

    <scroll-coordinator-slot> 内须放置一个 <list> 完成纵向协同滚动

    <scroll-coordinator class="coordinator">
      <scroll-coordinator-header class="coordinator-header">
        <Header />
      </scroll-coordinator-header>
      <scroll-coordinator-slot class="coordinator-slot">
        <list />
      </scroll-coordinator-slot>
    </scroll-coordinator>

    内部横向分页滚动

    <scroll-coordinator-slot> 内部能够感知 <viewpager> 的页面切换事件,并与其中的 <list> 重新绑定嵌套滚动关系。

    <scroll-coordinator class="coordinator">
      <scroll-coordinator-header class="coordinator-header">
        <Header />
      </scroll-coordinator-header>
      <scroll-coordinator-slot class="coordinator-slot">
        <Tabs />
        <viewpager>
          <viewpager-item>
            <list />
          </viewpager-item>
        </viewpager>
      </scroll-coordinator-slot>
    </scroll-coordinator>

    整体下拉刷新

    <refresh><scroll-coordinator>进行包裹,并指定refresh-mode="fold" bounces={true},构建页面级别的下拉刷新效果

    <refresh>
      <refresh-header>
        <Loading />
      </refresh-header>
      <scroll-coordinator class="coordinator" bounces={true} refresh-mode="fold">
        <scroll-coordinator-header class="coordinator-header">
          <Header />
        </scroll-coordinator-header>
        <scroll-coordinator-slot class="coordinator-slot">
          <viewpager>
            <viewpager-item>
              <list />
            </viewpager-item>
          </viewpager>
        </scroll-coordinator-slot>
      </scroll-coordinator>
    </refresh>

    局部下拉刷新

    <refresh><scroll-coordinator-slot>内的<list>进行包裹,并指定refresh-mode="page" bounces={false},构建局部下拉刷新效果

    <scroll-coordinator class="coordinator" bounces={false} refresh-mode="page">
      <scroll-coordinator-header class="coordinator-header">
        <Header />
      </scroll-coordinator-header>
      <scroll-coordinator-slot class="coordinator-slot">
        <viewpager>
          <viewpager-item>
            <refresh>
              <refresh-header />
              <list />
            </refresh>
          </viewpager-item>
        </viewpager>
      </scroll-coordinator-slot>
    </scroll-coordinator>

    属性

    android-nested-scroll-as-child

    Android
    // @默认值: false
    'android-nested-scroll-as-child'?: boolean;

    Android foldview 基于 CoordinateLayout,但它仅实现了 NestedScrollingParent,因此不支持作为子组件嵌套在其他滚动组件中,将此属性设置为 true 可使其正常工作。

    bounces

    iOS
    Harmony
    // @默认值: true
    bounces?: boolean;

    当 coordinator 滚动超出边界时启用回弹效果。

    enable-scroll

    Android
    iOS
    Desktop
    Harmony
    // @默认值: true
    'enable-scroll'?: boolean;

    设置 coordinator 是否可以垂直滚动。

    enable-scroll-bar

    iOS
    Harmony
    // @默认值: false
    'enable-scroll-bar'?: boolean;

    设置 coordinator 滚动时滚动条是否可见。

    granularity

    Android
    iOS
    Desktop
    Harmony
    // @默认值: 0.01
    granularity?: number;

    bindoffset 的事件响应粒度,一旦滚动距离超过可滚动距离的 granularity 倍,即可能触发。默认值为 0.01,但不一定每 0.01 都会触发。

    header-over-slot

    Android
    iOS
    Desktop
    Harmony
    // @默认值: false
    'header-over-slot'?: boolean;

    此属性控制 header 层级是否高于 slot,当 header 溢出时,将显示在 slot 之上。否则,将显示在 slot 之下。建议显式设置此属性,而不是使用默认值。

    ios-force-scroll-detach

    iOS
    // @默认值: false
    'ios-force-scroll-detach'?: boolean;

    是否强制使 foldview 的 nested-vertical-scroll-behavior 在 iOS 上失效,此设置对其他平台无效。

    ios-scrolls-to-top

    iOS
    // @默认值: false
    'ios-scrolls-to-top'?: boolean;

    当用户点击状态栏时,距离状态栏最近的触摸下方的滚动视图将滚动到顶部。仅限 iOS 功能。

    refresh-mode

    iOS
    // @默认值: 'none'
    'refresh-mode'?: 'page' | 'none' | 'fold';

    foldview 的下拉刷新模式,none(无,默认值)、page(分类下拉刷新)、fold(整体下拉刷新)。

    事件

    前端可以绑定相应的事件回调来监听元素的运行时行为,如下所示。

    bindoffset

    Android
    iOS
    Desktop
    Harmony
    bindoffset = (e: ScrollCoordinatorOffsetEvent) => {};
    字段类型是否可选默认值平台版本描述
    height数字
    Android
    iOS
    Desktop
    Harmony
    可滚动距离的绝对值(header 高度 - toolbar 高度),单位为 px
    offset数字
    Android
    iOS
    Desktop
    Harmony
    header 滚动偏移量的绝对值,单位为 px

    折叠进度回调

    方法

    前端可以通过 SelectorQuery API 调用组件方法。

    setFoldExpanded

    
    lynx.createSelectorQuery()
         .select('#id')
         .invoke({
          method: 'setFoldExpanded',
          params: {
            /**
             * 偏移量,支持 px 和 rpx
             * @Android
             * @iOS
             * @Harmony
             * @Web
             * @PC
             */
            offset: '0px',
            /**
             * 折叠时是否需要动画
             * @Android
             * @iOS
             * @Harmony
             * @Web
             * @PC
             */
            smooth: true,
          },
          success: function (res) {},
          fail: function (res) {},
        })
        .exec();
    

    兼容性

    LCD tables only load in the browser

    除非另有说明,本项目采用知识共享署名 4.0 国际许可协议进行许可,代码示例采用 Apache License 2.0 许可协议进行许可。