【问题标题】:Modifying Text Line Mask Animation on Scroll to on Reveal在滚动到显示时修改文本行动画
【发布时间】:2022-10-20 18:34:07
【问题描述】:

基本上我从 t.ricks 看到了这种惊人的效果:https://www.youtube.com/watch?v=yvqSioowCRc

我想在文本滚动到视图时做出相同的效果,而不是在滚动页面时播放效果

简而言之,我的问题是: 我想在文本“出现”而不是“滚动”时播放动画

代码如下:

<style>
.line {
  position: relative;
}
.line-mask {
  position: absolute;
  top: 0;
  right: 0;
  background-color: black;
  opacity: 0.65;
  height: 100%;
  width: 100%;
  z-index: 2;
}
</style>

<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.8.0/gsap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.8.0/ScrollTrigger.min.js"></script>
<script src="https://unpkg.com/split-type"></script>
<script>
let typeSplit;
// Split the text up
function runSplit() {
  typeSplit = new SplitType(".split-lines", {
    types: "lines, words"
  });
  $(".line").append("<div class='line-mask'></div>");
  createAnimation();
}
runSplit();
// Update on window resize
let windowWidth = $(window).innerWidth();
window.addEventListener("resize", function () {
  if (windowWidth !== $(window).innerWidth()) {
    windowWidth = $(window).innerWidth();
    typeSplit.revert();
    runSplit();
  }
});

gsap.registerPlugin(ScrollTrigger);

function createAnimation() {
  $(".line").each(function (index) {
    let tl = gsap.timeline({
      scrollTrigger: {
        trigger: $(this),
        // trigger element - viewport
        start: "top center",
        end: "bottom center",
        scrub: 1
      }
    });
    tl.to($(this).find(".line-mask"), {
      width: "0%",
      duration: 1
    });
  });
}
</script>

