<source>タグは、リソースの選択肢をセットする際に使用します。 リソースとは、画像リソースやメディアリソース(動画・音声)です。
source要素のtype属性を指定する場合には、埋め込みリソースの種類を有効なMIMEタイプの文字列で指定します。
type属性以外の属性は、source要素の親要素がpicture要素か、 メディア要素(video要素、または、audio要素)かによって異なります。
picture要素は、video要素やaudio要素とはリソース選択のアルゴリズムが異なります。 要素内にsource要素を配置する点は同じですが、使用できる属性などが異なります。
picture要素内でsource要素を使用すると、 img要素の表示を環境に応じて切り替えるための複数の画像リソースのセットを指定できます。
親要素がpicture要素の場合、 source要素にはsrc属性は存在してはならず、srcset属性が存在する必要があります。
source要素のsrcset属性の値には、画像リソースのアドレス(URL)を指定します。 ここで指定した画像リソースは、環境に応じていずれかが利用される画像リソースのセットに追加されます。
media属性を指定する場合には、値には有効なメディアクエリを指定します。 メディアクエリの値が環境と一致しない場合、ユーザーエージェントは次のsource要素にスキップします。
source要素の親要素がメディア要素(video要素、または、audio要素)の場合、 source要素を使用してメディア要素の代替となる複数のメディアリソースを指定できます。
親要素がメディア要素の場合、 source要素にはsrcset属性は存在してはならず、src属性が存在する必要があります。
source要素のsrc属性の値には、メディアリソースのアドレス(URL)を指定します。 ここで指定したメディアリソースは、環境に応じていずれかが利用されるメディアリソースのセットに追加されます。
尚、source要素のsrc属性やtype属性を動的に変更することで、再生内容を変更することは原則としてできません。 ドキュメントの解析後にsource要素を動的に変更するのは不必要に複雑なアプローチとのことです。
source要素は、画像リソースやメディアリソースの選択肢をセットしますが、 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>
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要素で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>