Web制作

レスポンシブが苦手な方必見!アスペクト比(縦横比)を固定するCSS

この記事は5分で読めます

こんな方におすすめ

  • レスポンシブコーディングが苦手…
  • 要素の縦横の比率を変えずに拡大、縮小できるようにしたい。
  • iframe要素をどのデバイスでも崩れないように表示したい。

ほとんどのブラウザで使える便利なCSSを使ったものや、IEにも対応したやり方もご紹介します!

その0:前提条件

  • 今回あなたはサイトに地図を埋め込みます。
  • 地図のアスペクト比(縦横比)は16:9で固定したい。
  • PCでは最大幅を800pxで固定したい。

以上の条件を満たすにはどうしたらいいのか、コーディングしてみたいと思います!

<div class="sample-map">
  <iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d51908.537338077775!2d139.45546210431223!3d35.596070728264486!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x6018fa4bafd5271d%3A0x4ed9e16763a0aa28!2z56We5aWI5bed55yM5bed5bSO5biC6bq755Sf5Yy6!5e0!3m2!1sja!2sjp!4v1651304213950!5m2!1sja!2sjp" width="600" height="450" style="border:0;" allowfullscreen="" loading="lazy" referrerpolicy="no-referrer-when-downgrade"></iframe>
</div>

こちらの地図を使って実演してみたいと思います!
ぜひ、お手持ちにのパソコンのディベロッパーツールを使って、画面を縮小しながら確かめてみてください!

その1:aspect-ratioプロパティ

aspect-ratioプロパティを使ったコーディングは後述する方法よりも簡単にアスペクト比を固定できるのでとても重宝します。

.sample-map{
  max-width: 800px;
  aspect-ratio: 16/9;/*縦横比が16:9なので16/9です。*/
  margin: 0 auto;
}
.sample-map iframe{
  width: 100%;
  height: 100%;
}

このCSSを実行した結果がこちらです↓

これで最大幅になった後も、マップのアスペクト比は固定されました。
このaspect-ratioプロパティは現在ほとんどのモダンなブラウザで対応しています。
ですがIEなど一部のブラウザでは非対応なので、後述する方法で実装することをおすすめします。案件ごとに使い分けてみてください。

対応しているブラウザはこちらです!

その2:padding-topハック

.sample-map{
  position: relative;
  max-width: 800px;
  margin: 0 auto;
}
.sample-map iframe {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
}
.sample-map::before{
  content: "";
  display: block;
  padding-top: 56.25%;/*9÷16×100%=56.25%のため*/
}

このCSSを実装した結果がこちらです↓

これで上のマップと同じ結果になったかと思います!
この方法はpadding-topハックと呼ばれている方法です。
.sample-mapの擬似要素にpadding-topで数値を指定します。よく使われるアスペクト比を計算した数値を記載しておきますので参考にしてみてください。

  • 16:9 → 9÷16×100=56.25%
  • 4:3 → 3÷4×100=75%
  • 3:2 → 2÷3×100=66.67%
  • 2:1 → 1÷2×100=50%

のんびりですが、初学者の方に役立つ情報を自身のアウトプットも兼ねて発信しております。

もし、この記事が良かった、ためになったという方は、シェアしてくれるととても嬉しいです。

知ってると便利!3分でわかる!position: sticky;の使い方

この記事は3分で読めます!

こんな表現に使えます!

position: sticky;を使うと、使われた要素をを指定した位置に固定することができます。
よくさまざまなサイトでヘッダーやフッター、サイドバーなどが、上下にスクロールしても固定されているのを見かけます。

従来だとposition: fixed;を使用して、要素が被らないように直下の要素に余白を入れなければならなかったですが、その手間が省けます。

早速コードを見ながら解説いたします。

※IEは対応していませんが、polyfillを使うと使用できるのでその方法も載せています。

コードの書き方

ヘッダーやフッターを固定する

まずは、ヘッダーとフッターを固定したパターンです。

See the Pen position: sticky;<2> by だいすけ@Web制作頑張るパパ (@mdmmmk1123) on CodePen.

見出しを規定の位置で固定する

ヘッダーとフッターを固定+規定の高さにきたときに固定する方法です。

See the Pen position: sticky;<2> by だいすけ@Web制作頑張るパパ (@mdmmmk1123) on CodePen.

コードの解説

ヘッダーやフッターを固定する

header {
	position: sticky;
	top: 0;
}

footer {
	position: sticky;
	bottom: 0;
}

固定したい要素にposition: sticky;をつけます。
topもしくはbottomで画面上のどの位置で要素を止めるのかを決めます。
フッターに関しては画面の一番下で固定されますが、すぐ下にコピーライトのdivが存在するのでその要素がスクロールされるタイミングで固定は解除されます。
これにより、固定しつつ表示を邪魔しないようにできます。

見出しを規定の位置で固定する

h2 {
  position: sticky;
  top: 110px;/*ヘッダーの高さの終わりから固定させるため*/
  z-index: 50;/*重なり順をヘッダーより下にする*/
  margin: 0;
}

header {
  z-index: 100;/*重なり順を見出しより上にする*/
}

見出しの箇所にもposition: sticky;をつけますが、要素がスクロールする際に、headerの上に重なってしまうので、headerとh2にz-indexで重なりの順番を決めてあげると解消されます。今回はヘッダーは常に表示されている状態にしたいのでh2よりz-indexの値を小さくしています。

polyfillを使う場合

<script src="https://cdnjs.cloudflare.com/ajax/libs/stickyfill/2.1.0/stickyfill.min.js"></script>
/*上記のcdnより下に記載*/
<script>
  var elements = document.querySelectorAll(".クラス名");
  Stickyfill.add(elements);
</script>

<script>
  var elements = $('.クラス名');
  Stickyfill.add(elements);
</script>

これにより、IE11でも使用することができます。
※表の見出しだけは固定できませんが、表示そのものは崩れません。

要素の固定表示に便利なposition: sticky;是非使ってみてください!