CSS Scroll Snap モジュール レベル 1

W3C 勧告候補 スナップショット、

このバージョン:
https://www.w3.org/TR/2021/CR-css-scroll-snap-1-20210311/
最新の公開バージョン:
https://www.w3.org/TR/css-scroll-snap-1/
編集者草案:
https://drafts.csswg.org/css-scroll-snap-1/
以前のバージョン:
実装レポート:
https://wpt.fyi/results/css/css-scroll-snap
テストスイート:
http://test.csswg.org/suites/css-scroll-snap-1_dev/nightly-unstable/
課題追跡:
CSSWG 課題リポジトリ
編集者:
Matt Rakow (Microsoft)
Jacob Rossi (Microsoft)
Tab Atkins-Bittner (Google)
Elika J. Etemad / fantasai (招待専門家)
この仕様の編集を提案:
GitHub エディター

概要

このモジュールには、「スナップ位置」を使用してパンおよびスクロールの動作を制御するための機能が含まれています。

CSS は、構造化文書 (HTML や XML など)のレンダリングを 画面や紙などに記述するための言語です。

この文書のステータス

この節では、この文書の公開時点におけるステータスについて説明します。 他の文書がこの文書に取って代わる場合があります。 現在の W3C 公開文書の一覧 およびこの技術報告書の最新版は、 https://www.w3.org/TR/ にある W3C 技術報告書索引で確認できます。

この文書は、 CSS ワーキンググループによって勧告候補 スナップショットとして公開されました。 勧告候補としての公開は、 W3C メンバーによる承認を意味するものではありません。 勧告候補スナップショットは広範なレビューを受けており、実装経験を 収集することを目的としています。 この文書は W3C 勧告となることを意図しています。 追加のフィードバックを収集するため、少なくとも までは勧告候補のままとなります。

フィードバックは、 GitHub に課題を登録する(推奨)ことにより送信してください。 タイトルには、次のように仕様コード「css-scroll-snap」を含めてください: 「[css-scroll-snap] …コメントの概要…」。 すべての課題およびコメントはアーカイブされています。 または、(アーカイブされている)公開メーリングリスト www-style@w3.org にフィードバックを送信できます。

この文書は、2020年9月15日付 W3C プロセス文書に準拠します。

この文書は、W3C 特許ポリシーの下で活動するグループによって作成されました。 W3C は、グループの成果物に関連して行われたすべての特許開示の 公開リストを維持しています。 このページには、特許を開示するための手順も記載されています。 ある個人が、その個人の考えでは 必須 クレームを含む特許について実際の知識を有する場合、その個人はW3C 特許 ポリシーの第6節に従って情報を開示しなければなりません。

テストスイートおよび実装レポートは、 CR 期間中に作成されます。

以下の機能はリスクありとされており、CR 期間中に削除される可能性があります:

「リスクあり」は W3C プロセスにおける専門用語であり、その機能が削除または延期される危険にさらされていることを必ずしも 意味するものではありません。これは、WG がその機能について、適時に相互運用可能な形で 実装することが困難である可能性があると考えていることを意味し、そのように指定することで、WG は必要に応じて 勧告案段階へ移行する際に、その機能を含まない新たな勧告候補を最初に公開することなく、その機能を 削除できます。

1. はじめに

この節は規範的ではありません。

スクロール可能なコンテンツで一般的な UX パラダイムでは、コンテンツをページ単位で移動したり、 論理的な区分に分割したりすることがよくあります。 これは特にタッチ操作で当てはまります。 ユーザーにとって、タップナビゲーションで階層構造を掘り下げるよりも、 平面的に配置された広範なコンテンツをすばやくパンする方が迅速かつ容易だからです。 たとえば、アルバム内の個々の写真をタップするよりも、 写真のスライドショー表示をパンすることで、 ユーザーはフォトアルバム内の多くの写真をより簡単に見ることができます。

しかし、タッチによるパンやマウスホイールによるスクロールのような スクロール入力には不正確な性質があるため、 Web 開発者が十分に制御されたスクロール体験を保証することは困難であり、 特にコンテンツをページ単位で移動する効果を作成することは困難です。 たとえば、パンしたときに項目の一部だけが画面内に残るような 不自然なスクロール位置でユーザーが停止してしまうことは容易に起こります。

このため、このモジュールではスクロールスナップ位置を導入します。これは、スクロール操作の完了後にスクロールコンテナーのスクロールポートが終了できる スクロール位置を強制するものです。

また、スナップが無効な場合でも、 ページングおよびスクロール位置をより適切に制御できるようにするため、 このモジュールでは、すべてのスクロールコンテナーで使用するための scroll-padding プロパティを定義し、 ページングおよびスクロールして表示する操作のために、スクロールコンテナー最適表示領域を 調整できるようにします。 同様に、scroll-margin プロパティは任意のボックスで使用でき、 スクロールして表示する操作のために その視覚領域を調整できます。

1.1. モジュール間の相互作用

このモジュールは、[CSS2] の 11.1 節で定義されているスクロールユーザーインターフェイス機能を拡張します。

このモジュール内のいずれのプロパティも、::first-line および ::first-letter 疑似要素には適用されません。

1.2. 値の定義

この仕様は、[CSS2]CSS プロパティ 定義規約に従い、[CSS-VALUES-3]値定義構文を使用します。 この仕様で定義されていない値型は、CSS Values & Units [CSS-VALUES-3] で定義されています。 他の CSS モジュールと組み合わせることで、これらの値型の定義が拡張される場合があります。

各定義に記載されているプロパティ固有の値に加えて、 この仕様で定義されるすべてのプロパティは、 プロパティ値としてCSS 全体キーワードも受け入れます。 可読性のため、それらは明示的には繰り返し記載されていません。

2. 動機付けとなる例

この例では、スクロールコンテナー内に配置された一連の画像を使用して、フォトギャラリーを構築します。この例では、 スクロールコンテナーは内部に含まれる写真よりも大きく (そのため複数の画像を同時に見ることができます)、画像の サイズはそれぞれ異なります。必須の要素ベースのスナップ 位置を使用すると、スクロールは常に、画像がスクロールコンテナーのスクロールポートの中央に配置された状態で完了します。
img {
    /* 各写真の中央が、スナップ時に
       X 軸上でスクロールコンテナーの中央と
       揃うよう指定します */
    scroll-snap-align: none center;
}
.photoGallery {
    width: 500px;
    overflow-x: auto;
    overflow-y: hidden;
    white-space: nowrap;
    /* スクロール操作の完了時に、スクロール位置が
       常にスナップ位置にあることを
       要求します。 */
    scroll-snap-type: x mandatory;
}
<div class="photoGallery">
    <img src="img1.jpg">
    <img src="img2.jpg">
    <img src="img3.jpg">
    <img src="img4.jpg">
    <img src="img5.jpg">
</div>
この例におけるスクロールコンテナーのコンテンツのレイアウト。 スナップポートは赤い矩形で表され、スナップ領域は黄色い 矩形で表されています。scroll-snap-align がインライン(水平)軸で「center」であるため、スナップポートの X 軸中心(赤い点線で表されます)とスナップ領域の X 軸中心(黄色い点線で表されます)が揃う 各スクロール位置にスナップ位置が設定されます。
この例では、各 ページをスクロール コンテナーの端の近く(ただし端そのものではない位置)に揃える、ページ分割された文書を構築します。 これにより、ユーザーがまだ文書の先頭に到達していないことを認識できるよう、 前のページが上から少し「覗く」ようになります。 必須スナップ位置の代わりに近接スナップ位置を使用することで、ユーザーはページの途中で停止できます (一度に 1 ページずつスナップするよう強制されません)。ただし、スクロール操作がスナップ位置の近くで終了する場合、 スクロールは指定されたとおりに ページを揃えるよう調整されます。
.page {
    /* 各ページの上端を、スナップに使用する
       端として定義します */
    scroll-snap-align: start none;
}
.docScroller {
    width: 500px;
    overflow-x: hidden;
    overflow-y: auto;
    /* 各要素のスナップ領域を上端から
       100px オフセットした位置に揃えるよう指定します。 */
    scroll-padding: 100px 0 0;
    /* スナップ位置の近くにある場合、操作の完了時に
        スクロールがスナップ位置で終了するよう促します */
    scroll-snap-type: y proximity;
}
<div class="docScroller">
    <div class="page">ページ 1</div>
    <div class="page">ページ 2</div>
    <div class="page">ページ 3</div>
    <div class="page">ページ 4</div>
</div>
この例におけるスクロールコンテナーのコンテンツのレイアウト。 スナップポートは赤い矩形で表され (scroll-padding によって上端から 100px 内側に配置されます)、 スナップ領域は黄色い矩形で表されます。 scroll-snap-align が Y 軸で「start」であるため、 スナップポートの Y-start (赤い点線で表されます)と スナップ領域の Y-start (黄色い点線で表されます)が揃う各スクロール位置に、 スナップ位置が設定されます。

3. スクロールスナップモデル

このモジュールでは、スクロールスナップ 位置を制御する仕組みを定義します。 これは、スクロールコンテナー内のコンテンツを 特定の配置にするスクロール位置です。 関連するスクロールコンテナーscroll-snap-type プロパティを使用することで、 作者は、スクロール操作後にスクロールポートが スナップ位置に到達するよう、特定の傾向を要求できます (scrollTo() メソッドなどのプログラムによるスクロールを含みます)。

スナップ位置は、 要素のスクロールスナップ 領域scroll-margin によって変更された境界バウンディングボックス)を、 スクロールコンテナースナップポートscroll-padding によって縮小されたスクロールポート)内で、 特定の配置(scroll-snap-align)にするものとして指定されます。 これは概念的には、 配置 コンテナー内で配置対象の配置を指定することと同等です。 指定された配置を満たすスクロール位置が スナップ位置です。

スクロールコンテナーのスクロールポートの スクロール位置を、スナップ位置に揃うよう 調整する行為をスナップと呼び、 スクロールコンテナーのスクロールポートの スクロール位置がスナップ位置であり、 アクティブなスクロール操作がない場合、そのスクロールコンテナーはそのスナップ位置スナップしているといいます。 CSS Scroll Snap Module は、スナップ 位置を強制するために使用される正確なアニメーションや物理挙動を 意図的に指定も義務付けもしていません。 これはユーザーエージェントに委ねられます。

スナップ位置は、 要素の包含ブロックチェーン上で最も近い祖先スクロール コンテナーにのみ影響します。

4. スクロールスナップ領域の捕捉: スクロールコンテナーのプロパティ

4.1. スクロールスナップ規則: scroll-snap-type プロパティ

名前: scroll-snap-type
値: none | [ x | y | block | inline | both ] [ mandatory | proximity ]?
初期値: none
適用対象: すべての要素
継承: しない
パーセンテージ: 該当なし
算出値: 指定されたキーワード
正規順序: 文法に従う
アニメーション型: 離散

scroll-snap-type プロパティは、 スクロールコンテナースクロールスナップコンテナーであるかどうか、 どの程度厳密にスナップするか、 およびどの軸を考慮するかを指定します。 厳密性の値が指定されていない場合、proximity と見なされます。

この例では、見出しへのスナップを ブロック軸(横書きでは y 軸、縦書きでは x 軸)で有効にします:
html {
  scroll-snap-type: block;   /* メイン文書スクローラーに適用 */
}
h1, h2, h3, h4, h5, h6 {
  scroll-snap-align: start;  /* ビューポートの先頭(上端)にスナップ */
}

UA は、ルート要素に設定されたscroll-snap-type の値を 文書ビューポートに適用しなければなりません。 overflow とは異なり、scroll-snap-type の値は HTML body から伝播しないことに注意してください。

4.1.1. スクロールスナップ軸: xyblockinline、および both

軸値は、どの軸がスナップ位置の影響を受けるか、 またスナップ位置が軸ごとに独立して 評価されるか、 2D 点としてまとめて評価されるかを指定します。 値は次のように定義されます:

x
スクロールコンテナーは、水平方向の軸でのみスナップ位置スナップします。
y
スクロールコンテナーは、垂直方向の軸でのみスナップ位置スナップします。
block
スクロールコンテナーは、ブロック軸でのみスナップ位置スナップします。
inline
スクロールコンテナーは、インライン軸でのみスナップ位置スナップします。
both
スクロールコンテナーは、両方の軸で独立してスナップ位置スナップします (各軸で異なる要素にスナップする可能性があります)。

4.1.2. スクロールスナップの厳密性: noneproximity、および mandatory

厳密性の 値noneproximitymandatory)は、 スクロール コンテナーに対して、スナップ位置をどの程度厳密に強制するか (スクロール位置の調整を強制することで)を指定します。 値は次のように定義されます:

none
スクロールコンテナーに指定された場合、 そのスクロールコンテナースナップしてはなりません。
mandatory
スクロールコンテナーに指定された場合、 アクティブなスクロール操作がないとき、 そのスクロールコンテナーはスナップ位置にスナップしている必要があります。 有効なスナップ 位置が存在する場合、 スクロールコンテナーはスクロールの終了時にスナップしなければなりません (存在しない場合、スナップは発生しません)。
proximity
スクロールコンテナーに指定された場合、 そのスクロールコンテナーは、スクロールのパラメーターに基づく UA の裁量により、 スクロールの終了時にスナップ位置へスナップしてもかまいません。

作者は、さまざまなサイズの画面および(該当する場合)さまざまなサイズのコンテンツを 考慮して必須スナップ位置を使用するべきです。 特に、スクロールポートより大きいスナップされた要素へのアクセスは UA によって処理されますが、 作者が隣接していない兄弟要素に必須スナップを割り当てた場合、 その間のコンテンツが画面より長い場合には アクセス不能になることがあります。

ボックスがスクロール コンテナーであるか、または scroll-snap-typenone 以外の値を持つ場合、 そのボックスはスナップ 位置を捕捉するといいます。 ボックスの包含ブロックチェーン上で最も近いスナップ位置を捕捉する祖先が、 scroll-snap-typenone 以外の値を持つスクロールコンテナーである場合、 それがそのボックスのスクロールスナップコンテナーです。 それ以外の場合、そのボックスにはスクロールスナップコンテナーがなく、 そのスナップ 位置スナップを発生させません。

4.1.3. レイアウト変更 後の再スナップ

文書のコンテンツまたはレイアウトが変更され (たとえば、コンテンツが追加、移動、削除、サイズ変更され)、 スナップポートのコンテンツが変化した場合、 UA は結果として生じるスクロール位置を再評価し、 必要に応じて再スナップしなければなりません。 コンテンツ変更前にスクロールコンテナースナップしていた場合で、 同じスナップ 位置が引き続き存在する場合 (たとえば、関連付けられた要素が削除されていない場合)、 スクロールコンテナーはコンテンツ変更後に 同じスナップ位置へ再スナップしなければなりません。 変更前に複数のボックスがスナップしており、 それらのスナップ位置が一致しなくなった場合、 そのうちの 1 つがフォーカスまたはターゲットされていれば、 スクロールコンテナーはそのボックスに再スナップしなければならず、 それ以外の場合、どのボックスに再スナップするかは UA によって定義されます。 (たとえば UA は、レイアウトの変化によって他の要素の スナップ位置が整列したり整列しなくなったりする際に、 どの要素がスナップされているかを追跡してもかまいません。)

新しい、または異なるボックスへの再スナップ操作に必要なスクロールは、 他のスクロールして表示する操作と同じ方法で 動作およびアニメーションしなければならず、 scroll-behavior のような制御も尊重しなければなりません。 ただし、以前と同じボックスへの再スナップ時のスクロール動作は UA によって定義されます。 たとえば UA は、 節の先頭にスナップしているとき、 文書内のそれより前の位置にコンテンツが動的に追加された場合に、 スクロールしていないように見せるため、 節の新しい位置までスクロールするアニメーションを行わないことを選択してもかまいません。

次の例では、 ログコンソールは、 最初に読み込まれたとき、および各メッセージが末尾に追加されるたびに、 ユーザーがその端から離れるようにスクロールしていない限り、 コンテンツの末尾にスナップしたままになります:
.log {
  scroll-snap-type: proximity;
  align-content: end;
}
.log::after {
  display: block;
  content: "";
  scroll-snap-align: end;
}

これらの規則は、::after 疑似要素によって表される単一のスクロールスナップ領域を作成し、 スクロールスナップコンテナーの最下部に配置します。 ユーザーが下端の「近く」までスクロールすると、 コンテナーはそこにスナップします。 コンテナーにさらにコンテンツが動的に追加された場合も、 そこにスナップしたままとなります (変更後も同じスクロールスナップ領域が存在する場合、 スクロールコンテナーは 同じスクロールスナップ領域に再スナップする必要があるためです)。 ただし、ユーザーがログ内の別の位置までスクロールしている場合、 何も行いません。

4.2. スクロールスナップポート: scroll-padding プロパティ

名前: scroll-padding
値: [ auto | <length-percentage> ]{1,4}
初期値: auto
適用対象: スクロールコンテナー
継承: しない
パーセンテージ: スクロールコンテナーのスクロールポートの対応する寸法に対する相対値
算出値: 各辺について、キーワード auto または 算出された <length-percentage>
アニメーション型: 算出値の型による
正規順序: 文法に従う

このプロパティは、 (スクロールスナップコンテナーだけでなく、 すべてのスクロールコンテナーについて) スクロールポートの最適表示領域を定義するオフセットを指定します。 これは、ユーザーの視界に物を配置する際のターゲット領域として使用される領域です。 これにより作者は、他のコンテンツによって覆われている スクロールポートの領域 (固定位置のツールバーやサイドバーなど)を除外したり、 単にターゲット要素とスクロールポートの端との間に より多くの余白を設けたりできます。

scroll-padding プロパティは、 1 つの宣言ですべてのscroll-padding-* ロングハンドを設定するショートハンド プロパティであり、 padding プロパティがそのロングハンドに対して行うのとまったく同じ方法で、 各辺を表すロングハンドに値を割り当てます。 値の意味は次のとおりです:

<length-percentage>

スクロールポートの対応する辺から内側へのオフセットを定義します。 ルートビューポートに適用される場合、 このオフセットは視覚ビューポートではなくレイアウトビューポートに対して計算および適用され、 固定配置ボックスに対する対応するインセットプロパティと同じ方法で処理されます。 最適表示領域は、視覚ビューポートと交差する 残りの領域です。

auto

スクロールポートの対応する辺のオフセットが UA によって決定されることを示します。 これは通常、使用値として 0px を既定値とするべきですが、 UA は、ゼロ以外の値の方がより適切な場合を検出するためにヒューリスティックを使用してもかまいません。

たとえば、 UA は、position:fixed 要素が、 下にあるコンテンツを覆う不透明でスクロールしない「ヘッダー」として使用されていることを検出し、 上側のオフセットをその要素の高さに解決することで、 「ページダウン」操作(PgDn を押すなど)が 自動的にコンテンツの「表示可能な 1 ページ」分だけスクロールするようにできます。

これらのオフセットは、スクロール操作において 「表示可能」と見なされるスクロールポートの領域を縮小します。 これらはレイアウト、 スクロール原点または初期位置、 あるいは要素が実際に可視であると見なされるかどうかには影響しませんが、 要素またはキャレットがスクロールして表示されたと見なされるかどうか (たとえば、ターゲット指定またはフォーカス操作の場合)には影響するべきであり、 ページング操作 (PgUp および PgDn キーを使用したり、 スクロールバーから同等の操作を発生させたりする場合など)でのスクロール量を減らし、 スクロールポート最適表示領域内で、 ユーザーが連続したコンテンツの流れを確認できるようにするべきです。

スクロールスナップ コンテナーの場合、この領域は スクロールスナップポートも定義します。—これは、スナップ 位置を計算する際に、スクロールスナップ領域配置コンテナーとして使用されるスクロールポートの領域です。

この例では、scroll-padding を使用して、 固定配置されたツールバーによって覆われていない スクロールポートの部分の中央にスライドショー画像を配置します。
html {
    overflow-x: auto;
    overflow-y: hidden;
    scroll-snap-type: x mandatory;
    scroll-padding: 0 500px 0 0;
}
.toolbar {
    position: fixed;
    height: 100%;
    width: 500px;
    right: 0;
}
img {
    scroll-snap-align: none center;
}

UA は、ルート要素に設定されたscroll-padding の値を 文書ビューポートに適用しなければなりません。 (overflow とは異なり、scroll-padding の値は HTML body から伝播しないことに注意してください。)

5. スクロールスナップ領域の整列: 要素のプロパティ

5.1. スクロールスナップ領域: scroll-margin プロパティ

名前: scroll-margin
値: <length>{1,4}
初期値: 0
適用対象: すべての要素
継承: しない
パーセンテージ: 該当なし
算出値: 各辺について絶対長
正規順序: 文法に従う
アニメーション型: 算出値の型による

このプロパティは、1 つの宣言ですべての scroll-margin-* ロングハンドを設定するショートハンドプロパティであり、 margin プロパティが そのロングハンドに対して行うのとまったく同じ方法で、 各辺を表すロングハンドに値を割り当てます。

値は、このボックスをスナップポートへスナップする際に使用されるスクロールスナップ領域を定義する外側への拡張量を表します。 スクロールスナップ領域は、 変形後の境界ボックスを取得し、 その矩形バウンディングボックス (スクロールコンテナーの座標空間内で軸に揃えたもの)を求め、 そこに指定された外側への拡張量を加えることで決定されます。

注: これにより、スクロールスナップ領域は常に矩形となり、 スクロール コンテナーの座標空間の軸に揃います。

ターゲット要素を定義するフラグメントへページがナビゲートされた場合 (:target に一致する要素、 または scrollIntoView() のターゲット)、 UA は、表示するスクロール可能なオーバーフロー領域のどの部分を表示するかを決定する際に、 単なる要素の境界ボックスではなく、その要素のスクロールスナップ領域を使用するべきです。スナップが無効である場合、 またはこの要素にスナップが適用されていない場合でも同様です。

5.2. スクロールスナップの整列: scroll-snap-align プロパティ

名前: scroll-snap-align
値: [ none | start | end | center ]{1,2}
初期値: none
適用対象: すべての要素
継承: しない
パーセンテージ: 該当なし
算出値: 2 つのキーワード
正規順序: 文法に従う
アニメーション型: 離散

scroll-snap-align プロパティは、 ボックスのスナップ 位置を、そのスナップ領域配置対象として)を そのスナップ コンテナーのスナップポート配置コンテナーとして)内に配置することとして指定します。 2 つの値は、それぞれ ブロック軸およびインライン軸での スナップ配置を指定し、 スナップコンテナー書字モードによって決定されます。 値が 1 つだけ指定された場合、2 番目の値は同じ値を既定値とします。

値は次のように定義されます:

none
このボックスは、指定された軸にスナップ位置を定義しません。
start
スクロール コンテナースナップポート内で、このボックスのスクロールスナップ領域を先頭に揃えた配置が、 指定された軸におけるスナップ位置です。
end
スクロール コンテナースナップポート内で、このボックスのスクロールスナップ領域を末尾に揃えた配置が、 指定された軸におけるスナップ位置です。
center
スクロール コンテナースナップポート内で、このボックスのスクロールスナップ領域を中央に揃えた配置が、 指定された軸におけるスナップ位置です。

先頭および末尾の配置は、 スクロールスナップ領域スナップポートより大きい場合を除き、 スナップコンテナー書字モードを基準に解決されます。 その場合はボックス自体の書字モードを基準に解決されます。 (これにより、コンテナー内の項目は通常、一貫したスナップ配置を持つことができる一方、 start は常に項目を そのコンテンツを先頭から読めるように配置できます。)

5.2.1. 有効なスナップ位置を可視ボックスに限定する

スクロールスナップの目的は、最適な表示のためにスクロールポート内で コンテンツを整列することなので、 あるスクロール位置へスナップすると、その位置に寄与するスナップ領域スナップポートの完全に外側に残る場合、 たとえそれ以外の点ではスナップ 領域に要求される配置を満たしていても、有効なスナップ位置とは見なせません。

たとえば、スナップ領域は、その上端がスナップポートの上端と 一致する場合、スナップポートの上端に揃えられています。 また、スナップ領域の少なくとも一部が画面内にある場合、 これはそのスナップ領域をブロック軸の先頭に揃えてスナップするための 有効なスナップ位置と見なされます。 ただし、スナップ領域全体がスナップポートの外側にある場合、 必要な配置が満たされていても閲覧者には関係しないため、スクロールコンテナースナップしているとは見なせません。
╔══ビューポート══╗┈┈┈┈┈┈┈┈┌──────────────┐
║  ┌─────┐ ┌──┐  ║        │ 上端スナップ │
║  ├──┐  │ └──┘  ║        │    要素      │
║  └──┴──┘       ║        │              │
╚════════════════╝        │              │
                          └──────────────┘
画面外の要素の配置は スナップとは見なされません。
なぜ要素が可視の場合にのみスナップを制限するのか? WebKit の実装者が 指摘しているように、 スナップ辺をキャンバス全体に無限に拡張すると、 グリッド状のレイアウトに対するスナップしかできず、 画面外の要素が画面内の要素と揃っていない場合、 ユーザーにとって不自然な動作になります。 (ただし、この要件が実装者にとって負担が大きい場合、 既定でグリッド状の動作とし、 より賢い動作を後から有効にする切り替えを導入することもできます。)

注: scroll-snap-type: bothスナップ 位置を各軸で独立して評価しますが、ある軸でのスナップ位置選択は、 もう一方の軸のスナップ位置の影響を受ける場合があります。 たとえば、一方の軸でスナップすると、 他方の軸が揃えようとしていたスナップ領域が画面外に押し出され、 そのスナップ位置が無効となり、 選択できなくなる場合があります。

5.2.2. スクロールポートからオーバーフローするボックスのスナップ

