第4章-3節: サクサク動く!パフォーマンスのヒント

これまでの章で、ツールチップやモーダルウィンドウを作ったり、組み合わせたり、便利なライブラリを使ったりする方法を学んできたね。これで、君のウェブサイトは情報が分かりやすく、インタラクティブになったはずだ!

でも、ちょっと待って!どんなにカッコいい機能も、動きがカクカクしたり、表示されるまで時間がかかったりしたら、ユーザーはがっかりしてしまうよね。ウェブサイトの「パフォーマンス」、つまり「速さ」や「軽さ」も、見た目や機能と同じくらい、とっても大切なんだ。

このページでは、特にツールチップやモーダルのような動きのある部品を作る際に、どうすればパフォーマンスを良く保てるか、そのためのヒントをいくつか紹介するよ!

🐢 なぜパフォーマンスが大切なの?

  • ユーザー体験: ページがサクサク動くと、使っていて気持ちがいい!逆に遅いとイライラして、サイトから離れてしまうかも (離脱率アップ)。
  • コンバージョン率: オンラインショップなどでは、ページの表示速度が売り上げに直接影響することもあるんだ。
  • SEO (検索エンジン最適化): Googleなどの検索エンジンは、表示速度が速いサイトを高く評価する傾向があるよ。

つまり、パフォーマンスが良いことは、ユーザーにとっても、サイト運営者にとってもハッピーなんだ!

パフォーマンス改善のヒント集

ツールチップやモーダルで、パフォーマンスに影響が出やすいのは、主にJavaScriptの処理とCSSの描画だよ。それぞれについて、改善のヒントを見ていこう。

JavaScript関連のヒント

  • イベントリスナーは賢く使おう!
    • たくさんの要素(例えばリストの各項目)にツールチップを付けたい時、一つ一つにaddEventListenerを設定すると、メモリをたくさん使ってしまうことがある。代わりに「イベント委譲 (Event Delegation)」を使ってみよう。これは、親要素(例えばリスト全体)にだけイベントリスナーを設定して、イベントが発生したのがどの要素か(event.target)を見て処理を振り分けるテクニックだよ。効率が良くなることが多いんだ。
      イベント委譲の概念図
    • マウスを動かすたびに発生するmousemoveイベントや、スクロール中に発生するscrollイベントの処理は、あまりにも頻繁に実行されると重くなりがち。処理の実行回数を間引く「Debounce (デバウンス)」や「Throttle (スロットル)」というテクニックや、アニメーションならrequestAnimationFrameを使うのが効果的だよ(ドラッグ可能モーダルの例で少し使ったね!)。
    • 要素がページから削除されるなど、もう不要になったイベントリスナーは、removeEventListenerできちんと解除しよう。解除しないとメモリリーク(メモリの無駄遣い)の原因になることがあるよ。
  • DOM操作は最小限に!
    • JavaScriptでHTML要素のスタイルを変えたり、中身を変えたりする操作(DOM操作)は、比較的コストが高い処理なんだ。何度も同じ要素を探したり、スタイルを少しずつ変更したりするのは避けよう。要素は一度取得したら変数に保存しておいたり、スタイルの変更はCSSクラスの付け外しで行うのがオススメ。
    • たくさんのHTML要素をまとめて追加したい時は、DocumentFragmentという一時的な入れ物を使うと、一回のDOM操作で済ませられて効率的だよ。
  • 重い処理は後回し! (遅延読み込み)
    • モーダルの中に大きな画像や動画、外部コンテンツ(iframe)などがある場合、ページの初期読み込み時に全部読み込もうとすると時間がかかってしまう。そこで「遅延読み込み (Lazy Loading)」の出番!モーダルが実際に表示されるタイミングになってから、それらの重いコンテンツを読み込むようにするんだ。
    遅延読み込みの概念図

