web制作のポイント

背景に動画を設置する方法|videoタグ+position/flex 2パターン解説

更新日:2026-05-19 著者:unigram 読了目安:8分

この記事の要点

HTMLのvideoタグを使って背景動画を設置する方法を2パターン解説。position: absolute方式とflex方式のプレビュー+コード付きで、autoplay・muted・playsinlineなどの注意点もまとめています。

「動画を背景にしたカッコいいヒーローセクションを作りたい」という場面はよくあります。HTMLの <video> タグを使えば、画像と同じように動画を背景に設置できます。

この記事では、背景動画の設置方法を2パターン(position: absolute 方式 / flex 方式)のプレビュー+コード付きで解説します。

この記事でわかること

  • <video> タグの基本属性(autoplay・muted・loop・playsinline)
  • 背景動画の定番パターン:position: absolute 方式
  • コンテンツ配置がしやすい:flex 方式
  • autoplay・iOS・読み込みに関する注意点

video タグの基本属性

背景動画で必ず使う属性をまとめます。autoplaymuted はセットで指定するのがルールです。

video 要素
基本の属性
src
動画ファイルのURL(例: video/bg.mp4)
autoplay
ページ読み込み時に自動再生する
muted
音声をミュートにする(autoplay に必須)
loop
再生終了後にループする
playsinline
iOS Safari でインライン再生する(全画面にしない)
poster
再生前に表示する静止画のURL
<video src="video/bg.mp4" autoplay muted loop playsinline poster="img/poster.jpg"></video>

背景動画の設置方法

背景動画の実装方法は大きく2パターンあります。どちらも仕上がりは同じですが、コンテンツの配置のしやすさが異なります。

01

position: absolute を使う方法

親要素に position: relative を指定し、video ・オーバーレイ・テキストをすべて position: absolute で重ねる最も一般的な方法。z-index で前後の順序をコントロールする。

position: relative(親)position: absolute(video・テキスト)object-fit: coverz-indexinset: 0
Preview

position: absolute でテキストを重ねる
背景動画の上にコンテンツ
.text-overlay { position: absolute; }

video(背景)
テキスト(前面)
↑ 親に position: relative を指定して、videoとテキストを両方 position: absolute で重ねる
HTMLCSS
index.htmlcopy
<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>
style.csscopy
/* ── 親要素:重なりの基準点 ── */
.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;
}
02

flex を使う方法

親要素に display: flex を指定してコンテンツを中央揃えし、video だけを position: absolute で背景化する方法。コンテンツ側の配置を flex で柔軟にコントロールできる。position: absolute のみの方法と役割が入れ替わるイメージ。

position: relative(親)display: flex(親・中央揃え用)position: absolute(videoのみ)position: relative + z-index(テキスト)
Preview

flex で中央揃え + z-index でテキストを前面に
背景動画の上にコンテンツ
.hero { display: flex; }
video(::before 擬似要素)
テキスト(z-index: 1)
↑ 親に display: flex で中央揃え。videoは position: absolute で背景化し、テキストは position: relative で前面へ
HTMLCSS
index.htmlcopy
<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>
style.csscopy
/* ── 親要素: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: 0top: 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 属性で静止画を指定しておくと読み込み中のちらつきを防げる

 

この記事を書いた人

unigram
web、印刷、映像などの制作をしています。@京都、フリーランス18年目。 大学で講師もしています。 自身の備忘録も兼ねて、Web制作・WordPress・SEO・GA4・生成AI活用をテーマに情報発信しています。わかりやすく優しい内容で記事作成を心がけています。