40代高卒者が製造業からIT転職する【フェードインのコード】

programming
DMM WEBCAMP

こんにちは、フローです。

今回は、前回のフェードインアニメーションのCSSと、jQueryの解説をしていきたいと思います。

前回の記事はこちらです。

フェードインのCSS

前回の例では、カードデザインを3つ使用して、

pc表示では横並びに、左から順番に下から出てくる、フェードインのアニメーションに。

iPhoneなどの小さな画面では、レスポンシブデザインで使用し、

3つのカードが縦並びになり、上のカードから順番に下から出てくる仕様のCSSでした。

では、前回のCSSを見てみましょう。

下から出てくるフェードインのCSS

.card-row {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  min-height: 100vh;
  overflow: hidden;
  background-color: #f5f5f5;
}

.card {
  width: 100%;
  max-width: 300px;
  margin: 0 10px 20px 10px;
  position: relative;
  overflow: hidden;
  height: 0;
  opacity: 0;
  transform: translateY(50%);
  background-color: #FFE0B2; /* 背景色 */
  border-radius: 10px; /* 角丸 */
  box-shadow: 0px 5px 15px rgba(0,0,0,0.2); /* 影 */
  transition: transform 0.5s ease-in-out, opacity 0.5s ease-in-out;
}

.card.show {
  height: auto;
  opacity: 1;
  transform: translateY(0%);
  transition-delay: 0.5s;
}

.card.show:nth-child(1) {
  transition-delay: 0.5s;
}

.card.show:nth-child(2) {
  transition-delay: 1s;
}

.card.show:nth-child(3) {
  transition-delay: 1.5s;
}

.card .card-content {
  padding: 20px;
  text-align: center;
}

.card h2 {
  font-size: 24px;
  margin-bottom: 10px;
  color: #FF9800; /* タイトルの色 */
}

.card p {
  font-size: 16px;
  line-height: 1.5;
  color: #4C2600; /* テキストの色 */
}

body::-webkit-scrollbar {
  width: 10px;
}

body::-webkit-scrollbar-thumb {
  background-color: #FF9800;
  border-radius: 10px;
}

@media only screen and (min-width: 768px) {
  .card-row {
    flex-direction: row;
  }
  .card {
    margin: 0 10px;
  }
}

/* 変更:iPhone など小さい画面でのカード表示アニメーション */
@media only screen and (max-width: 767px) {
  .card {
    transition: transform 1.8s ease-in-out, opacity 1.8s ease-in-out;
  }
  .card.show {
    height: auto;
    opacity: 1s;
    transform: translateY(0%);
  }
}

この様なCSSです。

この中身をコメントを付けて、詳しく見ていきましょう。

コメント入りのCSS

フルスクリーンのレイアウトを持つ.card-rowという親要素と、

その中に3つのカードを含む.cardという子要素を定義しています。以下に詳細を説明します。

.card-row {
display: flex;
flex-direction: column; /* カードを垂直に配置する /
justify-content: center; / 垂直方向にセンター揃えする /
align-items: center; / 水平方向にセンター揃えする /
min-height: 100vh; / 画面の高さに合わせる最小の高さを設定する /
overflow: hidden; / 画面外にはみ出たコンテンツを隠す /
background-color: #f5f5f5; / 背景色を設定する */
}

.card {
width: 100%; /* 横幅を100%に設定する /
max-width: 300px; / 最大横幅を300pxに設定する /
margin: 0 10px 20px 10px; / 上下左右の余白を設定する /
position: relative; / 相対的な位置を指定する /
overflow: hidden; / コンテンツがはみ出た場合に隠す /
height: 0; / 初期状態で高さを0に設定する /
opacity: 0; / 初期状態で透明度を0に設定する /
transform: translateY(50%); / 初期状態で下に移動させる /
background-color: #FFE0B2; / 背景色を設定する /
border-radius: 10px; / 角丸にする /
box-shadow: 0px 5px 15px rgba(0,0,0,0.2); / 影を付ける /
transition: transform 0.5s ease-in-out, opacity 0.5s ease-in-out; / アニメーションを指定する */
}

.card.show {
height: auto; /* 高さを自動に設定してカードを表示する /
opacity: 1; / 透明度を1に設定してカードを表示する /
transform: translateY(0%); / 上に移動させて表示する /
transition-delay: 0.5s; / アニメーションの遅延時間を指定する */
}