【问题讨论】:

    标签: jquery animation text


    【解决方案1】:

    我将使用的概念是为每一行设置不同的动画延迟,然后触发动画事件,例如通过将.line-mask 宽度设置为0%

    <div class="split-lines">
      <div class="line" style="display: block">
        Lorem Ipsum is
        <div class="line-mask" style="width: 100%; transition: width 0.2s ease-in;"></div>
      </div>
      <div class="line" style="display: block">
        simply dummy text of
        <div class="line-mask" style="width: 100%; transition: width 0.4s ease-in;"></div>
      </div>
      <div class="line" style="display: block">
        the printing and
        <div class="line-mask" style="width: 100%; transition: width 0.6s ease-in;"></div>
      </div>
    </div>
    

    这是一个具有相同概念的工作示例,延迟是内联样式还是 nth-child CSS 元素都没有关系:

    let splitLines = document.getElementsByClassName('split-lines');
    
    setTimeout(function() {
      splitLines[0].classList.add('animate');
    }, 1000);
    body {
      background: #000;
    }
    .split-lines {
      display: block;
      margin: 5% auto;
      color: #fff;
      font-size: 28px;
      line-height: 36px;
      width: 50%;
    }
    .split-lines.animate .line-mask {
      width: 0% !important;
    }
    .line {
      position: relative;
    }
    .line-mask {
      position: absolute;
      top: 0;
      right: 0;
      background-color: #000;
      opacity: 0.65;
      height: 100%;
      width: 100%;
      z-index: 2;
      transition: width 2s ease-in;
    }
    .line:nth-child(1) .line-mask {
      transition-delay: 0.2s;
    }
    .line:nth-child(2) .line-mask {
      transition-delay: 0.4s;
    }
    .line:nth-child(3) .line-mask {
      transition-delay: 0.6s;
    }
    .line:nth-child(4) .line-mask {
      transition-delay: 0.8s;
    }
    .line:nth-child(5) .line-mask {
      transition-delay: 1.0s;
    }
    .line:nth-child(6) .line-mask {
      transition-delay: 1.2s;
    }
    .line:nth-child(7) .line-mask {
      transition-delay: 1.4s;
    }
    .line:nth-child(8) .line-mask {
      transition-delay: 1.6s;
    }
    .line:nth-child(9) .line-mask {
      transition-delay: 1.8s;
    }
    .line:nth-child(10) .line-mask {
      transition-delay: 2s;
    }
    <div class="split-lines">
      <div class="line" style="display: block; text-align: start; width: 100%;">
        <div class="word" style="display: inline-block;">Lorem</div>
        <div class="word" style="display: inline-block;">Ipsum</div>
        <div class="word" style="display: inline-block;">is</div>
        <div class="line-mask" style="width: 100%;"></div>
      </div>
      <div class="line" style="display: block; text-align: start; width: 100%;">
        <div class="word" style="display: inline-block;">simply</div>
        <div class="word" style="display: inline-block;">dummy</div>
        <div class="word" style="display: inline-block;">text</div>
        <div class="word" style="display: inline-block;">of</div>
        <div class="line-mask" style="width: 100%;"></div>
      </div>
      <div class="line" style="display: block; text-align: start; width: 100%;">
        <div class="word" style="display: inline-block;">the</div>
        <div class="word" style="display: inline-block;">printing</div>
        <div class="word" style="display: inline-block;">and</div>
        <div class="line-mask" style="width: 100%;"></div>
      </div>
      <div class="line" style="display: block; text-align: start; width: 100%;">
        <div class="word" style="display: inline-block;">typesetting</div>
        <div class="word" style="display: inline-block;">industry.</div>
        <div class="line-mask" style="width: 100%;"></div>
      </div>
      <div class="line" style="display: block; text-align: start; width: 100%;">
        <div class="word" style="display: inline-block;">Lorem</div>
        <div class="word" style="display: inline-block;">Ipsum</div>
        <div class="word" style="display: inline-block;">has</div>
        <div class="line-mask" style="width: 100%;"></div>
      </div>
      <div class="line" style="display: block; text-align: start; width: 100%;">
        <div class="word" style="display: inline-block;">been</div>
        <div class="word" style="display: inline-block;">the</div>
        <div class="word" style="display: inline-block;">industry's</div>
        <div class="line-mask"></div>
      </div>
      <div class="line" style="display: block; text-align: start; width: 100%;">
        <div class="word" style="display: inline-block;">standard</div>
        <div class="word" style="display: inline-block;">dummy</div>
        <div class="word" style="display: inline-block;">text</div>
        <div class="line-mask"></div>
      </div>
      <div class="line" style="display: block; text-align: start; width: 100%;">
        <div class="word" style="display: inline-block;">ever</div>
        <div class="word" style="display: inline-block;">since</div>
        <div class="word" style="display: inline-block;">the</div>
        <div class="word" style="display: inline-block;">1500s,</div>
        <div class="line-mask"></div>
      </div>
      <div class="line" style="display: block; text-align: start; width: 100%;">
        <div class="word" style="display: inline-block;">when</div>
        <div class="word" style="display: inline-block;">an</div>
        <div class="word" style="display: inline-block;">unknown</div>
        <div class="line-mask"></div>
      </div>
      <div class="line" style="display: block; text-align: start; width: 100%;">
        <div class="word" style="display: inline-block;">printer</div>
        <div class="word" style="display: inline-block;">took</div>
        <div class="word" style="display: inline-block;">a</div>
        <div class="word" style="display: inline-block;">galley</div>
        <div class="line-mask"></div>
      </div>
    </div>

    ps:使用SCSS for loop,您可以非常快速地编写nth-child CSS 代码,例如:

    $anim_start: 0.0;
    $anim_gap: 0.2;
    @for $i from 1 through 10 {
        .line::nth-child(#{$i}) .line-mask {
            transition-delay: #{$anim_start + ($anim_gap * ($i - 1))}s;
        }
    }
    

    这是CODEPEN 上的 SCSS 示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多