スナップ領域が 特定の軸でスナップポートより 大きい場合、 スナップ領域スナップポートを覆い、 かつその軸における幾何学的に前後のスナップ位置間の距離が、 その軸におけるスナップポートのサイズより大きい 任意のスクロール位置は、その軸における有効なスナップ位置です。 UA は、特定のスクロール操作(たとえば明示的なページング)に対して、 指定された配置をより正確なターゲットとして使用してもかまいません。

たとえば、§ 2 動機付けとなる例の最初の例を考えます。 そこでは写真が領域でした。 作者は項目から項目への必須スナップを求めていますが、 項目がたまたまビューポートより大きい場合には、 その項目上にいる間は全体を自由にスクロールできることが望まれます。

スナップ領域スナップポートより大きいため、 領域がビューポート全体を完全に満たしている間、 コンテナーは任意にスクロールでき、 配置された位置へ戻るようスナップしようとはしません。 ただし、領域がある軸でビューポートを完全に満たさなくなる位置まで コンテナーがスクロールされた場合、 別のスナップ位置へのスナップを発生させるのに十分な距離まで スクロールされるまで、 領域は外向きのスクロールに抵抗します。

別の例として、 入れ子になった section 要素に必須の上端スナップを設定すると、 (大きな最上位の節から)大きなスナップ領域が生成され、 その中に(下位節からの)より小さなスナップ領域が 含まれる可能性があります。 下位節が十分に小さい場合、 通常どおりスナップします。 長い場合には、 閲覧者はその中を自由にスクロールでき、 またはスナップ先となる下位節のない最上位の節の大きな区間内を自由にスクロールできます。
┌─ 最上位の節 ─────┐ ━┓
│                     │ 1┃
│                     │  ┃
│                     │ ━┩
│                     │  ┆
│                     │  ┆
│┌──── 下位節 ──────┐│  ╯ ━┓
│└───────────────────┘│    2┃
│┌──── 下位節 ──────┐│ ━┓  ┃
││                   ││ 3┃ ━┛
│└───────────────────┘│  ┃
│┌──── 下位節 ──────┐│ ━┛ ━┓
│└───────────────────┘│    4┃
│┌──── 下位節 ──────┐│ ━┓  ┃
││                   ││ 5┃ ━┛
││                   ││  ┃
││                   ││ ━┩
││                   ││  ┆
││                   ││  ┆
││                   ││  ┆
│└───────────────────┘│  ┆
└─────────────────────┘  ╯
上の図では、 番号が付いた 5 つのビューポートが、 最上位の節とその 4 つの下位節に関連付けられた 5 つのスナップ位置を表しています。 最初と最後のスナップ位置はビューポートより高い範囲の一部であるため、 閲覧者は各範囲の上端と下端の間を 自由にスクロールできます。

注: 作者が代わりに各節の 見出しに必須スナップ位置を設定した場合 (節そのものではなく)、 最初と 5 番目の節のコンテンツの一部は ユーザーからアクセスできなくなります。 見出しのスナップ領域は節全体を覆うまで広がらないためです。 このため、大きく間隔が空く可能性のある要素に 必須スナップ位置を使用するのは適切ではありません。

5.2.3. 到達不能なスナップ位置

スナップ 位置が指定どおりには到達不能であり、 そこへ揃えるにはスクロール コンテナーのビューポートを スクロール可能なオーバーフロー領域の端を越えてスクロールする必要がある場合、 このスナップ領域に対する 使用されるスナップ位置は、 関連する各軸で目的のスナップ位置に向かって 可能な限りスクロールした結果の位置となります。

5.3. スクロールスナップの制限: scroll-snap-stop プロパティ

名前: scroll-snap-stop
値: normal | always
初期値: normal
適用対象: すべての要素
継承: しない
パーセンテージ: 該当なし
算出値: 指定されたキーワード
正規順序: 文法に従う
アニメーション型: 離散

意図された方向を伴ってスクロールする場合、 スクロールコンテナーは、 スクロール操作の自然な終端に到達し、 最終的なスクロール位置を選択する前に、 複数の可能なスナップ位置を 「通過」することがあります (スクロール操作が同じ方向で、より短い距離を使用した場合には、 それらは有効なスナップ先となります)。 scroll-snap-stop プロパティは、そのような可能なスナップ位置にスクロール操作を「捕捉」させ、 スクロール操作が自然に終了する前に スクロールコンテナーを停止させることができます。

値は次のように定義されます:

normal
スクロールコンテナーは、スクロール操作の実行中に、 この要素によって定義されたスナップ位置を通過してもかまいません。
always
スクロールコンテナーは、スクロール操作の実行中に、 この要素によって定義されたスナップ位置を通過してはならず、 代わりにこの要素の最初のスナップ 位置にスナップしなければなりません。

このプロパティは、意図された終了位置のみを持つスクロール操作には影響しません。 そのような操作は概念上、いかなるスナップ位置も「通過」しないためです。

6. スナップのメカニズム

スナップ先のスナップ位置を選択する正確なモデルアルゴリズムは、 意図的にほとんど未定義のままとされています。 これにより、ユーザーエージェントはユーザーの意図や操作に関する高度なモデルを考慮し、 時間の経過とともに応答方法を調整して、 ユーザーに最も適切に対応できます。

この節では、スクロールスナップのメカニズムについて議論するのに役立つ概念をいくつか定義し、 効果的なスクロールスナップ戦略がどのようなものになり得るかについて指針を示します。 ユーザーエージェントには、この指針を適応させ、 独自のスナップ動作を定義する際に 自らの最善の判断を適用することが推奨されます。 また、作者がスクロールスナップを念頭に置いてインターフェイスを設計する際に 依存できる最低限妥当な動作を確保するため、 少数の動作要件も示します。

6.1. スクロール方法の種類

ページがスクロールされるとき、 その操作は 意図された終了位置 および/または意図された方向を伴って実行されます。 これら 2 つの組み合わせそれぞれが 異なるスクロールのカテゴリを定義し、 それぞれ多少異なる方法で扱うことができます:

意図された終了 位置
意図された 終了位置のみを持つスクロールの一般的な例には、次のものがあります:
  • 勢いを付けずに離す パンジェスチャー

  • スクロールバーの「つまみ」を明示的に操作すること

  • scrollTo() などの API を介してプログラムからスクロールすること

  • 文書内のフォーカス可能な要素間を Tab キーで移動すること

  • ページ内のアンカーへ移動すること

  • Home/End キーなどのホーム移動操作

意図された方向および終了位置
意図された方向および終了位置の両方を持つスクロールの 一般的な例には、次のものがあります:
  • 慣性を伴うものとして解釈される 「フリング」ジェスチャー

  • scrollBy() などの API を介してプログラムからスクロールすること

  • PgUp/PgDn キーなどのページング操作(またはスクロールバー上の同等の 操作)

