メディア スクローラー コンポーネントの作成

テレビ、スマートフォン、パソコンなど向けにレスポンシブな横向きスクロールビューを作成する方法の基本的な概要です。

この投稿では、横スクロールを作成する方法についての考え方をご紹介します。 最小限の応答性とアクセス性を備えた ウェブ向けのエクスペリエンスを ブラウザやプラットフォーム(TV など)にも対応しています。ぜひ、 demo

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
</ph> デモ

動画で視聴したい場合は、この投稿の YouTube バージョンをご利用ください。

概要

コンテンツのサムネイルをホストするための水平スクロールレイアウトを作成します 広告ですコンポーネントはシンプルな <ul> リストとして始まりますが、 CSS を使って快適でスムーズなスクロール操作を実現し、 グリッド表示にすることもできますJavaScript を追加して 移動とインデックスのインタラクションにより、キーボード ユーザーは 100 以上のアイテム間を移動をスキップできます。 さらに、試験運用版のメディアクエリ prefers-reduced-data を使用して、 メディア スクローラーを軽量のタイトル スクローラー エクスペリエンスに変更します。

アクセス可能なマークアップから始める

メディア スクローラーは、いくつかのコア コンポーネント、つまりアイテムのリストで構成されます。 最もシンプルな形式で世界中を飛び回り、 消費するものです。このページにアクセスしたユーザーは、リストを参照してリンクをクリックできる アイテムを表示します。ここが、私たちのアクセス可能な基地です。

<ul> 要素を使用してリストを提供する:

<ul class="horizontal-media-scroller">
  <li></li>
  <li></li>
  <li></li>
  ...
<ul>

<a> 要素を使用してリストアイテムをインタラクティブにします。

<li>
  <a href="#">
    ...
  </a>
</li>

<figure> 要素を使用して、画像とそのキャプションを意味的に表現します。

<figure>
  <picture>
    <img alt="..." loading="lazy" src="https://picsum.photos/500/500?1">
  </picture>
  <figcaption>Legends</figcaption>
</figure>

<img>alt 属性と loading 属性に注目してください。メディアの代替テキスト スクローラーは、サムネイルに追加のコンテキストを提供する UX の機会 画像が読み込まれなかった場合は代替テキストが表示されます。また、ユーザーに音声 UI が提供されます。 スクリーン リーダーなどの支援技術に依存しています。Five Golden で詳細を確認する 準拠する alt ルール text です。

loading 属性には、この画像を示す方法としてキーワード lazy を指定できます。 source は、画像がビューポート内にある場合にのみ取得する必要があります。これは次のいずれかです。 ユーザーは自分が閲覧しているアイテムの画像だけをダウンロードするので、大規模なリストに適しています。 ビューにスクロールしました

ユーザーが希望するカラーパターンをサポートする

color-scheme<meta> タグとして使用して、ページが閲覧されていることをブラウザに伝えます 両方のユーザー エージェント スタイルが必要です。無料のダークモードです 見方に応じて、[ライトモード] または [ライトモード] を選択できます。

<meta name="color-scheme" content="dark light">

メタタグが可能な限り早く通知されるため、ブラウザは ユーザーがダークモードを設定している場合は、暗いデフォルトのキャンバス色を選択できます。 つまり、サイトのページ間を移動しても白いキャンバスは点滅しません バックグラウンドで実行される場合があります。読み込み間でのシームレスなダークモード、より快適に 目。

Thomas Steiner の詳細: https://web.dev/color-scheme/.

コンテンツを追加

上記の ul > li > a > figure > picture > img のコンテンツ構造を考えると、次のようになります。 次のタスクは、スクロールする画像とタイトルの追加です。デモについては以上です 静的なプレースホルダ画像とテキストが 使用されますが お好みのデータソースです

CSS でスタイルを追加する

次に、CSS はこの汎用的なコンテンツ リストを使用して、 体験できますNetflix、アプリストアなど、多くのサイトやアプリで横向きが使用されています スクロール領域を使用して ビューポートをカテゴリやオプションを詰め込みます

スクローラー レイアウトの作成

レイアウトでコンテンツが途切れることや、テキストに頼ることは避けることが重要です。 省略記号付きで切り捨てられます。多くのテレビには、メディア スクローラーが コンテンツを省略する傾向がありますこのレイアウトは違います。 また、メディア コンテンツが列サイズをオーバーライドして、1 つのレイアウトになるようにすることもできます。 多くの興味深い組み合わせを処理できる 柔軟性が得られます

2
表示されます。1 つは省略記号がないため、それぞれのアイコンが縦に長く、
タイトルが完全に読み取れます。もう一方は短く、タイトルが途切れがちです
省略記号が表示されます。

コンテナでは、デフォルトのサイズを次のように指定することで、列のサイズをオーバーライドできます。 カスタムプロパティを作成しますこのグリッド レイアウトは列のサイズに関するものであり、 間隔と方向のみを管理する:

