如何使用swup js过渡到页面顶部

时间:2020-06-21 01:12:55

标签: javascript swup

使用Swup JS,我实现了很好的过渡效果,除了一个问题之外,效果很好。

如果我向下滚动到页面“ A”上的某个点,请点击url过渡到页面“ B”,我不会过渡到页面“ B”的最上端,而是滚动点相同或关闭。

如何让swup js不记得滚动位置并将我转换到页面顶部?

2 个答案:

答案 0 :(得分:0)

const options = {
    animationSelector: '[class*="transition-fade"]',
    animateHistoryBrowsing: true,
    plugins: [

        new SwupScrollPlugin({
            animateScroll: false
        })
    ]
};

const swup = new Swup(options);

let scrollValues = {};

swup.on('clickLink', () => {
    scrollValues[window.location.href] = window.scrollY;
});

swup.on('popState', () => {
    setTimeout(function() {
        window.scrollTo(0, scrollValues[window.location.href]);
    }, 100);
});

答案 1 :(得分:0)

首先让我留下来,我在 Javascript 方面仍然有点菜鸟,所以请原谅我的无知。

不过,我确实找到了解决方案(可能是粗略的)。

我已经阅读了关于 https://swup.js.org/events 的文档,只有其中的一部分对我有意义。 所以我使用有意义的部分来制定这个解决方案。 我就是这样解决的; 首先,我使用了一个 swup.on 事件来触发整个事件。

swup.on('animationInStart', scrollToPlace); // When the incoming animation is starting we call the scroll function

然后,我创建了一个变量,该变量被分配给分配给页面包装器的变量(这是具有 swup 'id' 的 swup 容器的父级);

let pageWrapper = document.querySelector(".page-wrapper");

然后,我创建一个空白的 div,表示我希望页面滚动到的位置,就像这样;

<div id="need-to-scroll-here" class="anchor"></div>

然后我创建了一个迷你函数,将 'scroll-to' 元素分配给一个变量,创建了一个从 'getPosition' 函数中获取所述元素位置的变量,然后告诉 'pageWrapper'(上面定义的)滚动到我刚刚获得的位置。

    function scrollToPlace(){ 
        var myElement = document.querySelector("#need-to-scroll-here"); // Here is the element that we want to scroll to 
        var position = getPosition(myElement);     
        pageWrapper.scrollTo(0, position.y)    

}

我使用了一个函数,以像素为单位定位该 div 的位置(参考上文);

function getPosition(el) {
var xPos = 0;
var yPos = 0;

while (el) {
if (el.tagName == "BODY") {
    // deal with browser quirks with body/window/document and page scroll
    var xScroll = el.scrollLeft || document.documentElement.scrollLeft;
    var yScroll = el.scrollTop || document.documentElement.scrollTop;

    xPos += (el.offsetLeft - xScroll + el.clientLeft);
    yPos += (el.offsetTop - yScroll + el.clientTop);
} else {
    // for all other non-BODY elements
    xPos += (el.offsetLeft - el.scrollLeft + el.clientLeft);
    yPos += (el.offsetTop - el.scrollTop + el.clientTop);
}

el = el.offsetParent;
}
return {
    x: xPos,
    y: yPos
};

}

正如我所说,文档对我来说仍然没有多大意义,因为在大多数情况下,它没有在上下文相关的示例中演示代码的语法,这是我学习的特殊方式。 我希望这对某人有用,如果有更好的方法,请参与。 希望这能提高我的负 4 分,这一切都是因为我问了一个九年前提出的“愚蠢问题”,当时我对编码知之甚少,这导致我被禁止提问和回答任何问题!