Skip to content
This page has been auto-translated and may contain errors.View in English

画像とメディア

docs.scrimba.com

Webページの多くはテキストで構成されていますが、すべてがそうではありません。写真、図、イラスト、ビデオクリップ、サウンドもコンテンツであり、HTMLにはそれぞれの要素があります。この章は、ページにメディアを配置するマークアップについてです。画像ファイルへの参照方法、見ることができない人のための説明方法、そして誰のデータも無駄にすることなく正しいスクリーンに正しいファイルを配信する方法です。

画像要素

ページに画像を配置するには、画像要素<img>と書きます)を使います。コンテンツはなく、閉じタグもありません。代わりに、属性を通じて2つのことを指定します。表示するファイルと、画像が何であるかです。

html
<img src="golden-retriever.jpg" alt="草むらに座っているゴールデンレトリバー">

srcはソース(source)です。画像ファイルのパスまたはWebアドレスです。altは代替テキスト(alternative text)です。画像の説明を言葉で表したものです。画像が読み込めない場合、または誰かが見る代わりにスクリーンリーダーでページを聴いている場合、altテキストが提供されるものです。だから、友人に電話で画像を説明するかのように書きましょう。

<img>要素は外部ファイルをページに引き込みます。これはvoid要素なので、閉じタグはありません。必要なすべては属性に格納されます。重要な2つがあります。

html
<img src="/images/team-photo.jpg" alt="デスクに座っている設計チームの5人のメンバー">

srcはファイルのパスで、ページに相対的、または絶対URLです。altは**代替テキスト**で、画像が表示されないか、見ることができない場合に画像の代わりになる言葉です。

altを正しく取得することは、人々がスキップすべきでない部分です。画像のファイルの詳細ではなく、内容と目的を説明してください。「2023年と2024年の間に売上が2倍になったことを示す棒グラフ」は読者にグラフが何を言っているかを伝えます。「chart.png」は何も伝えません。1文で保ち、「Image of」で始めないでください。ブラウザはすでにそれが画像であることを知っています。

<img>はvoid要素で、外部リソースを読み込み、デフォルトではテキストでインラインレイアウトします。実際の仕事をする2つの属性があります。src(リソースURL)とalt(テキスト代替)です。このセクションの残りはaltについてです。なぜなら、それは画像のアクセシビリティと正確性が実際に存在する場所だからです。

alt属性はキャプションではなく、ファイルの説明でもありません。それは置き換えです。ブラウザが画像の代わりにレンダリングするテキスト(画像がない場合)であり、スクリーンリーダー(見ることができない人のためにページを声で読む方法)が画像の代わりに話すテキストです。テストは機能的等価性です。画像を削除してaltテキストをフローにドロップした場合、文は依然として意味があり、同じ情報を伝えますか?良いaltはそのテストに合格します。「photo1」はしません。

これから2つのルールが続きます。まず、ピクセルではなく目的を説明してください。検索ボタン内の虫眼鏡アイコンは、alt="magnifying glass"ではなくalt="Search"を持ちます。なぜなら、ページでの仕事は描画ではなくアクションだからです。次に、装飾的な画像は空のaltを取ります。画像が情報を追加しない場合、背景の華飾または区切り文字です。alt=""と引用符の間に何もなく書きます。これはaltを省略するのと同じではありません。空のaltは補助技術に「これをスキップしてください、意味がありません」と伝えます。一方、欠落しているaltはスクリーンリーダーにファイル名を声で読ませるようにフォールバックします。これは沈黙よりも悪いです。

html
<!-- 意味のある:それが伝えるものを説明する -->
<img src="revenue-2024.png" alt="2024年全体で収益は120万から240万に上昇した">

<!-- 装飾的:空のalt、補助技術がスキップする -->
<img src="corner-flourish.svg" alt="">
Juno画像要素 画像には2つのことが必要です。src(表示するファイル)とalt(画像を言葉で説明するもの)です。altを電話で誰かに写真の中身を説明しているかのように書いてください。最もスキップされる部分であり、最も重要な部分です。
Juno画像要素<img>はvoid要素です。閉じタグはなく、すべてが属性にあります。ファイルではなく、画像が何を言っているかを説明してください。Image ofで始めないでください。ブラウザはそれが画像であることを既に知っています。グラフのaltは、グラフが作成している数値を誰かに伝える必要があります。
Juno画像要素 良いaltはキャプションではなく、置き換えです。文に落とし込めば意味が残るべきです。描画ではなく仕事を説明してください。だから検索アイコンはSearchと読みます。そして装飾的な画像のalt=""は実際の選択肢です。スクリーンリーダーにスキップするように伝えます。欠落しているaltはファイル名を声で読ませます。

