scroll-margin-inline-start

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since January 2020.

scroll-margin-inline-start プロパティは、スクロールスナップ領域のインライン方向における先頭側のマージンを定義し、このボックスをスナップポートにスナップするために使用されます。スクロールスナップ領域は変換された境界ボックスによって定義され、四角形の囲みボックスを探して (スクロールコンテナーの座標空間における軸に合わせられ)、それから指定された外部距離が追加されます。

試してみましょう

構文

css
/* <length> 値 */
scroll-margin-inline-start: 10px;
scroll-margin-inline-start: 1em;

/* グローバル値 */
scroll-margin-inline-start: inherit;
scroll-margin-inline-start: initial;
scroll-margin-inline-start: revert;
scroll-margin-inline-start: unset;

<length>

スクロールコンテナーのインライン方向における先頭側の辺からみた外部の距離です。

公式定義

初期値0
適用対象すべての要素
継承なし
計算値指定通り
アニメーションの種類計算値の型による

形式文法

scroll-margin-inline-start = 
<length>

簡単なデモ

この例では、上記のインタラクティブ例と非常によく似たものを実装していますが、ここではその実装方法を説明します。

ここでの目的は、水平方向にスクロールする 4 つのブロックを作成することです。2 つ目と 3 つ目のブロックは、それぞれのブロックの左端に近いところでスナップします。

HTML

ブロックを表す HTML はとても簡単です。

html
<div class="scroller">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
</div>

CSS

外側のコンテナーのスタイルは以下のようになっています。

css
.scroller {
  text-align: left;
  width: 250px;
  height: 250px;
  overflow-x: scroll;
  display: flex;
  box-sizing: border-box;
  border: 1px solid #000;
  scroll-snap-type: x mandatory;
}

スクロールスナップに関連する主な部品は、overflow-x: scroll で、コンテンツがスクロールしても隠れないようにしています。また、scroll-snap-type: x mandatory で、スクロールのスナップは水平軸に沿って行わなければならず、スクロールは常にスナップ点で静止するようになっています。

子要素のスタイルは次のようになっています。

css
.scroller > div {
  flex: 0 0 250px;
  width: 250px;
  background-color: #663399;
  color: #fff;
  font-size: 30px;
  display: flex;
  align-items: center;
  justify-content: center;
  scroll-snap-align: start;
}

.scroller > div:nth-child(2n) {
  background-color: #fff;
  color: #663399;
}

ここで最も重要なのは scroll-snap-align: start で、これは左側の端 (ここでは x 軸に沿った「先頭」) をスナップ点として指定するものです。

最後に、スクロールのマージン値を指定しますが、これは 2 番目と 3 番目の子要素に対して異なる値を指定します。

css
.scroller > div:nth-child(2) {
  scroll-margin-inline-start: 1rem;
}

.scroller > div:nth-child(3) {
  scroll-margin-inline-start: 2rem;
}

つまり、真ん中の子要素を過ぎてスクロールした場合、2 番目の <div> のインラインの先頭から 1rem、3 番目の <div> のインラインの先頭から 2rem のところでスナップすることになります。

結果

自分でやってみましょう。

仕様書

Specification
CSS Scroll Snap Module Level 1
# margin-longhands-logical

ブラウザーの互換性

BCD tables only load in the browser

関連情報