简体   繁体   English

如何在点击时将新页面滚动到顶部?

[英]How to scroll new page to top on load on click?

I'm using barba.js to fade new pages in. Code must be placed between the barba wrapper div.我正在使用 barba.js 淡入新页面。代码必须放在 barba 包装器 div 之间。 When I click a link to a new page though, the new page fades in at the same position as the previous page was in. So if the user clicks a link, the new page is loading in near, which I don't want.但是,当我单击指向新页面的链接时,新页面会在与前一页面相同的 position 处淡入。因此,如果用户单击链接,则新页面正在附近加载,这是我不想要的。

How can I get the new page to load in at the top?如何让新页面加载到顶部?

I found the answer on stack about scrollRestoration function but I still don't understand how to make this work.我在堆栈上找到了有关scrollRestoration function 的答案,但我仍然不明白如何使这项工作。

Could somebody help me to compile the js code below, add some css or html to fix this issue?有人可以帮我编译下面的 js 代码,添加一些 css 或 html 来解决这个问题吗?

$(window).scrollTop(0);
if ('scrollRestoration' in history) {
    history.scrollRestoration = 'manual';
}
function delay(n) {
  n = n || 2000;
  return new Promise((done) => {
    setTimeout(() => {
      done();
    }, n);
  });
}

function pageTransition() {
  var tl = gsap.timeline();

tl.to(".animate-this", {
     duration: .2,  opacity: 0, delay: 0,  y: 30,  //scale:0, delay: 0.2, 
  });
  tl.to(".animate-this", {
     duration: 0,  opacity: 0, delay: 0,  scale:0,  //scale:0, delay: 0.2, 
  });

  tl.fromTo(".loading-screen", {width: 0, left: 0}, {
    duration: 1,
    width: "100%",
    left: "0%",
    ease: "expo.inOut",
    delay: 0.3,
  });

  tl.to("#svg-1", {
    duration: 1,  opacity: 0,  y: 30, stagger: 0.4, delay: 0.2, 
  });

  tl.to(".loading-screen", {
    duration: 1,
    width: "100%",
    left: "100%",
    ease: "expo.inOut",
    delay: 0, //CHANGE TIME HERE END TRANS
  });




  tl.set(".loading-screen", { left: "-100%", });
  tl.set("#svg-1", { opacity: 1,  y: 0 });
}



function contentAnimation() {
  var tl = gsap.timeline();
  tl.from(".animate-this",  { duration: .5, y: 30, opacity: 0, stagger: 0.4, delay: 0.2 });
}

$(function () {
  barba.init({
    sync: true,

    transitions: [
      {
        async leave(data) {
          const done = this.async();

          pageTransition();
          await delay(2500);
          done();
        },

        async enter(data) {
          contentAnimation();
        },

        async once(data) {
          contentAnimation();
        },
      },
    ],
  });
});

Have a look: https://pasteboard.co/Ja33erZ.gif看看: https://pasteboard.co/Ja33erZ.gif

Here also a codepen to check my issue (html,css): https://codepen.io/cat999/project/editor/AEeEdg这里还有一个代码笔来检查我的问题(html,css): https://codepen.io/cat999/project/editor/AEeEdg

scrollRestoration shouldn't be necessary, this can be done by resetting scroll position during the transition:不需要滚动恢复,这可以通过在过渡期间重置滚动scrollRestoration来完成:

  tl.fromTo(".loading-screen", {width: 0, left: 0}, {
    duration: 1,
    width: "100%",
    left: "0%",
    ease: "expo.inOut",
    delay: 0.3,
    onComplete: function() {
      window.scrollTo(0, 0);
    }
  });

Working example here: https://codepen.io/durchanek/project/editor/ZWOyjE此处的工作示例: https://codepen.io/durchanek/project/editor/ZWOyjE

This should be what you're looking for:这应该是您正在寻找的:

barba.hooks.enter(() => {
  window.scrollTo(0, 0);
});

(can be found in the docs) (可以在文档中找到)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM