使用Animate Plus对按钮单击进行动画全页滚动

时间:2019-01-24 13:17:41

标签: javascript css animation ecmascript-6 scroll

我想通过使用Animate Plus单击Previous PageNext Page按钮,在整个视口宽度上平滑地对页面部分的水平滚动进行动画处理。

以下是相关代码段:

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/

我想念什么?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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