レスポンシブ画像

ノートパソコンでは鮮明に見える写真は、スマートフォンが必要とするサイズより大きい場合があります。そのフルサイズファイルを小さいスクリーンに送ると、訪問者のデータが無駄になり、ページが遅くなります。HTMLでは、同じ画像の複数のバージョンを提供し、ブラウザに合ったものを選ばせることができます。

開始している間、すべての画像にこれが必要なわけではありません。合理的なファイルを含む単一の<img>で十分です。しかし、この考えが存在することを知ることは役に立ちます。同じ写真は複数のサイズで提供でき、ブラウザが選択します。

html
<img src="beach-800.jpg" alt="夕暮れ時に海岸に転がる波">

**レスポンシブ画像は、ブラウザがスクリーンに基づいてファイルを選択できます。1つのソースをハードコードする代わりに、srcsetで複数をリストし、sizesで画像がどのくらい広く表示されるかを説明します。ブラウザは計算を行い、最適な一致をダウンロードします。

html
<img
  src="beach-800.jpg"
  srcset="beach-400.jpg 400w, beach-800.jpg 800w, beach-1600.jpg 1600w"
  sizes="(max-width: 600px) 100vw, 50vw"
  alt="夕暮れ時に海岸に転がる波">

srcsetでは、各エントリはファイルをその実ピクセル幅とペアにします(400wはファイルが400ピクセル幅であることを意味します)。sizesでは、画像が占めるスペースをブラウザに伝えます。ここでは、600ピクセルまでのスクリーンでビューポート幅全体(100vw)を埋め、そうでなければ幅の半分(50vw)です。srcは古いブラウザのフォールバックのままです。altは一度だけ書かれ、すべてのソースに適用されることに注意してください。それらはすべて同じ画像だからです。

サイズの交換以上が必要な場合、<picture>に手を伸ばしてください。複数の<source>要素と1つの<img>をラップし、ブラウザは最初にマッチするものを使用します。これはアート方向を処理します。異なるトリミングされた画像をさまざまな幅で配信し、最新のファイル形式です。

html
<picture>
  <source srcset="hero.avif" type="image/avif">
  <source srcset="hero.webp" type="image/webp">
  <img src="hero.jpg" alt="夜明けに山道を登る2人のサイクリスト">
</picture>

ブラウザは上から下に読み、理解できる最初の形式を選び、どれも一致しない場合、プレーン<img>にフォールバックします。内側の<img>は必須です。実際にレンダリングされ、altが存在する場所です。

レスポンシブ画像は解像度切り替え問題を解決します。同じ画像、異なるディスプレイ用のさまざまなピクセル寸法。ブラウザは誰もが見ることができないピクセルに対してお金を払わないようにダウンロード前に選択します。2つのツールがあり、それらは異なる質問に答えます。

srcsetsizesが答える「どの解像度?」。ブラウザに候補ファイルのセットを与えます。各ファイルはw記述子を使用したそれぞれの組み込み幅(ピクセル単位)でタグ付けされます。sizes値は、様々なブレークポイントで画像がどのくらい広くレンダリングされるかを伝えます。ブレークポイントはレイアウトが変わるスクリーン幅のしきい値です。ブラウザはsizesヒントをデバイスのピクセル密度と組み合わせて、まだ鮮明に見える最小のファイルを選択します。

html
<img
  src="product-800.jpg"
  srcset="product-400.jpg 400w, product-800.jpg 800w, product-1200.jpg 1200w"
  sizes="(max-width: 700px) 100vw, 350px"
  alt="前面から表示されたレザーバックパック">

