【问题标题】:Animating full page scrolling on button click using Animate Plus使用 Animate Plus 在按钮单击时动画整页滚动
【发布时间】:2019-11-11 01:12:57
【问题描述】:

我想通过点击Previous PageNext Page 按钮,使用Animate Plus,按视口的整个宽度平滑地为页面部分的水平滚动设置动画。

以下是相关代码:

import animate from "https://cdn.jsdelivr.net/npm/animateplus@2/animateplus.js"

const previousPage = document.querySelector("button:nth-of-type(1)")
const nextPage = document.querySelector("button:nth-of-type(2)")

previousPage.addEventListener("click", () => {
  window.scrollBy(-window.innerWidth, 0)
  animate({
    easing: "out-quintic"
  })
})

nextPage.addEventListener("click", () => {
  window.scrollBy(window.innerWidth, 0)
  animate({
    easing: "out-quintic"
  })
})

我的完整代码可以在这里找到:

https://codepen.io/anon/pen/bzVGMz


我想实现的动画效果可以在这里找到:

http://animateplus.com/examples/anchor-scroll/

我错过了什么?

【问题讨论】:

    标签: javascript animation ecmascript-6 scroll animateplus


    【解决方案1】:

    这个想法是使用更改回调并计算滚动窗口的增量。这个增量等于进度乘以我们想要滚动的距离。

    但是,我假设您希望能够仅使用上一个和下一个按钮浏览多个部分。由于用户还可以手动滚动到不同的部分,因此您需要一种方法来检测当前正在查看的部分并以编程方式转到上一个/下一个。

    以下代码通过维护按左坐标排序的部分列表来实现此目的。 对于这个例子,我认为当前部分是跨越屏幕中心线的部分。

    import animate from "https://cdn.jsdelivr.net/npm/animateplus@2/animateplus.js"
    
    const previousPage = document.querySelector("button:nth-of-type(1)")
    const nextPage = document.querySelector("button:nth-of-type(2)")
    
    const root = document.scrollingElement;
    
    const sections = Array.from(document.querySelectorAll("section")).sort((s1, s2) => {
      return s1.getBoundingClientRect().left - s2.getBoundingClientRect().left;
    });
    
    // get the section that spans the centerline
    const getSectionInView = () => {
      const halfWdidth = window.innerWidth / 2;
      const index = sections.findIndex(s =>
        s.getBoundingClientRect().left <= halfWdidth &&
        s.getBoundingClientRect().right > halfWdidth
      );
      return index;
    };
    
    // find the next or previous section in the list
    const getNextSection = (dir) => {
      const sectionInViewIndex = getSectionInView();
      const nextIndex = sectionInViewIndex + dir;
      const numSections = sections.length;
      const nextSectionIndex = nextIndex < 0 || nextIndex >= numSections ? sectionInViewIndex : nextIndex;
      return sections[nextSectionIndex];
    };
    
    // animation function
    const animateScroll = (dir) => {
      const from = root.scrollLeft;
      const { left } = getNextSection(dir).getBoundingClientRect();
      return progress => root.scrollLeft = from + progress * left
    };
    
    previousPage.addEventListener("click", () => {
      animate({
        easing: "out-quintic",
        change: animateScroll(-1)
      });
    });
    
    nextPage.addEventListener("click", () => {
      animate({
        easing: "out-quintic",
        change: animateScroll(1)
      });
    });
    

    这是CodePen

    为了使其正常工作,您必须从 section 样式中删除 scroll-snap-align: center; 或将其设置为 none,因为它与动画冲突。

    【讨论】:

    • 它的动画很流畅,但由于某种原因,它现在不能滚动整个宽度——它是百分之九十左右。
    • 我将修改它以使用 const document.scrollingElement.scrollLeft,它应该可以工作
    • 非常感谢!还有一件事......如果我快速点击按钮,这些部分不会捕捉到窗口的边缘。
    • @Tzar 我已经修改了答案和 CodePen。它也应该适用于手动滚动。
    猜你喜欢
    • 2021-10-20
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多