「動画を背景にしたカッコいいヒーローセクションを作りたい」という場面はよくあります。HTMLの <video> タグを使えば、画像と同じように動画を背景に設置できます。
この記事では、背景動画の設置方法を2パターン(position: absolute 方式 / flex 方式)のプレビュー+コード付きで解説します。
この記事でわかること
<video>タグの基本属性(autoplay・muted・loop・playsinline)- 背景動画の定番パターン:position: absolute 方式
- コンテンツ配置がしやすい:flex 方式
- autoplay・iOS・読み込みに関する注意点
video タグの基本属性
背景動画で必ず使う属性をまとめます。autoplay と muted はセットで指定するのがルールです。
基本の属性
動画ファイルのURL(例: video/bg.mp4)
ページ読み込み時に自動再生する
音声をミュートにする(autoplay に必須)
再生終了後にループする
iOS Safari でインライン再生する(全画面にしない)
再生前に表示する静止画のURL
<video src="video/bg.mp4" autoplay muted loop playsinline poster="img/poster.jpg"></video>
背景動画の設置方法
背景動画の実装方法は大きく2パターンあります。どちらも仕上がりは同じですが、コンテンツの配置のしやすさが異なります。
position: absolute を使う方法
親要素に position: relative を指定し、video ・オーバーレイ・テキストをすべて position: absolute で重ねる最も一般的な方法。z-index で前後の順序をコントロールする。
position: relative を指定して、videoとテキストを両方 position: absolute で重ねる<div class="hero"> <!-- ① 背景動画 --> <video class="hero__video" src="video/bg.mp4" autoplay muted loop playsinline poster="img/bg-poster.jpg" ></video> <!-- ② 暗幕オーバーレイ(任意) --> <div class="hero__overlay"></div> <!-- ③ 前面コンテンツ --> <div class="hero__content"> <h1>キャッチコピーをここに</h1> <p>サブテキストをここに</p> <a href="#" class="btn">詳しく見る</a> </div> </div>
/* ── 親要素:重なりの基準点 ── */ .hero { position: relative; /* 子要素の absolute の基準になる */ width: 100%; height: 100vh; /* 高さは用途に合わせて変更 */ overflow: hidden; /* 動画がはみ出さないよう切り取る */ } /* ── ① 背景動画 ── */ .hero__video { position: absolute; /* 親の左上を原点に配置 */ inset: 0; /* top/right/bottom/left を全部0に */ width: 100%; height: 100%; object-fit: cover; /* 縦横比を保ったまま領域全体を覆う */ z-index: 0; /* 一番後ろに配置 */ } /* ── ② 暗幕オーバーレイ(任意) ── */ .hero__overlay { position: absolute; inset: 0; background: rgba(0, 0, 0, 0.45); /* 動画を暗くして文字を読みやすくする */ z-index: 1; } /* ── ③ 前面コンテンツ ── */ .hero__content { position: absolute; inset: 0; display: flex; /* コンテンツを中央揃えするためflexを使用 */ flex-direction: column; align-items: center; justify-content: center; text-align: center; padding: 0 20px; z-index: 2; /* overlay(1)より前面に */ color: #fff; }
flex を使う方法
親要素に display: flex を指定してコンテンツを中央揃えし、video だけを position: absolute で背景化する方法。コンテンツ側の配置を flex で柔軟にコントロールできる。position: absolute のみの方法と役割が入れ替わるイメージ。
display: flex で中央揃え。videoは position: absolute で背景化し、テキストは position: relative で前面へ<div class="hero"> <!-- ① 背景動画(position: absolute で背景化) --> <video class="hero__video" src="video/bg.mp4" autoplay muted loop playsinline poster="img/bg-poster.jpg" ></video> <!-- ② 暗幕オーバーレイ(任意) --> <div class="hero__overlay"></div> <!-- ③ 前面コンテンツ(flexで中央揃え済みの親の中に配置) --> <div class="hero__content"> <h1>キャッチコピーをここに</h1> <p>サブテキストをここに</p> <a href="#" class="btn">詳しく見る</a> </div> </div>
/* ── 親要素:flexで中央揃え ── */ .hero { position: relative; /* videoのabsoluteの基準になる */ display: flex; /* コンテンツをflexで配置する */ align-items: center; /* 縦方向の中央揃え */ justify-content: center; /* 横方向の中央揃え */ width: 100%; min-height: 100vh; /* 最低でも画面全体の高さを確保 */ overflow: hidden; } /* ── ① 背景動画(flexの外に出して背景化) ── */ .hero__video { position: absolute; /* flexフローから外れて背景に回る */ inset: 0; width: 100%; height: 100%; object-fit: cover; z-index: 0; /* 一番後ろ */ } /* ── ② 暗幕オーバーレイ(任意) ── */ .hero__overlay { position: absolute; inset: 0; background: rgba(0, 0, 0, 0.45); z-index: 1; } /* ── ③ 前面コンテンツ ── */ .hero__content { position: relative; /* z-indexを効かせるためrelativeを指定 */ z-index: 2; /* overlay(1)より前面に */ text-align: center; padding: 0 20px; color: #fff; }
2つの方法の比較
| 比較 | 方法① position: absolute | 方法② flex |
|---|---|---|
| コンテンツの中央揃え | .hero__content に flex を別途設定 |
親の flex がそのまま効く |
| 複数要素の並べ方 | content 内に追加の flex/grid が必要 | ✅ 親の flex を直接活用できる |
| コード量 | やや多い | ✅ やや少ない |
| よく使う場面 | レイアウトの自由度が高い複雑な構成 | シンプルなヒーローセクション |
注意点とポイント
⚠️ autoplay には muted が必須
ブラウザのポリシーにより、音声付き動画の自動再生はブロックされます。背景動画は必ず muted 属性をセットで指定してください。
⚠️ iOS Safari では playsinline が必要
iPhoneでは playsinline を指定しないと動画が全画面で開いてしまいます。背景動画には必ず指定してください。
💡 poster 属性で読み込み前の表示を改善
動画の読み込み中に表示する静止画(サムネイル)を poster 属性で指定しておくと、ページ表示直後の白ちらつきを防げます。
💡 object-fit: cover で全体を覆う
動画の縦横比と表示エリアの縦横比が一致しない場合でも、object-fit: cover を指定すると縦横比を保ったまま全体を覆ってくれます。画像の background-size: cover と同じ動作です。
💡 inset: 0 は top/right/bottom/left: 0 の短縮形
inset: 0 は top: 0; right: 0; bottom: 0; left: 0 と同じ意味です。要素を親の全面に広げるときに使います。IE非対応のためIEサポートが必要な場合は4つ個別に書いてください。
まとめ
- 背景動画には
autoplay muted loop playsinlineの4属性をセットで指定する - 動画を背景化するには
position: absolute + inset: 0 + object-fit: cover - 方法①:親・video・テキストすべてを
position: absoluteで重ねる - 方法②:親に
flexで中央揃えし、videoだけposition: absoluteで背景化する poster属性で静止画を指定しておくと読み込み中のちらつきを防げる