規範的な構文

<picture> 要素は単独では何もレンダリングしませんが、代わりに内部 <img> 要素の決定エンジンとして機能します。 指示を出します。<picture> は、<audio> 要素と <video> 要素によってすでに設定されている前例(ラッパー要素)に従います。 (個々の <source> 要素を含む)

<picture>
   
<source>
   
<source>
   
<img>
</picture>

この内部 <img> は、レスポンシブ画像をサポートしていない古いブラウザ向けの信頼性の高いフォールバック パターンも提供します。 <picture> 要素がユーザーのブラウザで認識されない場合、無視されます。その後、<source> 要素も破棄されます。 これは、ブラウザはそれらをまったく認識しないか、<video> または <audio> の親がないと意味のあるコンテキストが得られないためです。 ただし、内部の <img> 要素はどのブラウザでも認識され、その src で指定されたソースは想定どおりにレンダリングされます。

「アート ディレクション」<picture> を含む画像

一般的に「アート ディレクション」とは、ページ内の画像のサイズに応じて画像の内容やアスペクト比を変更する行為を指します。 作成します。srcsetsizes は目に見えない形で動作し、ユーザーのブラウザの指示に応じてソースをシームレスに切り替えるように設計されています。 しかし、ページ レイアウトを調整するのと同じように、コンテンツが強調されるように、ブレークポイントをまたいでソースを変更したい場合もあります。 たとえば、次のように中央のフォーカスが小さい全幅のヘッダー画像は、大きなビューポートでは適切に表示される可能性があります。

ミツバチが訪れている、葉と幹に囲まれているペリウィンクルの花のヘッダーの幅の画像。

ただし、小さいビューポートに合わせて縮小すると、画像の中心が失われてしまう可能性があります。

縮小した、ペリウィンクルの花のヘッダー幅の画像。ミツバチはほとんど見えません。

これらの画像ソースの被写体は同じですが、その被写体を視覚的に強調するには、 ブレークポイントを越えて変更するための画像ソースの比率。たとえば、画像の中心を拡大して、 トリミングした端のディテールの一部を次に示します。

ペリウィンクルの花の収穫された拡大画像。

こういう「切り抜き」はCSS で指定することもできますが、ユーザーはその画像を構成するすべてのデータをリクエストすることになります。 たとえ目にすることもないでしょう

source 要素には、その source の選択条件を定義する属性があります。media は、 メディアクエリ、メディアタイプ(以前の「MIME タイプ」)を受け入れる type があります。ソースの最初の <source> ユーザーの現在のブラウジング コンテキストに一致する順序が選択され、その sourcesrcset 属性の内容が確認されます。 そのコンテキストに適した候補を決定します。この例では、media 属性を持つ最初の source は、 ユーザーのビューポートのサイズに一致するものが 1 つ選択されます。

<picture>
 
<source media="(min-width: 1200px)" srcset="wide-crop.jpg">
 
<img src="close-crop.jpg" alt="…">
</picture>

内側の img は常に順序の最後に指定する必要があります(どの source 要素が media または type とも一致しない場合) その画像は「デフォルト」として機能し、あります。min-width 個のメディアクエリを使用する場合は、最大 前のコードのように、ソースから分離します。max-width メディアクエリを使用する場合は、最小のソースを最初に配置する必要があります。

<picture>
   
<source media="(max-width: 400px)" srcset="mid-bp.jpg">
   
<source media="(max-width: 800px)" srcset="high-bp.jpg">
   
<img src="highest-bp.jpg" alt="…">
</picture>

指定した条件に基づいてソースが選択されると、sourcesrcset 属性が <img> 自体が定義されたように <img> を使用し、sizes を使用してアート向けの画像を最適化できる あります。

<picture>
   
<source media="(min-width: 800px)" srcset="high-bp-1600.jpg 1600w, high-bp-1000.jpg 1000w">
   
<source srcset="lower-bp-1200.jpg 1200w, lower-bp-800.jpg 800w">
   
<img src="fallback.jpg" alt="…" sizes="calc(100vw - 2em)">
</picture>

選択した <source> 要素によってアスペクト比が異なる可能性がある場合は、もちろんパフォーマンス上の問題が発生します。 <img> がサポートしているのは 1 つの width 属性と height 属性のみですが、これらの属性を省略するとユーザー エクスペリエンスが大幅に低下する可能性があります。 このことを考慮すると、比較的最近のものですが、 十分にサポートされている - HTML への追加 仕様では、<source> 要素で height 属性と width 属性を使用できます。レイアウト シフトの低減にも <img> と同様に、選択された <source> 要素に対して、レイアウト内で適切なスペースを予約します。

<picture>
   
<source
     
media="(min-width: 800px)"
     
srcset="high-bp-1600.jpg 1600w, high-bp-1000.jpg 1000w"
     
width="1600"
     
height="800">
   
<img src="fallback.jpg"
     
srcset="lower-bp-1200.jpg 1200w, lower-bp-800.jpg 800w"
     
sizes="calc(100vw - 2em)"
     
width="1200"
     
height="750"
     
alt="…">
</picture>

重要な点として、アート ディレクションはビューポートのサイズに基づく決定以外にも使用できます。 このようなケースの大半は、srcset/sizes を使用することでより効率的に処理できます。たとえば画像ソースを選択すると ユーザーの好みのカラーパターンに合わせます。

<picture>
   
<source media="(prefers-color-scheme: dark)" srcset="hero-dark.jpg">
   
<img srcset="hero-light.jpg">
</picture>

type 属性

type 属性を使用すると、<picture> 要素の単一リクエスト決定エンジンを使用して画像形式のみを提供できます。 ブラウザに表示されます

画像形式と圧縮で説明したように、ブラウザで解析できないエンコードは、 作成します。

