1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

JavaScriptAdvent Calendar 2024

Day 25

tabIndex と focus を使ったページロード時のスクロール制御

Posted at

はじめに

Web ページを構築する際に、ページロード時にスクロールする要素を制御したい場合があります。

例えば、以下のページは bodyheight200vh に設定しています。ページロード時に、キーボードの下矢印キーを押すと、ページ全体がスクロールします。ページ内に表示されている 3 つの記事のいずれかをスクロールさせる場合、工夫が必要です。

スクリーンショット 2024-07-17 5.23.41.png

本記事では、tabIndexfocus を組み合わせて、スクロールする要素を制御する方法を紹介します。

HTML

HTML ファイルを作成します。3 つの記事の要素を記述します。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>

  <body>
    <div class="container">
      <div class="outer">
        <div class="inner">
          <h2>Title 1</h2>
          <p>
            Lorem, ipsum dolor sit amet consectetur adipisicing elit. Tempore,
            corrupti nesciunt reiciendis reprehenderit odio quis exercitationem,
            ab harum ut unde maiores dolores a culpa mollitia. Aspernatur aut
            beatae voluptatibus explicabo!
          </p>
          <p>
            Lorem, ipsum dolor sit amet consectetur adipisicing elit. Tempore,
            corrupti nesciunt reiciendis reprehenderit odio quis exercitationem,
            ab harum ut unde maiores dolores a culpa mollitia. Aspernatur aut
            beatae voluptatibus explicabo!
          </p>
        </div>
      </div>

      <div class="outer">
        <div class="inner">
          <h2>Title 2</h2>
          <p>
            Lorem, ipsum dolor sit amet consectetur adipisicing elit. Tempore,
            corrupti nesciunt reiciendis reprehenderit odio quis exercitationem,
            ab harum ut unde maiores dolores a culpa mollitia. Aspernatur aut
            beatae voluptatibus explicabo!
          </p>
          <p>
            Lorem, ipsum dolor sit amet consectetur adipisicing elit. Tempore,
            corrupti nesciunt reiciendis reprehenderit odio quis exercitationem,
            ab harum ut unde maiores dolores a culpa mollitia. Aspernatur aut
            beatae voluptatibus explicabo!
          </p>
        </div>
      </div>
      <div class="outer">
        <div class="inner">
          <h2>Title 3</h2>
          <p>
            Lorem, ipsum dolor sit amet consectetur adipisicing elit. Tempore,
            corrupti nesciunt reiciendis reprehenderit odio quis exercitationem,
            ab harum ut unde maiores dolores a culpa mollitia. Aspernatur aut
            beatae voluptatibus explicabo!
          </p>
          <p>
            Lorem, ipsum dolor sit amet consectetur adipisicing elit. Tempore,
            corrupti nesciunt reiciendis reprehenderit odio quis exercitationem,
            ab harum ut unde maiores dolores a culpa mollitia. Aspernatur aut
            beatae voluptatibus explicabo!
          </p>
        </div>
      </div>
    </div>
  </body>
</html>

CSS

head 要素内に style を記述します。各記事の outer に固定の高さを設定し、inner がスクロール可能になるようにスタイルを設定します。

<head>
  <style>
    body {
      height: 200vh;
      background-color: blanchedalmond;
    }
    .container {
      display: flex;
      align-items: center;
      justify-content: center;
    }
    .outer {
      width: 300px;
      height: 300px;
      margin: 10px;
      overflow-y: scroll;
    }
    .inner {
      height: 500px;
      padding: 5px 10px;
      background-color: #333;
      color: #fff;
    }
  </style>
</head>

tabIndex の設定

ページロード時のスクロールできるようにしたい要素に tabIndex 属性を追加します。

通常の HTML ではフォーカス可能な要素はリンク(a 要素)やフォームコントロール(inputtextarea など)に限られます。しかし、div 要素でもtabIndex 属性を追加することで、その要素がフォーカス可能になり、JavaScript を使ってフォーカスを設定できるようになります。JavaScript でこの要素を操作するため id 属性も追加します。

以下では Title 2 の記事に tabIndex 属性を追加しています。

<div class='outer'>
-   <div class='inner' >
+   <div class='inner' id='focus' tabIndex='0' >
        <h2>Title 2</h2>
        <p>Lorem, ipsum dolor sit amet consectetur adipisicing elit. Tempore, corrupti nesciunt reiciendis reprehenderit odio quis exercitationem, ab harum ut unde maiores dolores a culpa mollitia. Aspernatur aut beatae voluptatibus explicabo!</p>
        <p>Lorem, ipsum dolor sit amet consectetur adipisicing elit. Tempore, corrupti nesciunt reiciendis reprehenderit odio quis exercitationem, ab harum ut unde maiores dolores a culpa mollitia. Aspernatur aut beatae voluptatibus explicabo!</p>
    </div>
</div>

警告: tabindex の値として、0 と -1 のみを使用することをお勧めします。tabindex の値を 0 より大きくしたり、フォーカス可能な HTML 要素の順序を変更できる CSS プロパティ(フレックスアイテムの順序)を使用したりしないようにしましょう。これは、キーボードによるナビゲーションや支援技術を使用している人にとって、ページのコンテンツを操作することが難しくなります。代わりに、論理的な順序で要素を記述してください。

tabindex - HTML: ハイパーテキストマークアップ言語 | MDN
:::

JavaScript でフォーカスを設定

head 要素内に script を記述します。ページロード時に特定の記事にフォーカスを設定するために、JavaScript を使用します。

<body>
  <script>
    document.getElementById("focus").focus();
  </script>
</body>

おわりに

本記事で紹介した方法によって、ユーザーにすぐに見せたいコンテンツを強調することが可能になります。ユーザーの注意を特定の部分に向けたい場合に特に便利です。

1
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?