スクロールしたらテキストが横に流れるアニメーション

どうも、くまだです。

ネタが思い浮かばないので、過去1年ぐらい前に案件で使ったものを書きます。

タイトルのとおりで、スクロールしたら文章が横に流れる演出のアニメーションです。

スクロールしたらテキストが横に流れるアニメーション

まずはどんな感じか動画でどうぞ。

上部の黒い部分はヘッダーのつもりです。

最初の数行がいきなり複数行でてきていますが、FVがないからです。

動画ではやりませんでしたが、FVがあれば、徐々にスクロールしていけば1行目から徐々に出てくるはず…。

コードは以下のとおりです。

〇HTML

  <header class="header">

  </header>



  <div class="interrog__txtarea">
    <p class="interrog__text js-move" data-area="文章が左から出ます。文章が左から出ます。文章が左から出ます。文章が左から出ます。文章が左から出ます。文章が左から出ます。">
      文章が左から出ます。文章が左から出ます。文章が左から出ます。文章が左から出ます。文章が左から出ます。文章が左から出ます。</p>
    <p class="interrog__text js-move" data-area="文章が左から出ます。文章が左から出ます。文章が左から出ます。文章が左から出ます。文章が左から出ます。文章が左から出ます。">
      文章が左から出ます。文章が左から出ます。文章が左から出ます。文章が左から出ます。文章が左から出ます。文章が左から出ます。</p>
    <p class="interrog__text js-move" data-area="文章が左から出ます。文章が左から出ます。文章が左から出ます。文章が左から出ます。">
      文章が左から出ます。文章が左から出ます。文章が左から出ます。文章が左から出ます。</p>
    <p class="interrog__text js-move" data-area="文章が左から出ます。文章が左から出ます。">文章が左から出ます。文章が左から出ます。</p>
    <p class="interrog__text js-move" data-area="文章が左から出ます。文章が左から出ます。文章が左から出ます。文章が左から出ます。文章が左から出ます。文章が左から出ます。">
      文章が左から出ます。文章が左から出ます。文章が左から出ます。文章が左から出ます。文章が左から出ます。文章が左から出ます。</p>
    <p class="interrog__text js-move" data-area="文章が左から出ます。文章が左から出ます。">文章が左から出ます。文章が左から出ます。</p>
    <p class="interrog__text js-move" data-area="文章が左から出ます。文章が左から出ます。文章が左から出ます。文章が左から出ます。">
      文章が左から出ます。文章が左から出ます。文章が左から出ます。文章が左から出ます。</p>
    <p class="interrog__text js-move" data-area="文章が左から出ます。文章が左から出ます。文章が左から出ます。文章が左から出ます。文章が左から出ます。文章が左から出ます。">
      文章が左から出ます。文章が左から出ます。文章が左から出ます。文章が左から出ます。文章が左から出ます。文章が左から出ます。</p>
    <p class="interrog__text js-move" data-area="文章が左から出ます。文章が左から出ます。文章が左から出ます。文章が左から出ます。">
      文章が左から出ます。文章が左から出ます。文章が左から出ます。文章が左から出ます。</p>
    <p class="interrog__text js-move" data-area="文章が左から出ます。文章が左から出ます。">文章が左から出ます。文章が左から出ます。</p>

  </div>

〇CSS

.header {
  width: 100%;
  background: gray;
  height: 80px;
}

.interrog__txtarea {
  height: 1000px;
  display: flex;
  flex-direction: column;
  margin-top: 100px;
  text-align: center;

}


.interrog__text {
  display: inline-block;
  position: relative;
  color: #ffffff;
  font-size: 14px;
  font-weight: bold;

  text-align: left;
  white-space: nowrap;
  filter: blur(6px);
  margin-bottom: 50px;
}



.interrog__text.active {
  transform: translateY(0);
  filter: blur(0);
  transition: transform 0.8s;
}

.interrog__text.active::before {
  position: absolute;
  top: 0;
  left: 0;
  overflow: hidden;
  transform-origin: top left;
  animation: 2s scroll forwards .4s;
  content: attr(data-area);

}



@keyframes scroll {
  0% {
    width: 0%;
    transition: 4s;
  }

  100% {
    width: 100%;
    color: #000;
    transition: 4s;
  }
}

〇JavaScript(jQuery)

$(function () {
  $(window).scroll(function () {
    $(".js-move").each(function () {
      const text = $(this).offset().top;
      const scroll = $(window).scrollTop();
      const windowHeight = $(window).height();
      if (scroll > text - windowHeight + windowHeight / 4) {
        $(this).addClass("active");
      }
    });
  });
});

基本的にはkeyframesでアニメーションの設定をしています。JSでは発火のタイミングを設定しているだけです。

ある程度のスクロールしたらjs-moveクラスがついたものにactiveクラスが付与されて、CSSの以下の部分の処理が行われます。

.interrog__text.active {
  transform: translateY(0);
  filter: blur(0);
  transition: transform 0.8s;
}

.interrog__text.active::before {
  position: absolute;
  top: 0;
  left: 0;
  overflow: hidden;
  transform-origin: top left;
  animation: 2s scroll forwards .4s;
  content: attr(data-area);

}

背景が白なのでわかりにくいですが、背景に画像や白以外のものがあれば、もう少し動きはわかりやすかったかも。

背景をわかりやすく赤にしてみました(チカチカする…)

ちなみに最初に出てくる白い文章は、data-areaのものです。

それをkeyframesで0%→100%にいく中で、widthが0%から100%になり、そのついでに文字色を黒にしている感じです。

超ざっくりでしたが、ここまで読んでくださりありがとうございました。

この記事を書いた人