スナップポイントなどの機能が介入する前の スクロールの意図された終了点を、その自然な終了点と呼びます。

意図された 方向
意図された 方向のみを持つスクロールの一般的な例には、次のものがあります:
  • キーボードの矢印キーを押すこと(またはスクロールバー上の同等の操作)

  • 慣性ではなく固定量のスクロールとして解釈されるスワイプジェスチャー

さらに、ページレイアウトでは通常、物を垂直方向および/または水平方向に揃えるため、 UA はスクロールの方向が十分に垂直または水平である場合に、 スクロールを軸ロックすることがあります。 軸ロックされたスクロールは、 その軸に沿ってのみスクロールするよう制約されます。 これにより、精度の低い入力機構が主軸ではない方向へずれることを防ぎます。

注: この仕様は、ユーザーエージェントがサポートするスクロール方法にのみ適用されます。 ユーザーエージェントに特定の入力方法またはスクロール方法をサポートすることを要求するものではありません。

6.2. スナップ位置の選択

スクロールコンテナーは、そのスクロール可能なオーバーフロー領域全体に散在する多数のスナップ領域を持つことができます。 スナップ位置を選択する単純なアルゴリズムは、 ユーザーにとって直感的でない動作を生み出す可能性があるため、 選択アルゴリズムを設計する際には注意が必要です。 選択処理に役立ついくつかの指針を以下に示します:

付録 A: ロングハンド

物理ロングハンドおよび論理ロングハンド(ならびにそれらのショートハンド)は、 [CSS-LOGICAL-1] で定義されているとおりに相互作用します。

scroll-padding の物理ロングハンド

名前: scroll-padding-top, scroll-padding-right, scroll-padding-bottom, scroll-padding-left
値: auto | <length-percentage>
初期値: auto
適用対象: スクロールコンテナー
継承: しない
パーセンテージ: スクロールコンテナーのスクロールポートに対する相対値
算出値: キーワード auto または算出された <length-percentage>
正規順序: 文法に従う
アニメーション型: 算出値の型による

scroll-padding のこれらのロングハンドは、 スナップポートの 上端、右端、下端、左端を それぞれ指定します。 負の値は無効です。

scroll-padding のフロー相対ロングハンド

名前: scroll-padding-inline-start, scroll-padding-block-start, scroll-padding-inline-end, scroll-padding-block-end
値: auto | <length-percentage>
初期値: auto
適用対象: スクロールコンテナー
継承: しない
パーセンテージ: スクロールコンテナーのスクロールポートに対する相対値
算出値: キーワード auto または算出された <length-percentage>
正規順序: 文法に従う
アニメーション型: 算出値の型による

scroll-padding のこれらのロングハンドは、 スナップポートの block-start、inline-start、block-end、inline-end の各辺を それぞれ指定します。 負の値は無効です。

名前: scroll-padding-block, scroll-padding-inline
値: [ auto | <length-percentage> ]{1,2}
初期値: auto
適用対象: スクロールコンテナー
継承: しない
パーセンテージ: スクロールコンテナーのスクロールポートに対する相対値
算出値: 個々のプロパティを参照
アニメーション型: 算出値による
正規順序: 文法に従う

scroll-padding-block-start + scroll-padding-block-end および scroll-padding-inline-start + scroll-padding-inline-end のこれらのショートハンドは、scroll-paddingロングハンドであり、 スナップポートのブロック軸およびインライン軸の辺をそれぞれ指定します。

2 つの値が指定された場合、最初の値は先頭値を、 2 番目の値は末尾値を指定します。

scroll-margin の物理ロングハンド

名前: scroll-margin-top, scroll-margin-right, scroll-margin-bottom, scroll-margin-left
値: <length>
初期値: 0
適用対象: すべての要素
継承: しない
パーセンテージ: 該当なし
算出値: 絶対長
正規順序: 文法に従う
アニメーション型: 算出値の型による

scroll-margin のこれらのロングハンドは、 スクロールスナップ 領域の上端、右端、下端、左端をそれぞれ指定します。

scroll-margin のフロー相対ロングハンド

名前: scroll-margin-block-start, scroll-margin-inline-start, scroll-margin-block-end, scroll-margin-inline-end
値: <length>
初期値: 0
適用対象: すべての要素
継承: しない
パーセンテージ: 該当なし
算出値: 絶対長
正規順序: 文法に従う
アニメーション型: 算出値の型による

scroll-margin のこれらのロングハンドは、 スクロールスナップ 領域の block-start、inline-start、block-end、inline-end の各辺をそれぞれ指定します。

名前: scroll-margin-block, scroll-margin-inline
値: <length>{1,2}
初期値: 0
適用対象: すべての要素
継承: しない
パーセンテージ: 該当なし
算出値: 個々のプロパティを参照
アニメーション型: 算出値の型による
正規順序: 文法に従う

scroll-margin-block-start + scroll-margin-block-end および scroll-margin-inline-start + scroll-margin-inline-end のこれらのショートハンドは、scroll-marginロングハンドであり、 スクロールスナップ 領域のブロック軸およびインライン軸の辺をそれぞれ指定します。

2 つの値が指定された場合、最初の値は先頭値を、 2 番目の値は末尾値を指定します。

7. プライバシーおよびセキュリティに関する考慮事項

この仕様は、DOM によって直接すでに公開されている情報以外の いかなる情報も公開しません。 単にスクロールを少し機能的にするだけです。 新たなプライバシーまたはセキュリティ上の考慮事項はありません。

8. 謝辞

David Baron、 Simon Fraser、 Håkon Wium Lie、 Theresa O’Connor、 François Remy、 Majid Valpour、 そして特に Robert O’Callahan に、 この文書に取り入れられた 提案および推奨事項について深く感謝します。

9. 変更点

9.1. 2019年3月19日 CR 以降の変更点

2019年3月19日 勧告候補以降の変更点には、次のものがあります:

コメントの処理結果を 参照できます。

9.2. 2019年1月31日 CR 以降の変更点

2019年1月31日 勧告候補以降の変更点には、次のものがあります:

9.3. 2018年8月14日 CR 以降の変更点

2018年8月14日 勧告候補以降の変更点には、次のものがあります:

コメントの処理結果を 参照できます

9.4. 2017年12月14日 CR 以降の変更点

2017年12月14日 勧告候補以降の変更点には、次のものがあります:

コメントの処理結果を 参照できます。

9.5. 2017年8月24日 CR 以降の変更点

2017年8月24日 勧告候補以降の変更点には、次のものがあります:

