JavaScript

【コピペOK】スクロールヒントを簡単実装!|応用テクニック5選

スクロール可能なことをユーザーに伝える!スクロールヒントの実装と最適化

Webページに横スクロールが必要なコンテンツがある場合、「スクロールできますよ!」 というヒントをユーザーに表示することで、直感的に操作しやすくなるスクロールできるのに気づかない、ということがなくなるというメリットがあります。

この記事では、スクロールヒント(スクロールインジケーター)をシンプルなHTML・CSS・JavaScriptで実装 する方法を紹介します。

スクロールヒント・スクロールインジケーターとは?

スクロールヒント(スクロールインジケーター)とは、横スクロールが必要な場合に「スクロールできます」と知らせるUI要素 です。

たとえば、こういうテーブル。
PCの時は問題ありませんが、スマホの時は幅も狭くなるので、横にスクロールが出来るようにしています。

See the Pen Untitled by kokusyo (@kokusyo) on CodePen.

このサンプルはスマホ表示を再現するため、あえて狭いwidthを指定しています。
横にスクロールできますが、人によってはスクロールできることに気づかずに、せっかく作ったコンテンツを見てくれないかもしれません。

では、これにスクロールヒントをつけてみましょう。

ワンコ
ワンコ

See the Pen Untitled by kokusyo (@kokusyo) on CodePen.

横にスクロールできることが一目で分かりますね。
これで、スクロールできるのに気づかれないということもなくなります。

ワンコ
ワンコ

よく使われる場面

先ほどの例は、スマホ表示のテーブルでしたが、他にも様々な場所で使用できます。

  • テーブル(表)やカレンダー など、横スクロールが必要なコンテンツ
  • スマホ対応のスライダー など、直感的な操作が必要な場面
  • 横スクロールに気づきにくいデザイン の場合

実装コード(コピペOK!)

それでは実装コードを見ていきましょう。
といっても、HTML,CSS,JavaScriptどれも基本的なコードしかなく、とっても簡単です。

HTML

.scroll-indicatorクラスのブロックが、スクロールヒントのタグです。
今回は指でスワイプしてる画像を入れて分かりやすくしていますが、文字だけのものにしてもいいし、矢印をつけても良いです。
クラス名も好きに変えてください。

<div class="table-container">
    <table>
        <thead>
            <tr>
                <th>日付</th>
                <th>イベント名</th>
                <th>開始時間</th>
                <th>終了時間</th>
                <th>場所</th>
                <th>参加者</th>
                <th>備考</th>
            </tr>
        </thead>
        <tbody>
            <tr><td>2024/02/10</td><td>会議</td><td>10:00</td><td>11:30</td><td>会議室A</td><td>5名</td><td>資料準備</td></tr>
            <tr><td>2024/02/15</td><td>ランチミーティング</td><td>12:00</td><td>13:00</td><td>カフェB</td><td>3名</td><td>メニュー予約</td></tr>
            <tr><td>2024/02/18</td><td>開発会議</td><td>14:00</td><td>16:00</td><td>オンライン</td><td>10名</td><td>Zoomリンク共有</td></tr>
            <tr><td>2024/02/22</td><td>社内研修</td><td>09:00</td><td>12:00</td><td>セミナールーム</td><td>20名</td><td>プロジェクター使用</td></tr>
            <tr><td>2024/02/25</td><td>クライアントミーティング</td><td>15:00</td><td>17:00</td><td>会議室B</td><td>6名</td><td>契約書準備</td></tr>
        </tbody>
    </table>

    <!-- スクロールヒント -->
    <div class="scroll-indicator">
      <div class="scroll-indicator-inr">
          <div><img src="img_scroll_hint.png" alt="スクロールできます。"></div>
          <div>スクロールできます</div>
      </div>
    </div>
</div>

CSS

こちらも特に難しいことはありません。
CSSのポイントはコード内のコメントに記載しています。

/* スクロールヒントのスタイル */
.scroll-indicator {
    opacity: 0.7;

    /* absoluteを使用し、スクロールヒントを中央配置 */
    position: absolute;
    left: 50%;
    top: 50%;

    /* クリックを無効化
    スクロールヒントがクリックの邪魔になる可能性があるため */
    pointer-events: none; 

    /* transitionを指定し、ゆっくりと非表示にする */
    transition: opacity 0.3s ,visibility 0.3s;
}

/* スクロールされた後もスクロールヒントが残っていると邪魔なため、
ある程度スクロールされたら非表示にする */
.scroll-indicator.is-scroll {
    visibility: hidden;
    opacity: 0;
}

