<source>タグは、リソースの選択肢をセットする際に使用します。
リソースとは、画像リソースやメディアリソース(動画・音声)です。
source要素は、親要素がpicture要素かメディア要素(video要素・audio要素)かによって、
source要素に指定できる属性などが異なります。
picture要素とメディア要素(video要素・audio要素)では、
リソース選択のアルゴリズムが異なるためです。
picture要素内でsource要素を使用すると、
img要素の表示を環境に応じて切り替えるための複数の画像リソースのセットを指定できます。
親要素がpicture要素の場合、
source要素にはsrc属性は存在してはならず、srcset属性が存在する必要があります。
source要素のsrcset属性の値には、画像リソースのアドレス(URL)を指定します。
ここで指定した画像リソースは、環境に応じていずれかが利用される画像リソースのセットに追加されます。
media属性を指定する場合には、値には有効なメディアクエリを指定します。
メディアクエリの値が環境と一致しない場合、ユーザーエージェントは次のsource要素にスキップします。
以下のサンプルは、メディアの画面幅に応じて利用する画像リソースを切り替えるように指定しています。
パソコンでご覧の場合には、ブラウザの横幅を変更してみてください。
<picture>
<source srcset="./sample/pear-mobile.jpg" media="(max-width: 720px)">
<source srcset="./sample/pear-pc.jpg" media="(max-width: 1280px)">
<img src="./sample/pear-desktop.jpg" alt="洋ナシはジューシーです。">
</picture>
source要素の親要素がメディア要素(video要素・audio要素)の場合、
source要素を使用してメディア要素の代替となる複数のメディアリソースを指定できます。
親要素がメディア要素の場合、
source要素にはsrcset属性は存在してはならず、src属性が存在する必要があります。
source要素のsrc属性の値には、メディアリソースのアドレス(URL)を指定します。
ここで指定したメディアリソースは、環境に応じていずれかが利用されるメディアリソースのセットに追加されます。
尚、source要素のsrc属性やtype属性を動的に変更することで、再生内容を変更することは原則としてできません。
ドキュメントの解析後にsource要素を動的に変更するのは不必要に複雑なアプローチとのことです。
以下のサンプルは、video要素で動画を表しています。
子要素のsource要素は、ブラウザに対して動画データの候補を提示しています。
ブラウザは、記述された順に再生可能なデータを利用します。
<video>
<source src="sample.mp4">
<source src="sample.ogv">
<source src="sample.webm">
<p>動画を再生するには、video要素をサポートしたブラウザが必要です。</p>
</video>
HTMLの仕様では、source要素には終了タグ</source>はありません。
source要素でどの属性が指定できるかは、親要素がpicture要素か、
メディア要素(video要素・audio要素)かによって異なります。
source要素のtype属性を指定する場合には、埋め込みリソースの種類を有効なMIMEタイプの文字列で指定します。
type属性でメディアリソースの種類を指定すると、
ユーザーエージェントがこのメディアリソースを取得する前に、再生できるかどうかを判断できるようになります。
リソースのエンコード方法を正確に指定するには、type属性のなかでcodecsパラメータを同時に指定します。
以下のサンプルは、source要素のtype属性でメディアリソースの種類とcodecsパラメータを指定した使用例です。
WHATWGのウェブサイトに掲載されているHTMLソースをそのまま転載したものであり、
それぞれのcodecsパラメータの詳細は不明です。
<source src='video.mp4' type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"'>
<source src='video.mp4' type='video/mp4; codecs="avc1.58A01E, mp4a.40.2"'>
<source src='video.mp4' type='video/mp4; codecs="avc1.4D401E, mp4a.40.2"'>
<source src='video.mp4' type='video/mp4; codecs="avc1.64001E, mp4a.40.2"'>
<source src='video.mp4' type='video/mp4; codecs="mp4v.20.8, mp4a.40.2"'>
<source src='video.mp4' type='video/mp4; codecs="mp4v.20.240, mp4a.40.2"'>
<source src='video.3gp' type='video/3gpp; codecs="mp4v.20.8, samr"'>
<source src='video.ogv' type='video/ogg; codecs="theora, vorbis"'>
<source src='video.ogv' type='video/ogg; codecs="theora, speex"'>
<source src='audio.ogg' type='audio/ogg; codecs=vorbis'>
<source src='audio.spx' type='audio/ogg; codecs=speex'>
<source src='audio.oga' type='audio/ogg; codecs=flac'>
<source src='video.ogv' type='video/ogg; codecs="dirac, vorbis"'>
以下のサンプルは、source要素とスクリプトを組み合わせて、
ブラウザがsource要素で与えられたメディアリソースを再生できない場合のエラー処理をしています。
ブラウザがメディアリソースをレンダリングできるかどうか分からない場合、
作成者は最後のsource要素でerrorイベントを拾ってフォールバックを動作させることができます。
<script>
function fallback(video) {
// replace <video> with its contents
while (video.hasChildNodes()) {
if (video.firstChild instanceof HTMLSourceElement)
video.removeChild(video.firstChild);
else
video.parentNode.insertBefore(video.firstChild, video);
}
video.parentNode.removeChild(video);
}
</script>
<video controls autoplay>
<source src='video.mp4' type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"'>
<source src='video.ogv' type='video/ogg; codecs="theora, vorbis"' onerror="fallback(parentNode)">
</video>
source要素は、画像リソースやメディアリソースの選択肢をセットしますが、source要素自体は何も表しません。