0
0

JavaScriptの復習⑤

Posted at

はじめに

今回の記事は、ページスクロールと複数の条件を組み合わせたアニメーションについて復習します。

ページのスクロール量とは?

JavaScriptのページスクロール量とは、ユーザーがページをどれだけスクロールしたかを取得・操作することです。スクロール量を知ることで、動的なレイアウト変更や、特定の要素にスクロールさせるといったインタラクションを実装できます。

全体のコード一覧

See the Pen ページのスクロール量 by Uka Suzuki (@uukasuzuki_) on CodePen.

JavaScriptのコード解説

const getScrollPercent = () => {
  // スクロール量
  const scrolled = window.scrollY;
  // ページ全体の高さ
  const pageHeight = document.documentElement.scrollHeight;
  // 表現領域の高さ
  const viewHeight = document.documentElement.clientHeight;
  // スクロールされた割合
  const percentage = (scrolled / (pageHeight - viewHeight)) * 100;
  // プログレスバーに幅を指定
  document.querySelector("#bar").style.width = `${percentage}%`;
};

window.addEventListener("scroll", getScrollPercent);
  • const getScrollPercent = () => { ... };は、ページがスクロールされた際に呼び出される関数 getScrollPercent が定義されています。無名関数(アロー関数)を使っていて、スクロールイベントに応じてページのスクロール量を取得し、プログレスバーに反映させます。

  • const scrolled = window.scrollY;は、ページのトップからのスクロール量(ピクセル単位)を取得します。この変数 scrolled には、ページがどれだけ縦方向にスクロールされたかの情報が入ります。

  • const pageHeight = document.documentElement.scrollHeight;は、scrollHeight はドキュメント全体の高さを取得します。この値は、ページ全体の高さ(スクロールされる部分も含めたサイズ)を示します。

  • const viewHeight = document.documentElement.clientHeight;のclientHeightは現在表示されているウィンドウの高さ(ビューポートの高さ)を取得します。これは、画面に表示されている範囲の高さです。

  • const percentage = (scrolled / (pageHeight - viewHeight)) * 100;とは、この式でページ全体に対してどれだけスクロールされたかの割合(パーセンテージ)を計算します。

    (pageHeight - viewHeight)は、スクロール可能な全体の高さ(ページ全体の高さから表示領域の高さを引いたもの)。* 100は、パーセンテージに変換。

  • document.querySelector("#bar").style.width = ${percentage}%;は、querySelector("#bar") でHTML要素のIDがbarの要素を取得します。そして、style.widthプロパティでプログレスバーの幅をスクロール割合に応じて更新します。${percentage}%によって、幅がパーセンテージ形式で設定されます。

  • window.addEventListener("scroll", getScrollPercent);は、ここでscrollイベントをリスンしています。ページがスクロールされるたびにgetScrollPercent関数が呼び出される仕組みです。これにより、スクロールに連動してプログレスバーが動きます。

ページ全体の高さ

ページ全体の高さ_アートボード 1.png

表現領域の高さ

ページ全体の高さ_アートボード 1 のコピー.png

スクロール量の計算式

スクロールされた割合を計算するには、「スクロール量÷スクロール可能なページの高さ×100」 で表し、上記のJavaScriptの場合、ページ全体の高さから表現領域の高さを引いた数値を求めたい時は、「スクロール量÷(ページ全体の高さ-表現領域の高さ)×100」 にあてはめます。

例)スクロールすると背景色が変わる

See the Pen スクロール量 by Uka Suzuki (@uukasuzuki_) on CodePen.

CSS3のコード解説

body {
  margin: 0;
  font-family: Arial, sans-serif;
  transition: background-color 0.3s ease;
}

.content {
  height: 200vh; /* 200%の高さを設定してスクロールできるようにする */
  padding: 20px;
}
  • margin: 0;で、ブラウザのデフォルトの余白をなくします。これにより、ページが画面の端から端まで広がります。transition: background-color 0.3s ease;では、背景色が変わる際のアニメーション効果を設定しています。色が変わるのにかかる時間は0.3秒で、アニメーションは滑らかに進行します。

JavaScriptのコード解説

window.addEventListener("scroll", function () {
  // スクロール量を取得
  const scrollPosition = window.scrollY || document.documentElement.scrollTop;

  // ページ全体の高さ
  const documentHeight = document.documentElement.scrollHeight - window.innerHeight;

  // スクロール位置をパーセンテージで計算
  const scrollPercent = (scrollPosition / documentHeight) * 100;

  console.log(`スクロール位置: ${scrollPosition}px`);
  console.log(`スクロール進行度: ${scrollPercent.toFixed(2)}%`);

  // 例: スクロール量に応じて背景色を変える
  document.body.style.backgroundColor = `rgba(0, 150, 136, ${scrollPercent / 100})`;
});
  • window.addEventListener("scroll", function () {...});で、スクロールイベントが発生するたびに、この関数が呼び出されます。

  • const scrollPosition = window.scrollY || document.documentElement.scrollTop;は、現在のスクロール位置を取得します。window.scrollYは現在の垂直スクロール量を返し、古いブラウザのためにdocument.documentElement.scrollTopも使用します。

  • const documentHeight = document.documentElement.scrollHeight - window.innerHeight;は、ドキュメント全体の高さからビューポートの高さを引いて、スクロール可能な領域の高さを計算します。

  • const scrollPercent = (scrollPosition / documentHeight) * 100;は、現在のスクロール位置を全体の高さで割り、パーセンテージに変換します。

  • console.log(...): 現在のスクロール位置とスクロール進行度をコンソールに出力します。toFixed(2)メソッドは小数点以下2桁まで表示します。

  • document.body.style.backgroundColor = ...;は、スクロール量に応じて背景色を変更します。rgba(0, 150, 136, ${scrollPercent / 100})では、透明度をスクロール量のパーセンテージに基づいて設定します。これにより、スクロールが進むにつれて背景色が徐々に濃くなります。

論理演算子

JavaScriptの論理演算子は、主に条件分岐や比較の際に使われる重要なツールです。主な論理演算子は以下の3つです。

1. 論理AND(&&)
2つの条件がどちらもtrueの場合にtrueを返し、1つでもfalseがあればfalseを返します。

let a = true;
let b = false;
console.log(a && b); // false

2. 論理OR(||)
2つの条件のうち1つでもtrueであればtrueを返し、どちらもfalseの場合にのみfalseを返します。

let a = true;
let b = false;
console.log(a || b); // true

3. 論理NOT(!)
1つの条件の真偽を逆にします。trueならfalseに、falseならtrueにします。

let a = true;
console.log(!a); // false

例)実際の使い方

let age = 25;
let hasLicense = true;

// このコードでは、年齢が18歳以上であり、かつ運転免許がある場合に運転可能と表示されます。
if (age >= 18 && hasLicense) {
  console.log("運転可能です");
} else {
  console.log("運転できません");
}

まとめ

今回は、ページスクロールと複雑な条件分岐についてまとめました。次回は、配列とfor文の繰り返し処理を復習していきます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0