<picture>要素は異なる質問に答えます。「どのソース全体?」。ファイル自体が変わるべき場合のためです。スケールだけではありません。2つの一般的な理由があります。アート方向は、広いバナーが狭いスクリーンの背の高いポートレートにトリミングされるため、被写体が見えたままになり、異なる画像ファイルが必要です。1つのファイルをスケールダウンしません。そして形式交渉は、最新の形式をフォールバック付きで提供し、ブラウザはデコードできるものによって選択する必要があります。

html
<picture>
  <source media="(max-width: 600px)" srcset="hero-portrait.avif" type="image/avif">
  <source media="(max-width: 600px)" srcset="hero-portrait.jpg">
  <source srcset="hero-wide.avif" type="image/avif">
  <img src="hero-wide.jpg" alt="忙しいキッチンで料理をプレーティングしているシェフ">
</picture>

順序は重要です。ブラウザはmediatypeを満たす最初の<source>を取ります。したがって、最も優先的で制約された選択肢を最初に配置してください。末尾の<img>は必須であり、ページが実際にレンダリングする要素です。ソースのsrcsetsizesがそれを供給します。しかしaltwidthheight、および読み込み動作はすべてその内側の<img>に属します。

Junoレスポンシブ画像 同じ写真は数サイズで提供でき、ブラウザはスクリーンに合ったものを選択できるため、スマートフォンはノートパソコンサイズのファイルをダウンロードしません。1日目にこれが必要なわけではありません。プレーン<img>で十分です。ページがモバイルで重くなり始めたときのオプションがあります。
Junoレスポンシブ画像 ブラウザにサイズを選択させたい場合はsrcsetsizesを使用し、ファイル自体を交換したい場合は<picture>を使用してください。異なるトリミングまたは最新の形式のためです。<picture>内の<img>は必須であり、altが存在する場所です。altを一度だけ書きます。すべてのソースは同じ画像です。
Junoレスポンシブ画像 2つの異なる仕事があります。srcsetsizesは解像度を選択し、<picture>はアート方向または形式交渉のために全体ソースを選択します。ソースは上から下に読まれ、最初のマッチが優先されるため、最も制約されたものを最初に配置してください。レンダリングされるすべてのものは依然として内側の<img>にぶら下がっているため、それがaltとサイジングが進む場所です。

ビデオとオーディオ

HTMLは、プラグインなしでビデオとサウンドを再生できます。クリップの場合、<video>要素を使用します。サウンドの場合、<audio>です。controls属性を追加すると、ブラウザは再生ボタン、タイムライン、ボリュームコントロールを無料で提供します。

html
<video src="tutorial.mp4" controls></video>

<audio src="podcast-episode.mp3" controls></audio>

画像とは異なり、これらには閉じタグがあります。なぜなら、開いているタグと閉じるタグの間にフォールバックテキストまたは追加の設定を入れることができるからです。最初に覚えておくべき最も重要なことは常にcontrolsを含めることです。そうしないと、訪問者は再生を押す方法がありません。

<video><audio>要素は、ネイティブメディアプレーヤーをページに埋め込みます。controls属性は、ブラウザの組み込み再生、一時停止、シーク、ボリュームインターフェースを表示します。それがなければ、まったくコントロールはありません。

html
<video src="product-demo.mp4" controls width="640" poster="demo-cover.jpg"></video>

いくつかの属性はそれらの場所を獲得します。posterは、ビデオが再生される前に表示される静止画像を設定するため、プレーヤーはブラックボックスではありません。widthはプレーヤーのサイズを予約します。autoplayloopmutedを追加することもできますが、ほとんどのブラウザはビデオもmutedである場合にのみautoplayを許可するため、この2つは一緒に移動します。

複数のファイル形式を提供するには、srcを削除し、代わりに内側に<source>要素をリストします。ブラウザは最初に再生できるものを再生します。

html
<video controls width="640" poster="demo-cover.jpg">
  <source src="product-demo.webm" type="video/webm">
  <source src="product-demo.mp4" type="video/mp4">
  お使いのブラウザはこのビデオを再生できません。
</video>

ソースの後のテキストはフォールバックコンテンツで、ブラウザがそれらのいずれも再生できない場合にのみ表示されます。<audio>は同じ方法で機能し、同じcontrols<source>パターンを使用します。ただし、posterwidthのような視覚的属性はマイナスです。

