纯JavaScript -在Div中滚动IntoView

avwztpqn  于 2023-05-12  发布在  Java
关注(0)|答案(4)|浏览(128)

我需要将div中的某个元素(不是直接子元素)滚动到视图中。
基本上,我需要与ScrollIntoView提供的功能相同的功能,但是对于指定的父级(只有这个父级应该滚动)。
此外,我不可能使用任何第三方库。
我不太确定如何解决这个问题,因为我做的JavaScript开发非常有限。有人能帮我吗?
我发现this code可以满足我的需要,但不幸的是它需要jQuery,我无法将其转换为纯JavaScript。

nxagd54h

nxagd54h1#

我想我有一个开始。当你考虑这个问题时,你会想到让子div进入父div的可视区域。一种简单的方法是使用页面上的子位置相对于父位置在页面上的位置。然后考虑到滚动的父。这里有一个可能的实现。

function scrollParentToChild(parent, child) {

  // Where is the parent on page
  var parentRect = parent.getBoundingClientRect();
  // What can you see?
  var parentViewableArea = {
    height: parent.clientHeight,
    width: parent.clientWidth
  };

  // Where is the child
  var childRect = child.getBoundingClientRect();
  // Is the child viewable?
  var isViewable = (childRect.top >= parentRect.top) && (childRect.bottom <= parentRect.top + parentViewableArea.height);

  // if you can't see the child try to scroll parent
  if (!isViewable) {
        // Should we scroll using top or bottom? Find the smaller ABS adjustment
        const scrollTop = childRect.top - parentRect.top;
        const scrollBot = childRect.bottom - parentRect.bottom;
        if (Math.abs(scrollTop) < Math.abs(scrollBot)) {
            // we're near the top of the list
            parent.scrollTop += scrollTop;
        } else {
            // we're near the bottom of the list
            parent.scrollTop += scrollBot;
        }
  }

}

只需要像这样传递父节点和子节点:

scrollParentToChild(parentElement, childElement)

添加了一个在主元素甚至嵌套元素上使用此函数的演示
https://jsfiddle.net/nex1oa9a/1/

2nbm6dog

2nbm6dog2#

这个功能可以在几个步骤中实现。首先,使用childElement.getBoundingClientRect();获取子节点的位置,它将返回以下值

bottom : val
height: val
left: val
right: val
top: val
width: val

然后根据左上角的值将子元素放置到父元素中,保持子元素positionabsolute。父元素的position必须是relative类型,才能正确放置子元素并获得ScrollIntoView的效果。

childElement.style.position = 'absolute';
childElement.style.top = 'value in px';
childElement.style.left = 'value in px';
bis0qfac

bis0qfac3#

你可以做一些简单的事情,比如:

function customScroll(id) {
    window.location.href = "#mydiv"+id;
}

基本上window.location.href应该可以帮助你。

l7mqbcuq

l7mqbcuq4#

试试这个,我觉得很好用。

onArrowUp() {
    this.focus === null ? this.focus = 0 : (this.focus > 0 ? this.focus-- : null);
    this.items[this.focus].scrollIntoView({block: "nearest", behavior: "smooth"})
}

onArrowDown() {
    this.focus === null ? this.focus = 0 : (this.focus < this.items.length - 1 ? this.focus++ : null);        
    this.items[this.focus].scrollIntoView({block: "nearest", behavior: "smooth"})
}

方法onListUponListDown应在按下向上和向下箭头时调用。focus是元素数组的当前元素id。items是列表DOM元素的数组。

相关问题