.card.show:nth-child(1) {
transition-delay: 0.5s; /* 1つ目のカードのアニメーション遅延時間を指定する */
}

.card.show:nth-child(2) {
transition-delay: 1s; /* 2つ目のカードのアニメーション遅延時間を指定する */
}

.card.show:nth-child(3) {
transition-delay: 1.5s; /* 3つ目のカードのアニメーション遅延時間を指定する */
}

.card .card-content {
padding: 20px; /* カード内のコンテンツに余白を設定する /
text-align: center; / カード内のコンテンツを中央揃えにする */
}

.card h2 {
font-size: 24px; /* タイトルの文字サイズを設定する /
margin-bottom: 10px; / タイトル下部に余白を設定する /
color: #FF9800; / タイトルの色を設定する */
}

.card p {
font-size: 16px; /* テキストの文字サイズを設定する /
line-height: 1.5; / 行の高さを設定する /
color: #4C2600; / テキストの色を設定する */
}

body::-webkit-scrollbar {
width: 10px; /* スクロールバーの幅を設定する */
}

body::-webkit-scrollbar-thumb {
background-color: #FF9800; /* スクロールバーの色を設定する /
border-radius: 10px; / スクロールバーの角丸を設定する */
}

@media only screen and (min-width: 768px) {
.card-row {
flex-direction: row; /* 画面幅が768px以上の場合に、カードを水平に配置する /
}
.card {
margin: 0 10px; / 画面幅が768px以上の場合に、カード間の余白を設定する */
}
}

/* 変更:iPhone など小さい画面でのカード表示アニメーション /
@media only screen and (max-width: 767px) {
.card {
transition: transform 1.8s ease-in-out, opacity 1.8s ease-in-out; / カードのアニメーションを指定する /
}
.card.show {
height: auto; / 高さを自動に設定してカードを表示する /
opacity: 1s; / 透明度を1に設定してカードを表示する /
transform: translateY(0%); / 上に移動させて表示する */
}
}

3つのカードデザインを含むレスポンシブ対応のデザインです。

カードはデスクトップ画面では横並びに、スマートフォンなどの小さい画面では縦並びに表示されます。

また、各カードは画面の下からフェードインするアニメーションが設定されています。

.card-rowと.cardのクラスは、

カードを垂直方向にセンター揃えで配置し、必要に応じてカードの最大横幅を設定する役割を担っています。

カードの初期状態は高さが0で透明度も0であるため、

アニメーションによって高さを自動に設定し、カードを表示するように設定されています。

また、タイトルやテキストのスタイルなども指定されており、

スクロールバーのデザインもカスタマイズされています。

さらに、画面の幅に応じてデザインが変化するように@mediaクエリが使用されています。

画面幅が768px以上の場合には、カードを水平に配置するように調整されています。

画面幅が768px以下の場合には、カード表示アニメーションを変更し、

より見やすいデザインになるように調整されています。

jQueryを見てみよう

let ticking = false;

$(window).on('scroll', function() {
  if (!ticking) {
    window.requestAnimationFrame(function() {
      let cards = $('.card');
      cards.each(function() {
        if ($(this).offset().top + 100 < $(window).height() + $(window).scrollTop()) {
          $(this).addClass('show');
        }
      });
      ticking = false;
    });
    ticking = true;
  }
});

ウィンドウをスクロールしたときにカードをフェードイン表示させるための処理です。

1行目で、tickingというフラグをfalseに初期化しています。

2行目では、ウィンドウをスクロールしたときのイベントを監視しています。

3~13行目では、

requestAnimationFrameメソッドを使用して、アニメーションを最適化しています。

tickingがfalseの場合にのみ、requestAnimationFrameメソッドが実行されます。

5行目で、全てのカード要素を取得しています。

6~12行目のeachメソッドでは、各カード要素に対して、

表示領域に入った場合に.showクラスを付与するように設定されています。

offset().topメソッドは、

要素のページ上端からの距離を返します。

この場合、カード要素が表示領域の下端から100px以上の位置に入った場合に

.showクラスが付与されるように設定されています。

最後に、

tickingをfalseに設定して、

次のrequestAnimationFrameメソッドの実行に備えます。

まとめ

jQueryの記述は覚える必要はありません。

なんとなく、でいいです。

CSSは、何度も色々な場面で使えるので、「こんなのあったな」くらいで覚えておけば、後から使えます。

CSSを自分好みの数値に変えてみて遊んでみて下さい。

レッツチャレンジ!