.horizontal-media-scroller {
  --size: 150px;

  display: grid;
  grid-auto-flow: column;
  gap: calc(var(--gap) / 2); /* parent owned value for children to be relative to*/
  margin: 0;
}

このカスタム プロパティを <picture> 要素で使用して、基本アスペクト比であるボックスを作成します。

.horizontal-media-scroller {
  --size: 150px;

  display: grid;
  grid-auto-flow: column;
  gap: calc(var(--gap) / 2);
  margin: 0;

  & picture {
    inline-size: var(--size);
    block-size: var(--size);
  }
}

マイナー スタイルをいくつか追加するだけで、メディア スクローラーの最低限の機能が完成します。

.horizontal-media-scroller {
  --size: 150px;

  display: grid;
  grid-auto-flow: column;
  gap: calc(var(--gap) / 2);
  margin: 0;

  overflow-x: auto;
  overscroll-behavior-inline: contain;

  & > li {
    display: inline-block; /* removes the list-item bullet */
  }

  & picture {
    inline-size: var(--size);
    block-size: var(--size);
  }
}

overflow を設定すると、<ul> が設定され、スクロールとキーボード ナビゲーションが可能になります。 直接的な子要素である各 <li> 要素の ::marker が削除される 新しいディスプレイタイプ inline-block を取得します。

画像がまだ反応しておらず、箱から出してすぐにバーストする 探しますサイズ、フィット感、枠線のスタイルを変える。 遅延読み込み時の背景グラデーション:

img {
  /* smash into whatever box it's in */
  inline-size: 100%;
  block-size: 100%;

  /* don't squish but do cover the space */
  object-fit: cover;

  /* soften the edges */
  border-radius: 1ex;
  overflow: hidden;

  /* if empty, show a gradient placeholder */
  background-image:
    linear-gradient(
      to bottom,
      hsl(0 0% 40%),
      hsl(0 0% 20%)
    );
}

スクロールのパディング

ページ コンテンツに合わせた配置と、端から端までのスクロール領域は、 調和のとれた最小限の要素に不可欠です

タイポグラフィに合わせて端から端までのスクロール レイアウトを実現する レイアウト行については、scroll-padding に一致する padding を使用します。

.horizontal-media-scroller {
  --size: 150px;

  display: grid;
  grid-auto-flow: column;
  gap: calc(var(--gap) / 2);
  margin: 0;

  overflow-x: auto;
  overscroll-behavior-inline: contain;

  padding-inline: var(--gap);
  scroll-padding-inline: var(--gap);
  padding-block: calc(var(--gap) / 2); /* make space for scrollbar and focus outline */
}

水平スクロールのパディングのバグの修正 上の図は、Google Cloud で スクロール コンテナはパディングされているが、互換性に関する未解決の問題がある (ただし、Chromium 91 以降では修正されています)。詳しくは、 こちら 簡単に言えばパディングは 確認できます。


最後のリストアイテムのインライン端でハイライト表示され、
パディングと要素の幅を、目的の配置を作成するために同じ幅にすること。

ブラウザがスクローラーの最後にパディングを追加するよう、 各リストの最後の図をターゲットとして、 調整します。

.horizontal-media-scroller > li:last-of-type figure {
  position: relative;

  &::after {
    content: "";
    position: absolute;

    inline-size: var(--gap);
    block-size: 100%;

    inset-block-start: 0;
    inset-inline-end: calc(var(--gap) * -1);
  }
}

論理プロパティを使用すると、メディア スクローラーがあらゆる書き込みモードで動作できるようになります。 ドキュメントの方向性を決定します

スクロールのスナップ

オーバーフローのあるスクロール コンテナは、1 行の CSS を使用してスナップするビューポートになり、子でそのビューポートとどのように配置するかを指定します。

.horizontal-media-scroller {
  --size: 150px;

  display: grid;
  grid-auto-flow: column;
  gap: calc(var(--gap) / 2);
  margin: 0;

  overflow-x: auto;
  overscroll-behavior-inline: contain;

  padding-inline: var(--gap);
  scroll-padding-inline: var(--gap);
  padding-block-end: calc(var(--gap) / 2);

  scroll-snap-type: inline mandatory;

  & figure {
    scroll-snap-align: start;
  }
}

フォーカス

このコンポーネントの着想は、テレビでの 。多くのビデオゲーム プラットフォームでは、メディア スクローラーが メインのホーム画面レイアウトとして これに似ています焦点は巨大な UX 少し追加するのではなく、このメディアスクローラーを たとえば

.horizontal-media-scroller a {
  outline-offset: 12px;

  &:focus {
    outline-offset: 7px;
  }

  @media (prefers-reduced-motion: no-preference) {
    & {
      transition: outline-offset .25s ease;
    }
  }
}