<video><audio>はブラウザのネイティブメディアパイプライン、デコード、バッファリング、およびサードパーティプラグインなしで組み込みプレーヤーUIを埋め込みます。どちらもcontrols(ネイティブUIを表示)を取りますし、どちらも複数の<source>子を受け入れるため、複数のコーデック(ビデオまたはオーディオファイルがエンコードされている圧縮形式)を提供でき、ブラウザはそれが最初にデコードできるものを選択します。

html
<video controls width="640" height="360" poster="demo-cover.jpg" preload="metadata">
  <source src="demo.webm" type="video/webm">
  <source src="demo.mp4" type="video/mp4">
  <track kind="captions" src="demo-captions.en.vtt" srclang="en" label="英語" default>
  お使いのブラウザはこのビデオを再生できません。
</video>

2つの本番関心事がここを支配します。1つ目はアクセシビリティで、それを聞いたり見たりできない人たちがメディアを使用できるようにすることです。それが<track>の目的です。タイミング設定されたテキストファイル(通常はWebVTT形式(プレーンテキストキャプション形式、ファイルは.vttで終わる))をメディアに添付します。kind="captions"は、耳が聞こえない人または音声オフの設定にいるビューアーのために、音声と重要な音のテキストバージョンを提供します。これは公共の場所でスクロールしているほとんどの人です。kind="subtitles"は、別の言語への対話を翻訳します。default属性は、ユーザーが探さなくても1つのトラックをオンにします。キャプションなしのビデオは、実際の視聴者スライスを除外します。キャプションは検索エンジンも支援します。これはビデオを見ることができませんが、トランスクリプトを読むことができます。

2番目の関心事は帯域幅です。preloadは、再生前にブラウザがメディアをどの程度積極的に取得するかを制御します。preload="none"はユーザーが再生を押すまで何もダウンロードしません。preload="metadata"は、期間と寸法のみをつかみます。preload="auto"はファイル全体をプルする可能性があります。フォールド下のすべてのものにデフォルトはmetadataまたはnoneです。オートロードビデオはページが静かにできる最も重いものの1つだからです。そして、同じautoplay警告保持。ブラウザはサウンドオートプレイをブロックします。そのため、自動再生ビデオはmutedである必要があります。これはキャプションが重要である別の理由です。

Junoビデオとオーディオ<video>はクリップを再生し、<audio>はサウンドを再生します。プラグインは必要ありません。controlsを追加してください。そうしないと再生ボタンはなく、訪問者が立ち往生しています。両方に閉じたタグがあります。画像とは異なり、設定とフォールバックテキストを内側に入れることができるからです。
Junoビデオとオーディオ 常にcontrolsを追加し、posterを設定して、プレーヤーが黒い四角形ではなく、複数の形式を提供するために<source>要素をリストしてください。autoplayは、ビデオがmutedである場合にのみ発火するため、この2つは一緒に進みます。オーディオは視覚的な属性なしの同じパターンです。
Junoビデオとオーディオ キャプション付きの<track>を追加してください。ほとんどの人がミュートで見ており、検索エンジンは見ることができないテキストを読みます。フォールド下のすべてについてpreloadmetadataまたはnoneに保ちます。オートロードビデオは、ページを重くするための最も静かな方法の1つです。そしてサウンドオートプレイはブロックされるため、オートプレイはミュートを意味します。これはもう1つの理由です。

サイズ設定、遅延読み込み、パフォーマンス

画像が読み込まれると、ページの残りの部分を押しのけることができます。段落を読んでいる場合、その上の写真が読み込みを完了し、突然テキストが下に移動します。その跳躍は迷惑です。防ぐことができます。widthheightで事前に画像のサイズをブラウザに伝えます。

html
<img src="team-lunch.jpg" alt="オフィスのバルコニーでランチを共有しているチーム"
     width="800" height="600">

これらの数字を使用して、ブラウザは画像が到着する前に正しい量のスペースを予約するため、到着したときには何も跳ねません。ファイルの実ピクセル寸法を指定し、CSSはそれでもスクリーン上でリサイズできます。

画像は、ユーザーとして感じる2つのことに影響を与えます。読み込み中のページシフト量とそれが取得するデータ量です。HTMLは両方の属性を提供します。

