当子元素高度过长需要在父元素中滚动并定位到顶部时,我们常常采用scrollIntoView。

Element.scrollIntoView() 方法让当前的元素滚动到浏览器窗口的可视区域内。

element.scrollIntoView(); // 等同于element.scrollIntoView(true)
element.scrollIntoView(alignToTop); // Boolean型参数
element.scrollIntoView(scrollIntoViewOptions); // Object型参数

参数 alignToTop: 一个boolean值

true:等价于 scrollIntoViewOptions: {block: “start”, inline: “nearest”}
false:等价于scrollIntoViewOptions: {block: “end”, inline: “nearest”}

scrollIntoViewOptions: 对象

behavior: 定义动画过度效果, ‘auto / smooth’ , 默认 ‘auto’
block:定义垂直方向的对齐, “start / center / end / nearest”。默认为 “start”。
inline 定义水平方向的对齐, “start/ center / end / nearest”。默认为 “nearest”

使用方法

scrollIntoView(id: string) {
    let element = document.getElementById(id);
    if (element) {
      element.scrollIntoView();
    }
  }

问题描述及解决办法

但是在最近的开发中我发现了关于scrollIntoView的两个小bug,其实很好解决的,如下:

问题一:当该页面最外层元素高度为100vh,其内部某个子元素滚动时,页面发生偏移,导致需要滚动的子元素上面的元素全部被遮盖并且滚动不回来。
在如下情境中当滚动的元素滚动时,页面描述被遮盖。滚动元素下方会出现大片留白。

在这里插入图片描述

这种情况很大可能是因为页面内某个元素的高度超过了100vh,需要我们自己去筛选核查。例如在此情景中,出现页面偏移就是因为右侧其他信息过长,导致整个页面高度被撑开。这个时候只需给右侧一个小于或等于页面的高度并设置滚动就可以了。

height:100%;
overfolw-y:auto;

问题二:滚动元素中的小标题被顶部导航栏覆盖

这个场景适用于整个页面滚动,还有使用href进行锚点定位的时候,滚动元素的小标题被导航栏遮盖。这个时候就需要我们来增大滚动元素的实际高度。聪明的你可能会想到用padding-top撑开元素高度,但是这个时候标题上方会有大片留白,导致页面不美观,这个时候我们就可以耍一个小聪明,我们可以用margin让元素回到原来的位置。如下:

padding-top:50px; //遮盖元素的高度,即导航栏高度
margin-top:-50px;

怎么样,这两个问题都很简单吧,如果还有疑问欢迎在评论区留言。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