Skip to content

[文档] scrollIntoViewByNodeTop 方法的 offset 参数描述不准确 #248

@gocpplua

Description

@gocpplua

问题描述

文档中对 scrollIntoViewByNodeTop 方法的描述存在歧义,可能导致开发者误解其实际行为。

文档描述:

scrollIntoViewByNodeTop(nodeTop, offset, animate)

  • nodeTop: 需要滚动的view的top值(通过uni.createSelectorQuery()获取)
  • offset: 偏移量,单位为px

实际行为:
根据源码分析,offset 参数并不是滚动的偏移量,而是滚动后元素相对于视口顶部的目标位置

源码分析

// scroller.js 第 413-446 行
_scrollIntoViewByNodeTop(nodeTop, offset = 0, animate = false) {
    this._scrollToY(nodeTop, offset, animate, true);
},

_scrollToY(y, offset = 0, animate = false, addScrollTop = false) {
    // ...
    if (addScrollTop) {
       y += this.oldScrollTop; 
    }
    this.scrollTop = y - offset;  // 关键:最终 scrollTop = y - offset
}

从公式 scrollTop = (nodeTop + oldScrollTop) - offset 可以推导出:

  • 滚动变化量 = nodeTop - offset
  • 元素最终位置 = nodeTop - 滚动变化量 = offset

实际验证

我在开发朋友圈评论功能时,需要在键盘弹出后将评论按钮滚动到键盘上方。

  • 评论按钮当前 top = 699px
  • 键盘顶部相对于视口 = 426px
  • 评论按钮高度 = 23px
  • 期望评论按钮底部贴合键盘顶部,即评论按钮顶部位于 426 - 23 = 403px

调用 scrollIntoViewByNodeTop(699, 403) 后,评论按钮确实移动到了距视口顶部 403px 的位置,完美贴合键盘。

这证明 offset 的实际含义是"目标位置",而非"偏移量"

建议修改

将文档描述修改为:

scrollIntoViewByNodeTop(nodeTop, targetTop, animate)
- nodeTop: 需要滚动的view的top值(通过uni.createSelectorQuery()获取)
- targetTop: 滚动后元素距离视口顶部的目标位置,单位为px
- animate: 是否展示滚动动画,默认为否

或者保留 offset 命名,但明确说明:

scrollIntoViewByNodeTop(nodeTop, offset, animate)
- nodeTop: 需要滚动的view的top值(通过uni.createSelectorQuery()获取)
- offset: 滚动后元素距离视口顶部的位置,单位为px(注意:并非滚动偏移量)
- animate: 是否展示滚动动画,默认为否

环境信息

  • z-paging 版本:2.8.8
  • 平台:微信小程序

相关链接


Metadata

Metadata

Assignees

No one assigned

    Labels

    questionFurther information is requested

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions