画像や動画のアスペクト比を保ったまま枠内に配置する

最終更新日
2017.10.12

画像や動画のアスペクト比を保ちながら背景全体や可変サイズの枠全体を埋めるメモです。

画像は背景に限定する場合 background-size で簡単に出来るのですが、サムネイルにも使えるように今回は使いませんでした。

ちなみに、スマホは動画を自動再生すると通信料がアレになるので画像に変えたりした方がよさそうです。サンプルは自動的に再生されます。

画像やVideoを枠内に配置

デモページ

object-fit

画像や Video タグの場合は object-fitcover を指定すると background-size:cover と同じようになります。残念なことにまだ IE が対応してないみたいですが、将来的にはこれが主流になりそう。

#test1 {
width: 100%;
height: 400px;
overflow: hidden;
border: 2px solid #000;
}
#test1 img {
width: 100%;
height: 100%;
object-fit: cover;
object-position: center center;
}

position+transform

IE に対応する場合はこんなかんじ。元の画像サイズ以下には縮小されません。position で枠の中央に置いて、transform で要素の半分ずらしています。省略していますが transform は Android4.4 ではベンダープレフィックスが必要です。

#test2 {
width: 100%;
height: 400px;
overflow: hidden;
border: 2px solid #000;
}
#test2 img {
position: relative;
min-width: 100%;
min-height: 100%;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
}

画像やVideoタグを画面いっぱいに配置

デモページ

上と同じ方法で Video を画面全体に背景として表示するようにしました。

#video1 {
z-index: -1;
position: fixed;
min-width: 100%;
min-height: 100%;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
}

Youtubeを背景に使う場合

デモページ

Youtube の iframe API を使う場合ですが画像と同じやり方だと黒い余白が入ってしまうので、動画のアスペクト比で最小サイズを計算します。サンプルは 16:9 の動画を配置する場合です。全体の背景にする場合は IE9 以上ですが vw/vh のおかげで JavaScript を使わないでも出来ました(ฅ'ω'ฅ)
100vw は表示領域の横幅 100%、100vh は縦幅 100% で、例えば 50vw だと横幅の半分です。

#youtube1 {
z-index: -1;
position: fixed;
/* 真ん中に配置する */
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 100vw;
/* 最小は縦幅に動画のアスペクト比をかける 9/16の数字 */
min-width: 177.77vh;
height: 100vh;
/* 最小は横幅に動画のアスペクト比をかける 16/9の数字 */
min-height: 56.25vw;
}

元のサイズ以下にしたくない場合メディアクエリで上書きをして出来ましたが calc でもっとスッキリ出来るのでしょうか?

@media (max-width: 1280px){
#youtube1 {
min-height: 720px;
}
}
@media (max-height: 720px){
#youtube1 {
min-width: 1280px;
}
}