コメントの処理結果を 参照できます。

9.6. 2016年10月20日 CR 以降の変更点

2016年10月20日 勧告候補以降の変更点には、次のものがあります:

コメントの処理結果を 参照できます。

適合性

文書の表記規則

適合性要件は、説明的な表明と RFC 2119 の用語を組み合わせて表現されます。この文書の規範的な部分におけるキーワード「MUST」、 「MUST NOT」、「REQUIRED」、「SHALL」、「SHALL NOT」、「SHOULD」、「SHOULD NOT」、 「RECOMMENDED」、「MAY」、「OPTIONAL」は、RFC 2119 で説明されているとおりに 解釈されるものとします。 ただし、可読性のため、この仕様ではこれらの語をすべて大文字では 表記していません。

この仕様のすべてのテキストは、非規範的であると明示的に示された節、 例、および注記を除き、規範的です。 [RFC2119]

この仕様の例は、「たとえば」という語で導入されるか、 次のように class="example" を使用して規範的なテキストから区別されます:

これは参考例の一例です。

参考注記は「注」という語で始まり、 次のように class="note" を使用して規範的なテキストから区別されます:

注: これは参考注記です。

勧告事項は、特別な注意を促すようにスタイル設定された規範的な節であり、 次のように <strong class="advisement"> を使用して他の規範的なテキストから区別されます: UA はアクセシブルな代替手段を提供しなければなりません。

適合クラス

この仕様への適合性は、 3 つの適合クラスについて定義されます:

スタイルシート
CSS スタイルシート
レンダラー
スタイルシートの意味論を解釈し、 それらを使用する文書をレンダリングする UA
オーサリングツール
スタイルシートを書き出す UA

スタイルシートは、このモジュールで定義された構文を使用するすべての文が、 一般的な CSS 文法およびこのモジュールで定義された各機能の 個別の文法に従って有効である場合、 この仕様に適合しています。

レンダラーは、適切な仕様で定義されているとおりに スタイルシートを解釈することに加えて、この仕様で定義されるすべての機能を 正しく解析し、それに応じて文書をレンダリングすることによって サポートする場合、この仕様に適合しています。ただし、デバイスの制限により UA が文書を正しくレンダリングできないことによって、 UA が不適合になることはありません。(たとえば、UA は モノクロモニター上で色をレンダリングする必要はありません。)

オーサリングツールは、一般的な CSS 文法および このモジュール内の各機能の個別の文法に従って構文的に正しい スタイルシートを書き出し、このモジュールで説明されている スタイルシートのその他すべての適合性要件を満たす場合、 この仕様に適合しています。

部分実装

