我有一个svg,这是我的horizontal卷轴的基础.

在这svg个元素中,我已经将类.animate添加到我想要在项目进入视图时淡入的元素中.用于引用的.Animate类已添加到svg中的所有文本项中.

目前,只有视图中的.animate个元素最初会逐渐消失.当我向下滚动以继续滚动时,其他元素是静态的.它们没有以任何方式减弱或上升或下降?

TL;DR, here is what I'm trying to achieve:

  • 当滚动条固定到位,用户继续向下滚动时,开始淡出.horizontalScroller__intro.
  • .horizontalScroller__intro消失后,开始水平滚动.horizontalScroller__items
  • 在我的滚动条中,任何.animate级的元素都会淡入原来的位置.

Note:我理解在这里发布代码的规则和偏好.但是,我的演示包含一个长度SVG,我不能在这里发布,因为它超过了SO的字符限制.

Here is a demo of my latest approach

scrollTrigger docs开始,containerAnimation有助于在水平滚动条上实现动画,这也是我一直试图实现的.

但是,在上面的演示中,我有以下问题:

  1. .horizontalScroller__intro最初不会在应该显示的时候显示,并且应该会在滚动中淡出.
  2. 水平滚轴不再工作了
  3. 视图中的.animate个元素不会逐渐淡入

如果我使用timeline(见下面的代码片断),那么Introo就会淡出,滚动条就会正常工作.但是,没有在子元素中设置动画,这是我需要containerAnimation的地方

$(function() {

  let container = document.querySelector(".horizontalScroller__items");

  let tl = gsap.timeline({
    scrollTrigger: {
      trigger: ".horizontalScroller",
      pin: ".horizontalScroller",
      anticipatePin: 1,
      scrub: true,
      invalidateOnRefresh: true,
      refreshPriority: 1,
      end: '+=4000px',
      markers: true,
    }
  });

  tl.to('.horizontalScroller__intro', {
    opacity: 0,
  })

  tl.to(container, {
    x: () => -(container.scrollWidth - document.documentElement.clientWidth) + "px",
    ease: "none",
  })

});

我正在努力寻找一种方法,让导言淡入,滚动条水平滚动,.animate个元素淡入或淡入.

Edit:

@onkar ruikar,请参阅下面基于your sandbox的注释:

  1. 当您向下滚动进入视图时,我希望最初的.animate个元素向上滚动到视图中(目前,一旦文本淡出,然后水平滚动开始工作,那么应该在视图中的.animate个元素才会向上淡入
  2. 在加载了最初的.animate个元素之后,接下来的.animate个元素是滚动条的一部分,它们不会淡入.它们是静电.当每.animate个元素进入视野时,它应该会淡出(我认为它当前对所有元素都触发一次).

请在此处查看视觉效果:

enter image description here

在上面的gif中,您可以看到前两个文本块是隐藏的,一旦它们出现在视图中,我希望它们淡出.然后第三个和第四个文本块是静电,当用户滚动到该部分时,它们应该会淡出.

推荐答案

您需要在滚动触发器上使用onUpdate方法.

onUpdate: self => console.log("progress", self.progress)

基于self.progress设置的不透明度、x位置等

codesandbox的完整演示.点击右下角的"Open Sandbox"按钮查看代码.

if ("scrollRestoration" in history) {
  history.scrollRestoration = "manual";
}
$(function() {
  let container = document.querySelector(".horizontalScroller__items");
  let elements = gsap.utils.toArray(
    document.querySelectorAll(".animate")
  );
  let intro = document.querySelector(".horizontalScroller__intro");
  let svg = document.querySelector("svg");
  let animDone = false;
  window.scrollPercent = -1;

  var scrollTween = gsap.to(container, {
    ease: "none",
    scrollTrigger: {
      trigger: ".horizontalScroller",
      pin: ".horizontalScroller",
      anticipatePin: 1,
      scrub: true,
      invalidateOnRefresh: true,
      refreshPriority: 1,
      end: "+=600%",
      markers: true,
      onEnter: (self) => {
        moveAnimate();
      },
      onLeaveBack: (self) => {
        resetAnimate();
      },
      onUpdate: (self) => {
        let p = self.progress;
        if (p <= 0.25) {
          let op = 1 - p / 0.23;
          intro.style.opacity = op;
          animDone = false;
        }

        if (p > 0.23) {
          moveAnimate();
          // we do not want to shift the svg by 100% to left
          // want to shift it only by 100% - browser width
          let scrollPercent =
            (1 - window.innerWidth / svg.scrollWidth) * 100;
          let shift = ((p - 0.22) * scrollPercent) / 0.78;
          gsap.to(svg, {
            xPercent: -shift
          });
        }
      }
    }
  });

  function resetAnimate() {
    gsap.set(".animate", {
      y: 150,
      opacity: 0
    });
  }
  resetAnimate();

  function moveAnimate() {
    for (let e of elements) {
      if (ScrollTrigger.isInViewport(e, 0.4, true))
        gsap.to(e, {
          y: 0,
          opacity: 1,
          duration: 2
        });
    }
  }
});

你需要在CSS中的.animate个元素上设置不透明度0.使用end: '+=400%'而不是4000像素.相对尺寸可以很容易地用于基于位置的计算.

Javascript相关问答推荐

Vue Quill css仅应用于我的第一个Quill Editor组件+如何自定义工具栏

TypScript界面中的Infer React子props

if/else JavaScript中的条件行为

单击子元素时关闭父元素(JS)

如何找出摆线表面上y与x相交的地方?

嵌套异步JavaScript(微任务和macrotask队列)

Mongoose post hook在使用await保存时不返回Postman响应

如何从URL获取令牌?

阿波罗返回的数据错误,但在网络判断器中是正确的

制作钢琴模拟器,并且在控制台中不会执行或显示该脚本

PDF工具包阿拉伯字体的反转数字

从包含数百行的表中获取更改后的值(以表单形式发送到后端)的正确方法是什么?

如何在使用rhandsontable生成表时扩展数字输入验证?

基于props 类型的不同props ,根据来自接口的值扩展类型

在使用REACT更改了CSS类之后,无法更改CSS样式

如何将zoom 变换应用到我的d3力有向图?

MarkLogic-earch.suggest不返回任何值

在验证和提交表单后使用useNavigate()进行react 重定向,使用带有加载器和操作的路由

如何处理不带参数的redux thunk payloadCreator回调函数?

如何创建一个for循环,用于计算仪器刻度长度并将其放入一个HTML表中?