widthheightを設定すると、**レイアウトシフト**が防止されます。画像が読み込まれるときにコンテンツが飛び回ります。寸法を宣言すると、ブラウザはファイルが到着し、その実際の高さが知られている場合に拡張されるのではなく、すぐにそのスペースを予約します。

html
<img src="article-header.jpg" alt="忙しい編集室の上面図"
     width="1200" height="675" loading="lazy">

loading="lazy"属性は、ブラウザが読者がスクロールして表示しようとするまで画像をダウンロードしないようにブラウザに伝えます。長いページの下の画像の場合、これはデータを保存し、最初のペイントを高速化します。1つのルール。訪問者が最初に表示される最初のページの最上部の画像を遅延ロードしないでください。その画像はできるだけ早くロードしたいので、loadingを無くしてください(またはloading="eager"に設定してください)。

メディアは通常、ページの最も重い部分であるため、その読み込みを支配する属性は装飾ではなく、パフォーマンスコントロールです。3つが重要です。

まず、累積レイアウトシフト。ページ読み込み中に表示コンテンツがどのくらい飛び回るかの尺度です。通常の原因は、宣言されたサイズのない画像です。ブラウザは高さをゼロにし、その下のすべてをレイアウトしてから、ファイルが到着し、その実際の高さが既知になったら、列全体をリフローします。あらかじめブラウザにアスペクト比を与えることで、これを防ぐことができます。widthheightをファイルの実ピクセル寸法に設定し、ブラウザは比率を計算し、CSSが表示をリサイズしても正しいボックスを予約します。

html
<img src="feature.jpg" alt="緑の畑全体の太陽電池パネル"
     width="1600" height="900" loading="lazy" decoding="async">

CSSでのaspect-ratioプロパティで同じ意図を表すことができます。重要な点は、ピクセルがダウンロードされる前に比率が知られていなければならないということです。

次に、loading="lazy"は、読者が長いページでスクロール時に近づくまで、スクリーン外の画像のダウンロードを延期します。クリティカル例外は、LCP要素(Largest Contentful Paint、スクロールなしで表示される最大の画像またはブロック、ブラウザと検索ランキングが監視するメトリック)です。その画像を遅延ロードすると、メトリックが測定する正確なものが遅延するため、上記のフォールドヒーローは積極的にロードする必要があります。

3番目に、decoding="async"は、ブラウザが画像をメインスレッドからデコードできるため、圧縮バイトをピクセルに変換することは他のレンダリングをブロックしません。それは画面の最初にない画像のための小さく安全な勝利です。

形式は他のレバーです。WebPAVIFは、同じ視覚品質でJPEGまたはPNGより遠くに圧縮する最新の画像形式です。AVIFは通常、ファイルサイズで優勝します。WebPはブラウザサポートとエンコード速度にあります。トレードオフは互換性とツールであり、これは正確に<picture>typeソースが管理するために構築されたものです。AVIFを最初に提供し、WebPの次に、最後にJPEGまたはPNGフォールバックを提供し、すべてのブラウザは実際にデコードできる最適なファイルを取得します。

Junoサイズ設定、遅延読み込み、パフォーマンス すべての画像にwidthheightを指定すると、写真が読み込まれるときにページが飛び回りを停止します。ファイルの実ピクセルサイズを使用してください。CSSはまだスクリーン上でそれを縮小できます。この1つの習慣は、最も迷惑な読み込み不具合を修正します。
Junoサイズ設定、遅延読み込み、パフォーマンスwidthheightはスペースを予約するため、画像が読み込まれるときは何もシフトせず、loading="lazy"はスクロールして表示しようとするまで画像のダウンロードを保留します。遅延ロードしない画像は、ページの最初のものです。その画像はすぐに読み込む必要があります。
Junoサイズ設定、遅延読み込み、パフォーマンスwidthheightを宣言し(またはaspect-ratioを設定)、ブラウザはボックスを予約し、レイアウトがシフトを停止します。比率はピクセルが着陸する前に知られていなければなりません。上記のフォールドヒーローを除いて、すべてを遅延ロードしてください。最大の表示画像を遅延ロードすると、それを監視するメトリックが遅延するからです。そして、<picture>でAVIFまたはWebPをJPEGフォールバックで配信して、すべてのブラウザが最小ファイルを取得することをデコードできます。