CSS関連のヒント

  • アニメーションは軽く動くプロパティで!
    • CSSでアニメーションをつけるとき、width, height, top, left のようなプロパティを動かすと、ブラウザはページの「レイアウト計算」をやり直す必要があって、処理が重くなることがあるんだ(これをレイアウト変更、リフローなどと呼ぶよ)。
    • 一方で、transform (translate, scale, rotate) や opacity (透明度) を使ったアニメーションは、レイアウト計算に影響を与えにくく、よりスムーズに動きやすい。モーダルの出現アニメーションなどで積極的に使ってみよう!
    • ブラウザに「この要素はこれからアニメーションで変化するよ!」と事前に伝えるwill-changeプロパティもあるけど、これは使い方を間違えると逆効果になることもあるから、よく理解してから使おうね。
  • CSSセレクタはシンプルに!
    • あまりにも複雑で長いCSSセレクタ(例: div#main section.article > ul li:nth-child(odd) aみたいなの)は、ブラウザがスタイルを適用する要素を探すのに時間がかかることがある。できるだけシンプルで分かりやすいセレクタを心がけよう。

画像やライブラリ関連のヒント

  • 画像は最適化しよう! モーダル内で大きな画像を使う場合は、表示に必要なサイズに合わせてリサイズしたり、WebPのような新しい画像フォーマットを使ってファイルサイズを小さくしよう。画像の遅延読み込み (loading="lazy"属性)も効果的だよ。
  • ライブラリは賢く選ぼう! 前のページで紹介したライブラリを使うときは、必要な機能だけを読み込んだり(ツリーシェイキング対応の場合)、プロジェクトの要件に合った軽量なものを選んだりすることも大切だよ。CDNを使うのも良い方法だね。

⏱️ パフォーマンスを測ってみよう!

自分の作ったウェブサイトがどれくらいの速さで表示されているか、どこで時間がかかっているかを知るには、ブラウザに搭載されている「開発者ツール」がとても役に立つよ。

特に、Google ChromeのDevToolsには、以下のような便利な機能があるんだ。

  • Lighthouse (ライトハウス) タブ: サイトのパフォーマンス、アクセシビリティ、SEOなどを総合的に診断して、改善点をレポートしてくれる。
  • Performance (パフォーマンス) タブ: ページの読み込みや操作中の詳細な処理内容(JavaScriptの実行時間、CSSのレンダリング時間など)を記録して、ボトルネック(処理が遅くなっている箇所)を見つけることができる。

最初は難しく感じるかもしれないけど、これらのツールを使って自分のサイトのパフォーマンスを「見える化」することは、改善への第一歩だよ!

🇬🇧英語の豆知識コーナー

パフォーマンス最適化に関連する言葉だよ!

  • Performance

    意味:パフォーマンス、性能、実行速度

    Original: Improving website performance is crucial for user satisfaction and SEO.

    意訳:ウェブサイトのパフォーマンスを向上させることは、ユーザー満足度とSEOにとって非常に重要です。

  • Optimization

    意味:最適化

    Original: Code optimization involves making the code run faster and more efficiently.

    意訳:コードの最適化には、コードをより速く、より効率的に実行できるようにすることが含まれます。

  • Event Delegation

    意味:イベント委譲

    Original: Use event delegation to handle events on multiple child elements efficiently.

    意訳:複数の子要素のイベントを効率的に処理するために、イベント委譲を使用します。

  • Debounce / Throttle

    意味:デバウンス / スロットル(頻繁に発生するイベントの実行回数を制御するテクニック)

    Original: Debounce or throttle scroll event handlers to improve performance.

    意訳:パフォーマンスを向上させるために、スクロールイベントハンドラをデバウンスまたはスロットルします。

  • Lazy Loading

    意味:遅延読み込み

    Original: Lazy loading images can significantly speed up initial page load time.

    意訳:画像の遅延読み込みは、初期ページの読み込み時間を大幅に短縮できます。

  • Rendering

    意味:レンダリング、描画(ブラウザがコードを解釈して画面に表示すること)

    Original: Complex CSS can sometimes slow down the rendering process.

    意訳:複雑なCSSは、レンダリングプロセスを遅くすることがあります。

  • Layout Thrashing

    意味:レイアウトスラッシング(JavaScriptでレイアウト情報の読み取りと書き込みを交互に行うことで、強制的な再計算が何度も発生し、パフォーマンスが低下する現象)

    Original: Avoid layout thrashing by batching DOM reads and writes.

    意訳:DOMの読み取りと書き込みをバッチ処理することで、レイアウトスラッシングを避けてください。

まとめ

今回は、ウェブサイトのパフォーマンスを良く保つためのヒント、特にツールチップやモーダルを実装する際に気をつけたい点について学んだね。

  • パフォーマンスはユーザー体験やSEOにも影響する大切な要素。
  • JavaScriptでは、イベントリスナーの効率化(イベント委譲など)、DOM操作の最小化、遅延読み込みなどがポイント。
  • CSSでは、アニメーションに使うプロパティを選んだり、セレクタをシンプルにしたりすることが効果的。
  • 画像や利用するライブラリの最適化も忘れずに。
  • 開発者ツールを使って、自分のサイトのパフォーマンスを測ってみよう!

パフォーマンスの改善は、一度やったら終わりではなく、ウェブサイトを作りながら常に意識していくことが大切だよ。今日学んだヒントを頭の片隅に置いて、これからも「速くて快適な」ウェブサイト作りを目指していこう!

さて、これで第4章「応用編」も完了だ!基本的なテクニックから応用、そして周辺知識まで幅広く学んできたね。次の第5章では、いよいよこれまでの知識を使って、実際に手を動かして練習する「実践トレーニング」に挑戦するよ!