Javascript scrollIntoView()居中对齐



Javascript .scrollIntoView(boolean)仅提供两个对齐选项。

  1. 顶部
  2. 底部

如果我想这样滚动视图怎么办。我想把特定的元素放在页面中间的某个地方吗?

试试这个:

 document.getElementById('myID').scrollIntoView({
            behavior: 'auto',
            block: 'center',
            inline: 'center'
        });

有关更多信息和选项,请参阅此处:https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView

使用getBoundingClientRect()可以获得实现此目标所需的所有信息。例如,你可以这样做:

const element = document.getElementById('middle');
const elementRect = element.getBoundingClientRect();
const absoluteElementTop = elementRect.top + window.pageYOffset;
const middle = absoluteElementTop - (window.innerHeight / 2);
window.scrollTo(0, middle);

演示:http://jsfiddle.net/cxe73c22/

这个解决方案比在公认的答案中走上父链更高效,并且不涉及通过扩展原型来污染全局范围(在javascript中通常被认为是糟糕的做法)。

所有现代浏览器都支持getBoundingClientRect()方法。

为此使用window.scrollTo()。获取要移动到的元素的顶部,然后减去窗口高度的一半。

演示:http://jsfiddle.net/ThinkingStiff/MJ69d/

Element.prototype.documentOffsetTop = function () {
    return this.offsetTop + ( this.offsetParent ? this.offsetParent.documentOffsetTop() : 0 );
};
var top = document.getElementById( 'middle' ).documentOffsetTop() - ( window.innerHeight / 2 );
window.scrollTo( 0, top );
document.getElementById("id").scrollIntoView({block: "center"});

如果元素的父元素具有css:overflow: scroll; ,则滚动到元素的中间效果良好

如果它是一个垂直列表,您可以使用document.getElementById("id").scrollIntoView({block: "center"});,它会将您选择的元素滚动到父元素的垂直中间。

为Gregory R.和Hakuna的良好回答干杯。

进一步阅读:

https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView

https://developer.mozilla.org/en-US/docs/Web/CSS/overflow

您可以通过两个步骤完成:

myElement.scrollIntoView(true);
var viewportH = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
window.scrollBy(0, -viewportH/2); // Adjust scrolling with a negative value here

如果你想在全局居中,而不是在顶部居中,你可以添加元素的高度:

myElement.scrollIntoView(true);
var viewportH = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
window.scrollBy(0, (myElement.getBoundingClientRect().height-viewportH)/2);

使用JQuery时,我使用的是:

function scrollToMiddle(id) {
    var elem_position = $(id).offset().top;
    var window_height = $(window).height();
    var y = elem_position - window_height/2;
    window.scrollTo(0,y);
}

示例:

<div id="elemento1">Contenido</div>
<script>
    scrollToMiddle("#elemento1");
</script>

改进@Rohan Orton的答案,使其适用于垂直和水平滚动。

Element.getBoundingClientRect()方法返回元素的大小及其相对于视口的位置。

var ele = $x("//a[.='Ask Question']");
console.log( ele );
scrollIntoView( ele[0] );
function scrollIntoView( element ) {
    var innerHeight_Half = (window.innerHeight >> 1); // Int value
                        // = (window.innerHeight / 2); // Float value
    console.log('innerHeight_Half : '+ innerHeight_Half);
    var elementRect = element.getBoundingClientRect();
    window.scrollBy( (elementRect.left >> 1), elementRect.top - innerHeight_Half);
}

使用Bitwise operator右移得到除法后的int值。

console.log( 25 / 2 ); // 12.5
console.log( 25 >> 1 ); // 12

当滚动窗口/文档以外的容器时,此页面上的所有解决方案都不起作用。getBoundingClientRect方法在具有绝对定位元素的情况下失败。

在这种情况下,我们需要首先确定可滚动的父项,然后滚动它而不是窗口。这是一个适用于所有当前浏览器版本的解决方案,甚至应该适用于IE8和朋友。诀窍是将元素滚动到容器的顶部,这样我们就可以确切地知道它在哪里,然后减去屏幕高度的一半。

function getScrollParent(element, includeHidden, documentObj) {
    let style = getComputedStyle(element);
    const excludeStaticParent = style.position === 'absolute';
    const overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/;
    if (style.position === 'fixed') {
        return documentObj.body;
    }
    let parent = element.parentElement;
    while (parent) {
        style = getComputedStyle(parent);
        if (excludeStaticParent && style.position === 'static') {
            continue;
        }
        if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) {
            return parent;
        }
        parent = parent.parentElement;
    }
    return documentObj.body;
}
function scrollIntoViewCentered(element, windowObj = window, documentObj = document) {
    const parentElement = getScrollParent(element, false, documentObj);
    const viewportHeight = windowObj.innerHeight || 0;
    element.scrollIntoView(true);
    parentElement.scrollTop = parentElement.scrollTop - viewportHeight / 2;
    // some browsers (like FireFox) sometimes bounce back after scrolling
    // re-apply before the user notices.
    window.setTimeout(() => {
        element.scrollIntoView(true);
        parentElement.scrollTop = parentElement.scrollTop - viewportHeight / 2;
    }, 0);
}

要为所有浏览器支持scrollIntoViewOptions中的所有选项,最好使用无缝滚动polyfill(https://www.npmjs.com/package/seamless-scroll-polyfill)

为我工作。

这里有一个解释链接https://github.com/Financial-Times/polyfill-library/issues/657

相关内容

  • 没有找到相关文章

最新更新