.scroll-indicator-inr {
    font-size: 12px;
    transform: translate(-50%, -50%);
    background: rgba(0, 0, 0, 0.5);
    color: white;
    padding: 15px 10px;
    border-radius: 5px;
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    animation: fadeBlink 2s infinite ease-in-out;
}

.scroll-indicator-inr img {
    width: 50px;
}

/* スクロールヒントの点滅アニメーション */
@keyframes fadeBlink {
    0% { opacity: 0.2; }
    50% { opacity: 1; }
    100% { opacity: 0.2; }
}

JavaScript

JavaScriptを複雑な処理は全くありません。
ユーザーが .table-container(スクロール可能な要素)を横方向に10px以上スクロールしたらis-scrollクラスを付与して、スクロールヒントを非表示にするだけです。

document.addEventListener("DOMContentLoaded", function () {

    // スクロールさせる親要素
    const tableContainer = document.querySelector(".table-container");

    // スクロールヒント
    const hint = document.querySelector(".scroll-indicator");

    tableContainer.addEventListener("scroll", function () {

        // 横方向に10px以上スクロールしたらクラスを付与
        if (tableContainer.scrollLeft > 10) {
            hint.classList.add("is-scroll");
        }
    });
});

応用

スマホの時だけ表示する

スクロールヒントをスマホの時だけ表示したい場合は、display:noneを指定しておき、メディアクエリでスマホサイズの時に表示するようにします。

.scroll-indicator {
    display: none;
}

@media (max-width: 600px) {
    .scroll-indicator {
        display: block;
    }
}

一定時間後に自動で消える

  • スクロールしなくても、一定時間(例:5秒)経ったら 自動で消える
  • ユーザーがスクロールしない場合でも、画面を邪魔しないようにする。

See the Pen Untitled by kokusyo (@kokusyo) on CodePen.

setTimeout() を使い、一定時間後に is-scroll クラスを追加して非表示にする。

document.addEventListener("DOMContentLoaded", function () {
    const hint = document.querySelector(".scroll-indicator");

    // 5秒後に自動で消す
    setTimeout(() => hint.classList.add("is-scroll"), 5000);
});

スクロールが出来る場合だけ表示する

スマホは @media で対応できますが、PCでは「スクロールバーがあるかどうか」で表示するか決めることができます。
scrollWidth > clientWidth を判定して、スクロールが必要な場合のみヒントを表示 する。

document.addEventListener("DOMContentLoaded", function () {
    const tableContainer = document.querySelector(".table-container");
    const hint = document.querySelector(".scroll-indicator");

    // スクロールが必要な場合のみヒントを表示
    if (tableContainer.scrollWidth > tableContainer.clientWidth) {
        hint.style.display = "block";
    }
});

スクロールが戻ったらヒントを再表示

  • ユーザーがスクロールしたらヒントを非表示にする(通常の動作)。
  • スクロール位置を一番左に戻したら、再度ヒントを表示する
  • スクロールのたびに表示・非表示が切り替わるので、分かりやすいUIになる!

See the Pen Untitled by kokusyo (@kokusyo) on CodePen.

scrollLeft === 0 になったら、is-scroll クラスを削除してヒントを再表示

document.addEventListener("DOMContentLoaded", function () {
    const tableContainer = document.querySelector(".table-container");
    const hint = document.querySelector(".scroll-indicator");

    tableContainer.addEventListener("scroll", function () {
        if (tableContainer.scrollLeft > 10) {
            hint.classList.add("is-scroll"); // スクロール開始で非表示
        } else if (tableContainer.scrollLeft === 0) {
            hint.classList.remove("is-scroll"); // 左端に戻ったら再表示
        }
    });
});

クリックでヒントを消す

スクロールヒントをクリックで消すこともできます。

See the Pen Untitled by kokusyo (@kokusyo) on CodePen.

その際は、pointer-eventsを削除しておきましょう。

pointer-events: none; /* クリックを無効化 */
document.addEventListener("DOMContentLoaded", function () {
    const hint = document.querySelector(".scroll-indicator");

    hint.addEventListener("click", function () {
        hint.classList.add("is-scroll");
    });
});

まとめ

スクロールインジケーターは、ユーザーが横スクロール可能なことに気づきやすくする便利なUI です。
本記事では、基本的なスクロールヒントの実装に加え、より使いやすくするための応用テクニック を紹介しました。

これらのテクニックを組み合わせることで、より直感的でユーザーに優しいスクロールナビゲーションを作ることができます!

ぜひ、自分のサイトやアプリのデザインに合わせてカスタマイズし、より快適なUXを提供できるスクロールインジケーターを実装 してみてください! 🚀✨

-JavaScript
-,