<picture> 要素の導入前は、新しい画像形式を配信する最も実行可能なフロントエンド ソリューションが必要でした。 ブラウザは画像ファイルをリクエストして解析を試行し、そのファイルを破棄してフォールバックを読み込むかどうかを判断します。 一般的な例は、次の行のスクリプトでした。

   <img src="image.webp"
   
data-fallback="image.jpg"
   
onerror="this.src=this.getAttribute('data-fallback'); this.onerror=null;"
   
alt="...">

このパターンでは、image.webp のリクエストは引き続きすべてのブラウザで行われるため、ブラウザで無駄な転送をすることになります。 WebP はサポートしていませんWebP エンコードを解析できなかったブラウザは onerror イベントをスローし、スワップします。 data-fallback 値を src に変換します。無駄なソリューションだったが、やはりこのようなアプローチが唯一の選択肢だった フロントエンドで使用できますブラウザは、カスタム スクリプトがカスタムスクリプトを実行する前に、画像のリクエストを このプロセスをプリエンプトできませんでした。

<picture> 要素は、このような冗長なリクエストを回避するように明示的に設計されています。ブラウザがコンテナを リクエストせずにサポートしていない形式を認識できるようにするため、type 属性はブラウザにソースについて警告します。 行うため、リクエストを実行するかどうかを決定できます。

type 属性では、メディアタイプ(旧 MIME タイプ)を指定します。 各 <source>srcset 属性で指定された画像ソースの画像。これにより、ブラウザは取得されたすべての情報を その source によって提供された画像候補が、外部コードなしでデコードできるかどうかを即座に判断する必要があります。 リクエストでは、メディアタイプが認識されない場合、<source> とそのすべての候補が無視され、ブラウザが処理を進めます。

<picture>
 
<source type="image/webp" srcset="pic.webp">
 
<img src="pic.jpg" alt="...">
</picture>

ここでは、WebP エンコードをサポートするブラウザは、type 属性で指定された image/webp メディアタイプを認識します。 <source> 要素の中でその要素を選択し、その要素を <source> 選択すると、srcset には候補が 1 つしかないため、内部に <img>pic.webp のリクエスト、転送、レンダリングを行います。WebP をサポートしていないブラウザでは、source が無視されます。 それに反する指示がない場合、<img> は 1992 年から行われてきたとおり、src のコンテンツをレンダリングします。 ここでは、2 つ目の <source> 要素を type="image/jpeg" で指定する必要はありません。もちろん、JPEG のユニバーサル サポートを想定できます。

ユーザーのブラウジングのコンテキストにかかわらず、これらすべてを 1 回のファイル転送で達成でき、帯域幅が無駄になることはありません。 画像ソースを検出できます。これは先進的な考えでもあります。より新しく効率的なファイル形式が登場するにつれて、 独自のメディアタイプと連携し、picture によりそれらのメディアタイプを活用できるようになります。JavaScript もサーバーサイドも不要です。 <img> のすべての速度をサポートしています。

レスポンシブ画像の未来

ここで取り上げたマークアップ パターンはすべて、標準化という点で大きな負担となります。つまり、 <img> のような確立されたウェブの中心的な存在は決して容易ではなく、そうした変化が目指す一連の問題も 多岐にわたりますこうした改善の余地はたくさんあると マークアップパターンがあるならば、その通りです。これらの標準は当初から、将来に向けたベースラインとして 構築するためのテクノロジーです

これらのソリューションはすべてマークアップに依存しているので、サーバーからの最初のペイロードに含まれます。 ブラウザが画像ソースをリクエストするのに間に合いました。この制限により、sizes 属性が明らかに扱いづらくなっていました。

しかし、これらの機能がウェブ プラットフォームに導入されて以来、画像リクエストを遅延させるネイティブの方法が導入されました。 loading="lazy" 属性が指定された <img> 要素は、ページのレイアウトが判明するまではリクエストされません。 ページのレンダリング プロセスの後半まで、ユーザーの最初のビューポートの外にある画像のリクエストを 除外します。これらのリクエストが行われた時点でブラウザはページ レイアウトを完全に把握しているため、 sizes="auto" 属性は HTML 仕様への追加として提案されています これにより、このようなケースで sizes 属性を手動で記述する手間を省くことができます。

今後予定されている <picture> 要素には、非常に画期的な変更がいくつか追加される予定です。 ページレイアウトのスタイルを設定しますビューポート情報はレイアウトに関する大まかな決定を行うための適切な基礎となりますが、 開発に対して完全なコンポーネント レベルのアプローチ、つまり、インフラストラクチャにドロップできるコンポーネントを コンポーネント自体が占有するスペースに対応するスタイルで、ページ レイアウトのあらゆる部分に配置できます。この懸念は、 コンテナクエリの作成: 要素をスタイル設定する方法 ビューポートのみのサイズではなく、親コンテナのサイズに基づいて自動的に作成されます。

コンテナクエリの構文は安定化したばかりで、ブラウザのサポートは非常に限られていますが、 これを可能にするブラウザ技術を追加することで、<picture> 要素に 同じことを行えます。たとえば、container 属性を使用すると、属性に基づいて <source> 選択基準が ビューポートのサイズではなく、<picture> 要素の <img> が占有するスペース。

ウェブの標準に関する議論は継続していますが、まだ解決には至っていません。それに見合うだけの理由があります。 まだ使用できません

レスポンシブな画像マークアップは、他のウェブ テクノロジーと同様に、時間の経過とともに使い勝手が良くなると約束していますが、 多くのサービス、テクノロジー、フレームワークを通じてこのマークアップを利用できます。次のモジュールでは 画像形式、圧縮、レスポンシブ画像について学んだことをすべて最新の開発ワークフローに統合する方法を見ていきます。