【CSS】scroll-margin-bottomでできることとは?サンプルコード付きでわかりやすく解説


scroll-margin-bottomは、スクロールスナップ領域の下側の余白を定義します。この領域は、スクロールバーを使ってスクロールできる領域とは異なり、画面に表示されない領域です。scroll-margin-bottomの値を大きくすると、スクロールスナップ領域の下側の余白が広くなり、スクロールスナップ時に要素が画面に表示されるまでの距離が長くなります。逆に、scroll-margin-bottomの値を小さくすると、余白が狭くなり、要素が画面に表示されるまでの距離が短くなります。

scroll-margin-bottomの具体的な使用方法としては、以下の例が挙げられます。

#container {
  scroll-snap-type: y mandatory;
  scroll-snap-align: center;
}

#element {
  scroll-margin-bottom: 100px;
}

この例では、#container要素をスクロールスナップ領域として設定し、#element要素をその領域内に配置しています。scroll-margin-bottomに100pxを指定しているため、#element要素がスクロールスナップ位置に達しても、要素の下部が100pxだけ画面から隠れた状態になります。

scroll-margin-bottomは、主に以下の目的で使用されます。

  • スクロールスナップ時の視覚的なバランスを改善する
  • スクロールスナップ時に要素が画面に表示されるまでの距離を調整する
  • ヘッダーやフッターなどの固定要素とコンテンツの干渉を防ぐ

scroll-margin-bottomは、比較的新しいプロパティであるため、すべてのブラウザで完全対応しているわけではありません。現時点では、主要なブラウザでのみ動作が確認されています。

  • scroll-margin-bottomは、要素の子要素に対してのみ効果があります。親要素に対しては効果ありません。
  • scroll-margin-bottomの値は、ピクセル単位で指定します。
  • scroll-margin-bottomは、scroll-snap-typeプロパティと併用して使用する必要があります。scroll-snap-typeプロパティが設定されていない場合は、scroll-margin-bottomは無効になります。


この例では、ヘッダーとフッターがコンテンツと干渉しないように、scroll-margin-bottomを使用して余白を調整します。

body {
  scroll-snap-type: y mandatory;
  scroll-snap-align: start;
}

header {
  height: 50px;
  background-color: #f0f0f0;
}

footer {
  height: 50px;
  background-color: #f0f0f0;
}

.content {
  scroll-margin-top: 50px;
  scroll-margin-bottom: 50px;
}

このコードでは、以下の設定を行っています。

  • .content要素にscroll-margin-top: 50pxscroll-margin-bottom: 50pxを指定し、ヘッダーとフッターとの干渉を防ぐために上下に50pxずつ余白を設定します。
  • header要素とfooter要素に高さを50pxずつ設定し、背景色をグレーにします。
  • body要素にscroll-snap-type: y mandatoryscroll-snap-align: startを指定し、縦方向のスクロールスナップを有効化し、要素の左端をスナップ位置に揃えます。

例2:スクロールスナップ時の距離を調整する

この例では、scroll-margin-bottomを使用して、スクロールスナップ時に要素が画面に表示されるまでの距離を調整します。

body {
  scroll-snap-type: y mandatory;
  scroll-snap-align: center;
}

.section {
  height: 200px;
  background-color: #ccc;
  margin-bottom: 50px;
}

.section:last-child {
  margin-bottom: 0;
}
  • .section:last-child要素にmargin-bottom: 0を指定し、最後の要素のみ余白を0にして、ページ下端と余白が重ならないようにします。
  • .section要素にmargin-bottom: 50pxを指定し、要素間に50pxずつ余白を設定します。
  • .section要素に高さを200pxずつ設定し、背景色をグレーにします。
  • body要素にscroll-snap-type: y mandatoryscroll-snap-align: centerを指定し、縦方向のスクロールスナップを有効化し、要素の中央をスナップ位置に揃えます。

例3:スクロールスナップ時の視覚的なバランスを改善する

この例では、scroll-margin-bottomを使用して、スクロールスナップ時の視覚的なバランスを改善します。

body {
  scroll-snap-type: y mandatory;
  scroll-snap-align: center;
}

.image {
  width: 100%;
  height: 300px;
  object-fit: cover;
  margin-bottom: 50px;
}

.text {
  padding: 20px;
  background-color: #fff;
}
  • .text要素に余白と背景色を設定し、テキストエリアを区切ります。
  • .image要素にmargin-bottom: 50pxを指定し、画像とテキストとの間に50pxの余白を設定します。
  • .image要素に幅を100%、高さを300px、object-fit: coverを指定し、画像を容器いっぱいに表示します。
  • body要素にscroll-snap-type: y mandatoryscroll-snap-align: centerを指定し、縦方向のスクロールスナップを有効化し、要素の中央をスナップ位置に揃えます。


代替方法として主に以下の2つが考えられます。

paddingを使用する

scroll-margin-bottomの代替手段として最も一般的なのは、paddingを使用する方法です。paddingは、要素の内側に余白を設定するプロパティです。scroll-margin-bottomと同様に、スクロールスナップ領域の下側の余白を調整することができます。

#container {
  scroll-snap-type: y mandatory;
  scroll-snap-align: center;
}

#element {
  padding-bottom: 100px;
}

この例では、#container要素をスクロールスナップ領域として設定し、#element要素をその領域内に配置しています。padding-bottomに100pxを指定しているため、#element要素がスクロールスナップ位置に達しても、要素の下部が100pxだけ画面から隠れた状態になります。

paddingを使用する利点は、scroll-margin-bottomよりも古いブラウザで広く対応していることです。一方、scroll-margin-bottomと比べて以下の点がデメリットとなります。

  • 要素のコンテンツ領域が狭くなる
  • スクロール領域が視覚的に変化しない

marginとpositionを使用する

marginpositionを組み合わせて、scroll-margin-bottomの代替手段として使用することもできます。この方法は、擬似要素を使用してスクロールスナップ領域を作成します。

#container {
  scroll-snap-type: y mandatory;
  scroll-snap-align: center;
}

#element {
  margin-bottom: 100px;
  position: relative;
}

#element::after {
  content: "";
  display: block;
  position: absolute;
  bottom: 0;
  width: 100%;
  height: 100px;
}

この例では、#container要素をスクロールスナップ領域として設定し、#element要素をその領域内に配置しています。#element要素にmargin-bottom: 100pxを指定し、擬似要素を使用して要素の下部に100pxの余白を作成しています。

marginpositionを使用する利点は、paddingを使用する場合と比べて、視覚的にスクロール領域を変化させることができることです。一方、scroll-margin-bottomと比べて以下の点がデメリットとなります。

  • 古いブラウザでは動作しない可能性がある
  • コードが複雑になる

上記以外にも、JavaScriptを使用してscroll-margin-bottomの代替機能を実装する方法もあります。