作者が前方互換の解析規則を利用して フォールバック値を割り当てられるようにするため、CSS レンダラーは、使用可能なレベルの サポートを持たないすべての at-rule、プロパティ、プロパティ値、キーワード、 およびその他の構文構造を無効として扱い(そして必要に応じて 無視しなければなりません。特に、ユーザーエージェントは、 単一の複数値プロパティ宣言内で、サポートされていないコンポーネント値を選択的に 無視し、サポートされている値を採用してはなりません。いずれかの値が無効と見なされる場合 (サポートされていない値は無効と見なされなければなりません)、CSS では宣言全体を 無視することが要求されます。

不安定な機能および 独自機能の実装

将来の安定した CSS 機能との衝突を避けるため、 CSSWG は、CSS の不安定な機能および独自拡張の実装について、 ベストプラクティスに従うことを推奨します。

非実験的な実装

仕様が勧告候補段階に到達すると、 非実験的な実装が可能となり、実装者は、仕様に従って正しく 実装されていることを実証できる CR レベルの機能について、 接頭辞なしの実装をリリースするべきです。

実装間で CSS の相互運用性を確立し維持するため、 CSS ワーキンググループは、非実験的な CSS レンダラーが、CSS 機能の接頭辞なし実装をリリースする前に、 実装レポート(および必要であれば、その実装レポートに使用した テストケース)を W3C に提出することを求めています。W3C に 提出されたテストケースは、CSS ワーキンググループによるレビューおよび修正の対象となります。

テストケースおよび実装レポートの提出に関する詳細情報は、 CSS ワーキンググループの Web サイト http://www.w3.org/Style/CSS/Test/ で確認できます。 質問は、public-css-testsuite@w3.org メーリング リストに送ってください。

CR 終了基準

この仕様が勧告案へ進むためには、 各機能について少なくとも 2 つの独立した相互運用可能な実装が 存在しなければなりません。各機能は異なる製品群によって実装されてもよく、 すべての機能が単一の製品によって実装される必要はありません。 この基準の目的のため、以下の用語を定義します:

独立
各実装は異なる主体によって開発されなければならず、 適格な別の実装で使用されているコードを共有、再利用、または 派生してはなりません。この仕様の実装に 関係しないコード部分は、 この要件の対象外です。
相互運用可能
公式 CSS テストスイート内の対応するテストケースに合格すること、 または実装が Web ブラウザーではない場合は、同等のテストに合格すること。このようなユーザー エージェント(UA)を相互運用性の主張に使用する場合、テスト スイート内の関連する各テストについて同等のテストを作成するべきです。さらに、 このような UA を相互運用性の主張に使用する場合、 相互運用性を示す目的で、その同等のテストに同じ方法で 合格できる追加の UA が 1 つ以上存在しなければなりません。 同等のテストは、ピアレビューの目的で 公開されなければなりません。
実装
次の条件を満たすユーザーエージェント:
  1. 仕様を実装している。
  2. 一般公開されている。実装は、 出荷製品またはその他の一般公開バージョン (すなわち、ベータ版、プレビューリリース、または「nightly build」)であってもかまいません。 出荷されていない製品リリースは、安定性を 実証するため、少なくとも 1 か月間 機能を実装していなければなりません。
  3. 実験的ではない(すなわち、テストスイートに合格するためだけに 特別に設計され、今後の通常利用を意図していない バージョンではない)。

この仕様は少なくとも 6 か月間、勧告候補のままとなります。

索引

この仕様で定義される 用語

参照によって定義される 用語

参考文献

規範的参考文献

[CSS-ALIGN-3]
Elika Etemad; Tab Atkins Jr.. CSS ボックス配置モジュール レベル 3. 2020年4月21日. WD. URL: https://www.w3.org/TR/css-align-3/
[CSS-BOX-4]
Elika Etemad. CSS ボックスモデルモジュール レベル 4. 2020年4月21日. WD. URL: https://www.w3.org/TR/css-box-4/
[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS カスケーディング と継承 レベル 5. 2021年1月19日. WD. URL: https://www.w3.org/TR/css-cascade-5/
[CSS-DISPLAY-3]
Tab Atkins Jr.; Elika Etemad. CSS Display モジュール レベル 3. 2020年12月18日. CR. URL: https://www.w3.org/TR/css-display-3/
[CSS-LOGICAL-1]
Rossen Atanassov; Elika Etemad. CSS 論理プロパティと 値 レベル 1. 2018年8月27日. WD. URL: https://www.w3.org/TR/css-logical-1/
[CSS-OVERFLOW-3]
David Baron; Elika Etemad; Florian Rivoal. CSS オーバーフロー モジュール レベル 3. 2020年6月3日. WD. URL: https://www.w3.org/TR/css-overflow-3/
[CSS-POSITION-3]
Elika Etemad; et al. CSS 配置レイアウトモジュール レベル 3. 2020年5月19日. WD. URL: https://www.w3.org/TR/css-position-3/
[CSS-PSEUDO-4]
Daniel Glazman; Elika Etemad; Alan Stearns. CSS 疑似要素モジュール レベル 4. 2020年12月31日. WD. URL: https://www.w3.org/TR/css-pseudo-4/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS 値と単位モジュール レベル 3. 2019年6月6日. CR. URL: https://www.w3.org/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS 値と単位モジュール レベル 4. 2020年11月11日. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS 書字モード レベル 4. 2019年7月30日. CR. URL: https://www.w3.org/TR/css-writing-modes-4/
[CSS2]
Bert Bos; et al. カスケーディングスタイルシート レベル 2 改訂 1(CSS 2.1) 仕様. 2011年6月7日. REC. URL: https://www.w3.org/TR/CSS21/
[CSSOM-VIEW-1]
Simon Pieters. CSSOM View モジュール. 2016年3月17日. WD. URL: https://www.w3.org/TR/cssom-view-1/
[HTML]
Anne van Kesteren; et al. HTML 標準. 現行標準. URL: https://html.spec.whatwg.org/multipage/
[RFC2119]
S. Bradner. 要求レベルを示すために RFC で使用する キーワード. 1997年3月. 現行のベストプラクティス. URL: https://tools.ietf.org/html/rfc2119
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. セレクター レベル 4. 2018年11月21日. WD. URL: https://www.w3.org/TR/selectors-4/

プロパティ索引

名前 初期値 適用対象 継承 % アニメーション型 正規順序 算出値
scroll-margin <length>{1,4} 0 すべての要素 しない 該当なし 算出値の型による 文法に従う 各辺について絶対長
scroll-margin-block <length>{1,2} 0 すべての要素 しない 該当なし 算出値の型による 文法に従う 個々のプロパティを参照
scroll-margin-block-end <length> 0 すべての要素 しない 該当なし 算出値の型による 文法に従う 絶対長
scroll-margin-block-start <length> 0 すべての要素 しない 該当なし 算出値の型による 文法に従う 絶対長
scroll-margin-bottom <length> 0 すべての要素 しない 該当なし 算出値の型による 文法に従う 絶対長
scroll-margin-inline <length>{1,2} 0 すべての要素 しない 該当なし 算出値の型による 文法に従う 個々のプロパティを参照
scroll-margin-inline-end <length> 0 すべての要素 しない 該当なし 算出値の型による 文法に従う 絶対長
scroll-margin-inline-start <length> 0 すべての要素 しない 該当なし 算出値の型による 文法に従う 絶対長
scroll-margin-left <length> 0 すべての要素 しない 該当なし 算出値の型による 文法に従う 絶対長
scroll-margin-right <length> 0 すべての要素 しない 該当なし 算出値の型による 文法に従う 絶対長
scroll-margin-top <length> 0 すべての要素 しない 該当なし 算出値の型による 文法に従う 絶対長
scroll-padding [ auto | <length-percentage> ]{1,4} auto スクロールコンテナー しない スクロールコンテナーのスクロールポートの対応する寸法に対する相対値 算出値の型による 文法に従う 各辺について、キーワード auto または算出された <length-percentage> 値
scroll-padding-block [ auto | <length-percentage> ]{1,2} auto スクロールコンテナー しない スクロールコンテナーのスクロールポートに対する相対値 算出値による 文法に従う 個々のプロパティを参照
scroll-padding-block-end auto | <length-percentage> auto スクロールコンテナー しない スクロールコンテナーのスクロールポートに対する相対値 算出値の型による 文法に従う キーワード auto または算出された <length-percentage> 値
scroll-padding-block-start auto | <length-percentage> auto スクロールコンテナー しない スクロールコンテナーのスクロールポートに対する相対値 算出値の型による 文法に従う キーワード auto または算出された <length-percentage> 値
scroll-padding-bottom auto | <length-percentage> auto スクロールコンテナー しない スクロールコンテナーのスクロールポートに対する相対値 算出値の型による 文法に従う キーワード auto または算出された <length-percentage> 値
scroll-padding-inline [ auto | <length-percentage> ]{1,2} auto スクロールコンテナー しない スクロールコンテナーのスクロールポートに対する相対値 算出値による 文法に従う 個々のプロパティを参照
scroll-padding-inline-end auto | <length-percentage> auto スクロールコンテナー しない スクロールコンテナーのスクロールポートに対する相対値 算出値の型による 文法に従う キーワード auto または算出された <length-percentage> 値
scroll-padding-inline-start auto | <length-percentage> auto スクロールコンテナー しない スクロールコンテナーのスクロールポートに対する相対値 算出値の型による 文法に従う キーワード auto または算出された <length-percentage> 値
scroll-padding-left auto | <length-percentage> auto スクロールコンテナー しない スクロールコンテナーのスクロールポートに対する相対値 算出値の型による 文法に従う キーワード auto または算出された <length-percentage> 値
scroll-padding-right auto | <length-percentage> auto スクロールコンテナー しない スクロールコンテナーのスクロールポートに対する相対値 算出値の型による 文法に従う キーワード auto または算出された <length-percentage> 値
scroll-padding-top auto | <length-percentage> auto スクロールコンテナー しない スクロールコンテナーのスクロールポートに対する相対値 算出値の型による 文法に従う キーワード auto または算出された <length-percentage> 値
scroll-snap-align [ none | start | end | center ]{1,2} none すべての要素 しない 該当なし 離散 文法に従う 2 つのキーワード
scroll-snap-stop normal | always normal すべての要素 しない 該当なし 離散 文法に従う 指定されたキーワード
scroll-snap-type none | [ x | y | block | inline | both ] [ mandatory | proximity ]? none すべての要素 しない 該当なし 離散 文法に従う 指定されたキーワード