これにより、フォーカス アウトライン スタイル 7px がボックスから切り離され、見栄えが良くなります。 選択します。ユーザーにモーションの抑制に関する好みがない場合、オフセットは フォーカス イベントに微妙な動きを加えます。

ロービング指数

次の長いリストでは、ゲームパッドとキーボードの使用に特別な注意が必要になります。 オプションを使用します。これを解決する一般的なパターンは、 ローリング インデックス。このとき、 アイテムのコンテナはキーボード フォーカスですが、フォーカスを保持できるのは 1 つの子のみです 一度に 1 つずつですフォーカス可能な 1 つのアイテムを一度に表示する機能により、次のことが可能になります。 Tab キー 50+ する必要があります。

デモの最初のスクローラーには 300 のアイテムがあります。自分の考えをまとめるよりも、 そのすべてを走査して次のセクションに進みます

この機能を実現するには、JavaScript でキーボード イベントを監視してフォーカスする必要があります。 できます。Google Cloud 上に小さなオープンソース ライブラリを npm で、このユーザーが 簡単に達成できます。3 つのスクローラーでの使用方法は次のとおりです。

import {rovingIndex} from 'roving-ux';

rovingIndex({
  element: someElement
});

このデモでは、ドキュメントに対してスクローラーのクエリを実行し、スクローラーごとに rovingIndex() 関数を使用します。rovingIndex() に要素を渡すと、ロービングを取得できます。 ターゲット クエリ セレクタを利用できる場合は、 直接の子孫ではありません

document.querySelectorAll('.horizontal-media-scroller')
  .forEach(scroller =>
    rovingIndex({
      element: scroller,
      target: 'a',
}))

このエフェクトについて詳しくは、オープンソース ライブラリをご覧ください。 roving-ux

アスペクト比

この投稿の執筆時点では、 aspect-ratio は Chromium ブラウザやセットトップ ボックスでは使用できます。以降、 メディア スクローラーのグリッド レイアウトでは、方向と間隔のみを指定します。 アスペクト比のサポートを確認する機能です。 より動的なメディア スクローラーへの段階的な機能強化。


アスペクト比 4:4 のボックスを、他のデザイン比 16:9 の隣に表示。
および 4:3

@supports (aspect-ratio: 1) {
  .horizontal-media-scroller figure > picture {
    inline-size: auto; /* for a block-size driven ratio */
    aspect-ratio: 1; /* boxes by default */

    @nest section:nth-child(2) & {
      aspect-ratio: 16/9;
    }

    @nest section:nth-child(3) & {
      /* double the size of the others */
      block-size: calc(var(--size) * 2);
      aspect-ratio: 4/3;

      /* adjust size to fit more items into the viewport */
      @media (width <= 480px) {
        block-size: calc(var(--size) * 1.5);
      }
    }
  }
}

ブラウザが aspect-ratio 構文をサポートしている場合、メディア スクローラーの画像は aspect-ratio サイズにアップグレードしました。ドラフトのネスト構文を使用すると、 は、1 行目、2 行目、3 行目に応じてアスペクト比を変更します。「 nest 構文では、いくつかの小さな関数を 他のサイズロジックでも同じように使用できます。

この CSS では、この機能をより多くのブラウザ エンジンで利用できるようになるため、 より視覚に訴えるレイアウトがレンダリングされます。

データを削減する

この次の手法は カナリア 今回はページ読み込み時間を大幅に短縮し 数行の CSS でデータを使用することができます。prefers-reduced-data メディアクエリ: レベル 5: デバイスが設置されているかどうかを尋ねることができます。 データセーバー モードなど、データの縮小状態。存在する場合は、 この場合は、画像を非表示にします。

ALT_TEXT_HERE

figure {
  @media (prefers-reduced-data: reduce) {
    & {
      min-inline-size: var(--size);

      & > picture {
        display: none;
      }
    }
  }
}

コンテンツは引き続き操作可能ですが、サイズの大きな画像を ダウンロードされます。以下は、prefers-reduced-data CSS を追加する前のサイトです。

(131 ミリ秒で 7 件のリクエスト、100 KB のリソース)

ALT_TEXT_HERE

CSS 「prefers-reduced-data」を追加した後のサイトのパフォーマンスは次のようになります。

ALT_TEXT_HERE

(71 件のリクエスト、1.07 秒で 1.2 MB のリソース)

リクエストが 64 回減る。ビューポート内の画像は最大 60 枚になる(テストは (ワイド スクリーン ディスプレイに表示)され、ページの読み込みが約 80% 増加しました。 データの 10% が転送されています非常に強力な CSS です。

まとめ

私のやり方わかったな、どうやって?!🙂

アプローチを多様化して、ウェブで構築するすべての方法を学びましょう。 Codepen を作成するか独自のデモをホストして、ツイートしてください。 以下のコミュニティ リミックスのセクションをご確認ください。

ソース

コミュニティ リミックス

ここにはまだ何も表示されません。