1. 序論
◎非規範的~scroll可能な内容に対する UX ~paradigmでは、[ ~page割り†など,内容を論理的な何~節かに区分するもの ]に人気があり,多用されている。 これはとりわけ、 ~touchによる内容とのヤリトリに該当する — ~tap~naviを通して階層-構造を掘下げるより, 平坦に拡がるように配列された内容を~panする††方が、 利用者にとっては,容易かつ素早く操作oできるので。 例えば,写真~集の中の多数の写真を視るとき、 個々の写真を~tapするより, 写真の~slideshowを~panする方が利用者には容易になる。 ◎ Popular UX paradigms for scrollable content frequently employ paging through content, or sectioning into logical divisions. This is especially true for touch interactions where it is quicker and easier for users to quickly pan through a flatly-arranged breadth of content rather than delving into a hierarchical structure through tap navigation. For example, it is easier for a user to view many photos in a photo album by panning through a photo slideshow view rather than tapping on individual photos in an album.
【† この仕様を通して、 語 “~page” は印刷~媒体としての~pageではないことに注意。 】【†† “~pan” — 指先などで内容を直に “つかんで” ~scrollする~~操作。 】
しかしながら,[ ~touchによる~panning/~mousewheelによる~scrolling ]は、 その資質により,入力が不精確になる。 特に,内容の~page割り効果を[ きちんと制御された~scrolling体験を保証する ]ように作成することは、 ~web開発者にとって困難である。 利用者による~panningは、 半端な~scroll位置に着地し易く, ~~対象は~screen上で部分的になる。 ◎ However, given the imprecise nature of scrolling inputs like touch panning and mousewheel scrolling, it is difficult for web developers to guarantee a well-controlled scrolling experience, in particular creating the effect of paging through content. For instance, it is easy for a user to land at an awkward scroll position which leaves an item partially on-screen when panning.
これを~~達成するため、 この~moduleは,~scroll`留め位置$を導入する。 それは、[ ~scrollingの完了-時に,`~scroll容器$の`~scrollport$が終止してよい~scroll位置 ]を施行する。 ◎ To this end, this module introduces scroll snap positions which enforce the scroll positions that a scroll container’s scrollport may end at after a scrolling operation has completed.
加えて,留ngが~offのときでも[ ~paging/~scroll位置決め ]に対するより良い制御を提供するため、 この~moduleは, `scroll-padding$p ~propを定義する。 それは,どの`~scroll容器$にも利用でき、[ ~paging/~viewの中へ~scrollする ]操作oの目的で,`~scroll容器$の`最適な~view用~領域$を調整する。 同様に, `scroll-margin$p ~propを利用すれば、 どの~boxに対しても — ~viewの中へ~scrollする操作oの目的で — その視覚的な区画を調整できる。 ◎ Also, to offer better control over paging and scroll positioning even when snapping is off, this module defines the scroll-padding property for use on all scroll containers, to adjust the scroll container’s optimal viewing region for the purpose of paging and scroll-into-view operations. Similarly the scroll-margin property can be used on any box to adjust its visual area for the purpose of scroll-into-view operations.
1.1. ~module間の相互作用
この~moduleは、 `CSS2$r `§ ~overflow@~CSS22/visufx.html#overflow-clipping$ に定義される~scroll用の~UI特能を拡張する。 ◎ This module extends the scrolling user interface features defined in [CSS2] section 11.1.
この~moduleに定義される~propは、[ `first-line$pe / `first-letter$pe ]疑似要素には適用されない。 ◎ None of the properties in this module apply to the ::first-line and ::first-letter pseudo-elements.
1.2. 値~定義
【 この節の内容は、 `~CSS日本語訳 共通~page@~CSScommon#values$に移譲。 】
2. 動機にある例
次の例では、 写真~展示を築くため, `~scroll容器$内に一連の画像が配列されているとする。 この例の`~scroll容器$は、 その中の写真より(同時に複数の画像が見えるほどに)大きく, 画像~sizeもまちまちである。 `mandatory$v の下で要素に基づく留め位置を利用すれば、 ~scrollingは,画像が~scrollport内で常に中央寄せになるよう完了する。 ◎ In this example, a series of images arranged in a scroll container are used to build a photo gallery. In this example the scroll container is larger than the photos contained within (such that multiple images may be seen simultaneously), and the image sizes vary. Using mandatory element-based snap positions, scrolling will always complete with an image centered in the scroll container’s scrollport.
img { /* 各~写真の中心が X 軸において`~scroll容器$の中心に整列するよう,留ngを指定する。 ◎ Specifies that the center of each photo should align with the center of the scroll container in the X axis when snapping */ `scroll-snap-align$p: `none^v `center$v; } .photoGallery { width: 500px; `overflow-x$p: auto; `overflow-y$p: hidden; white-space: nowrap; /* ~scrollingの完了-時には,~scroll位置が常に留め位置に来るよう要求する。 ◎ Requires that the scroll position always be at a snap position when the scrolling operation completes. */ `scroll-snap-type$p: `x$v `mandatory$v; }
<div class="photoGallery"> <img src="img1.jpg"> <img src="img2.jpg"> <img src="img3.jpg"> <img src="img4.jpg"> <img src="img5.jpg"> </div>
次の例では、 文書の各 “~page” は,`~scroll容器$の辺に ある程度近い所に整列するよう~page割りされる。 これにより,前~pageが~~上端付近に “~~垣間見える” ようになり、 文書の~~先頭でないことが利用者に~~判るようになる。 `mandatory$v に代えて `proximity$v による留め位置を利用すれば、 利用者は,~pageの途中で停止することも可能になる(~pageごとに留めるよう強制するのでなく)。 その場合でも,~scrollingが留め位置~近くで終えられたときは、 ~scrollが調整され,~pageは指定されたとおりに整列するようになる。 ◎ This example builds a paginated document that aligns each page near to (but not exactly on) the edge of the scroll container. This allows the previous page to “peek” in from above in order to make the user aware that they are not yet at the top of the document. Using proximity snap positions instead of mandatory snap positions allows the user to stop halfway through a page (rather than forcing them to snap one page at a time). However, if a scrolling operation would finish near a snap position, then the scroll will be adjusted to align the page as specified.
.page { /* 各~pageの上端が留ngに利用されるべきよう定義する。 ◎ Defines the top of each page as the edge that should be used for snapping */ `scroll-snap-align$p: `start$v `none^v; } .docScroller { width: 500px; `overflow-x$p: hidden; `overflow-y$p: auto; /* 各~要素の留め区画を,上端~辺からの~offset `100px^v の所に整列するべきよう指定する。 ◎ Specifies that each element’s snap area should align with a 100px offset from the top edge. */ `scroll-padding$p: 100px 0 0; /* 留め位置に近い所で~scrollingが終えられたときは、 留め位置の所で完了するよう仕向ける。 ◎ Encourages scrolling to end at a snap position when the operation completes, if it is near a snap position */ `scroll-snap-type$p: `y$v `proximity$v; }
<div class="docScroller"> <div class="page">Page 1</div> <div class="page">Page 2</div> <div class="page">Page 3</div> <div class="page">Page 4</div> </div>
3. ~scroll留めの~model
この~moduleは、 ~scroll `留め位置@ 用の制御を定義する。 それは、 `~scroll容器$の中で,その内容を特定0の~scroll位置に整列させる。 作者は、[ `~scroll容器$に対し `scroll-snap-type$p ~propを利用する ]ことにより,[ ~scrollportが~scrollされ終えたとき, 近くにある`留め位置$に着地させる ]よう要請できる ( `scrollTo()$m ~methodによる,~program的な~scrollも含めて)。 ◎ This module defines controls for scroll snap positions, which are scroll positions that produce particular alignments of content within a scroll container. Using the scroll-snap-type property on the relevant scroll container, the author can request a particular bias for the scrollport to land on a snap position after scrolling operations (including programmatic scrolls such as the scrollTo() method).
`留め位置$は、[ `~scroll容器$ %容器 の`留域$ ]における,[ %容器 内の要素 %要素 の`~scroll留め区画$ ]に対する[ 特定0の整列-法 ]を通して指定される。 ここで:
- %容器 の`留域$は、 %容器 の`~scrollport$を %容器 の `scroll-padding$p だけ狭めて得られる矩形である。
- %要素 の`~scroll留め区画$は、 %要素 の`~border~box$を %要素 の `scroll-margin$p だけ拡げて得られる矩形であり, 既定では %要素 の`~border~box$になる。
- 整列-法は `scroll-snap-align$p により指定され、 前述の 2 つの矩形のどの位置を互いに整列するかを制御する。
これは、 概念的には,[ `整列~容器$の中における`整列~subject$の整列-法を指定すること ]と等価になる。 `留め位置$は、 指定された整列-法を満たすような~scroll位置になる。 ◎ This is conceptually equivalent to specifying the alignment of an alignment subject within an alignment container. A scroll position that satisfies the specified alignment is a snap position.
`~scroll容器$の`~scroll位置$を[ その`留域$【!~scrollport】と ある`留め区画$が整列する ]よう調整する動作は、 `留ng@ ( `snap^en / `snapping^en ) と呼ばれる。 `~scroll容器$は、 作動中な~scrollingは無いとき,各~軸において[ その`留域$【!~scrollport】に ある`留め区画$が整列される ]ならば、 その`留め区画$に`留められ$得る。 妥当な留め区画が複数あるときは、 `§ 整列される留め区画が複数ある場合の選定-法@#multiple-aligned-snap-areas$ に則って,各~軸~用に 1 つが選ばれる。 この~moduleは、 `留ng$【!`留め位置$】の施行-時に利用する精確な~animationその他の物理現象については, 何も指定しないし義務付けない — それは、 意図的に~UAに委ねられる。 ◎ The act of adjusting the scroll position of a scroll container’s scrollport such that it is aligned to a snap area is called snapping, and a scroll container may be snapped to a snap area in each axis if its scrollport is aligned with that snap area in that axis and there is no active scrolling operation. When there are multiple valid snap areas, a single one is chosen for each axis when snapping according to the algorithm for selecting between multiple aligned snap areas. The CSS Scroll Snap Module intentionally does not specify nor mandate any precise animations or physics used to enforce snap positions; this is left up to the user agent.
要素の`留め位置$が影響するものは、 要素の`包含塊~連鎖$において,要素に最も近い先祖の`~scroll容器$に限られる。 ◎ Snap positions only affect the nearest ancestor scroll container on the element’s containing block chain.
4. ~scroll留め区画の捕捉-法: ~scroll容器の各種~prop
4.1. ~scroll留ngの規則: `scroll-snap-type^p ~prop
◎名 `scroll-snap-type@p ◎値 `none$v | [ `x$v | `y$v | `block$v | `inline$v | `both$v ] [ `mandatory$v | `proximity$v ]? ◎初 `none$v ◎適 すべての要素 ◎継 されない ◎百 受容しない ◎算 指定された~keyword(たち) ◎順 文法に従う ◎ア 離散的 ◎表終`scroll-snap-type$p ~propは、 `~scroll容器$は`~scroll留め容器$になるかどうか, および[ そうであれば、 どの軸が考慮され,どの~~程度~厳密に`留められ$るべきか ]を指定する。 `厳密度~値$は、 指定されていない場合は `proximity$v と見做される。 ◎ The scroll-snap-type property specifies whether a scroll container is a scroll snap container, how strictly it snaps, and which axes are considered. If no strictness value is specified, proximity is assumed.
この例では、 見出しへの留ngが,`塊-軸$(横組みでは y 軸, 縦組みでは x 軸)~~方向に可能化されている: ◎ In this example, snapping to headings is enabled in the block axis (the y axis for horizontal writing, x axis for vertical writing):
html { scroll-snap-type: block; /* 文書~全体の~scroll域に適用される ◎ applied to main document scroller */ } h1, h2, h3, h4, h5, h6 { scroll-snap-align: start; /* 表示域の始端(上端)に留める ◎ snap to the start (top) of the viewport */ }
~UAは、 `根~要素$に設定された `scroll-snap-type$p 値を文書~表示域に適用するモノトスル。 ( `overflow$p と違って、 `scroll-snap-type^p 値は,~HTML `body$e 要素からは`伝播しない^emことに注意。) ◎ UAs must apply the scroll-snap-type value set on the root element to the document viewport. Note that, unlike overflow, scroll-snap-type values are not propagated from HTML body.
4.1.1. ~scroll留め軸: `x^v, `y^v, `block^v, `inline^v, `both^v 値
以下に定義される各種 `軸~値@ は、[ `~scroll容器$ %容器 内の各~要素が~~供する`留め位置$ %位置 ]は,[ 各~軸ごとに独立に評価されるのか, あるいは 二次元の点として両~軸とも一緒に評価されるのか ], および[ 前者の場合, %位置 は どの軸~~方向の`留め$に影響するか ]を指定する: ◎ The axis values specify what axis(es) are affected by snap positions, and whether snap positions are evaluated independently per axis, or together as a 2D point. Values are defined as follows:
- `x@v, `y@v, `block@v, `inline@v
- 順に: %容器 は、 その[ 横~軸, 縦~軸, `塊-軸$, `行内-軸$ ]~~方向に限り, %位置 に`留める$。 ◎ The scroll container snaps to snap positions in its horizontal axis only. ◎ The scroll container snaps to snap positions in its vertical axis only. ◎ The scroll container snaps to snap positions in its block axis only. ◎ The scroll container snaps to snap positions in its inline axis only.
- `both@v
- %容器 は、 その両~軸~~方向において,軸ごとに独立に %位置 に`留める$。 (したがって、 軸ごとに異なる要素に`留められ$得る。) ◎ The scroll container snaps to snap positions in both of its axes independently (potentially snapping to different elements in each axis).
4.1.2. ~scroll留めの厳密度: `none^v, `proximity^v, `mandatory^v 値
以下に定義される各種 `厳密度~値@ は、 `~scroll容器$に対し,`留め位置$がどの~~程度~厳密に (~scroll位置の調整を強制することにより) 施行されるかを指定する: ◎ The strictness values (none, proximity, mandatory) specify how strictly snap positions are enforced on the scroll container (by forcing an adjustment to the scroll position). Values are defined as follows:
- `none@v
- この値が指定された`~scroll容器$は、 `留められ$ないモノトスル。 ◎ If specified on a scroll container, the scroll container must not snap.
- `mandatory@v
- 【“~~義務的”】
- この値が指定された`~scroll容器$は、[ ~scrollingが作動中でない間,および作動中な~scrollが終了したとき ]は、 妥当な`留め位置$が存在するならば,`留められ$るモノトスル (留め位置が存在しなければ,`留ng$も生じない)。 ◎ If specified on a scroll container, the scroll container is required to be snapped to a snap position when there are no active scrolling operations. If a valid snap position exists then the scroll container must snap at the termination of a scroll (if none exist then no snapping occurs).
- `proximity@v
- 【“~~近接的”】
- この値が指定された`~scroll容器$に対しては、 ~UAは — 所与の~scroll~parameterに基づいて,自身の裁量で — ~scrollの終了-時に`留め位置$に`留めて$ヨイ。 ◎ If specified on a scroll container, the scroll container may snap to a snap position at the termination of a scroll, at the discretion of the UA given the parameters of the scroll.
作者は、 留め位置に `mandatory$v を利用するときは,多様な[ ~screen~sizeや, 場合によっては内容~size ]を考慮するべきである。 [ 留められている, かつ`~scrollport$より大きい要素 ]への~accessは,~UAにより取扱われるが、 特に,同じ`~scrollport$内に 留め位置を[ ~~供する内容, ~~供さない内容 ]が混在する場合、 後者の内容は,~screenに比して長いときに~access不能になり得る。 ◎ Authors should use mandatory snap positions with consideration of varyingly-sized screens and (if applicable) varying-sized content. In particular, although access to snapped elements larger than the scrollport is handled by the UA, if authors assign mandatory snapping to non-adjacent siblings, content in between can become inaccessible in cases where it is longer than the screen.
所与の~boxが `留め位置を捕捉する@ とは、 次を満たすことをいう ⇒ [ `~scroll容器$である ]`~OR^em[ その `scroll-snap-type$p は `none$v 以外の値をとる ] ◎ A box captures snap positions if it is a scroll container or has a value other than none for scroll-snap-type.\
所与の~box %~box の `~scroll留め容器@ は、 ~AND↓ を満たすものは[ 在るならば それ/ 無いならば 無い ]とする:
- 次を満たす[ %~box の先祖 ]のうち %~box に最も近いものである ⇒ [ `留め位置を捕捉する$ ]~AND[ %~box の`包含塊~連鎖$を成す【ある包含塊を確立している】 ]
- [ `~scroll容器$である ]`~AND^em[ その `scroll-snap-type$p は `none$v 以外の値をとる ]
%~box の`~scroll留め容器$は無い場合、 %~box の`留め位置$は,`留ng$を誘発しないことになる。 ◎ and its snap positions do not trigger snapping.
4.1.3. ~layout変化-後の留直し
文書の内容または~layoutが変化して (例:内容が[ 追加-/移動-/削除-/~resize ]された), `留域$の内容が変化した場合、 ~UAは,[ 結果の`~scroll位置$を評価し直して,留直す ]モノトスル。 内容が変化する前に`留められ$ていた`留め区画$たち【すべて】が,変化した後も存在する場合 (例:それらを与えていた要素たちは削除されていない)、 `~scroll容器$を同じ留め区画へ留直すモノトスル。 各~軸において,どの`留め区画$へ`留められ$るかは、 `§ 整列される留め区画が複数ある場合の選定-法@#multiple-aligned-snap-areas$ に従う。 両~軸とも【同時に】留めることはアリでない場合 (例:一方の留め区画に留めると他方は~screenから外れる場合)、 次に挙げる順に選好するモノトスル ⇒# ~focusされた~box, ~targetにされた~box【 `target$ps など】, `塊-軸$用に選定された~box ◎ If the content or layout of the document changes (e.g. content is added, moved, deleted, resized) such that the content of a snapport changes, the UA must re-evaluate the resulting scroll position, and re-snap if required. If the scroll container was snapped before the content change and those same snap areas still exist (e.g. their associated elements were not deleted), the scroll container must be re-snapped to those same snap areas after the content change. A snap area can be snapped in each axis, following the algorithm for selecting between multiple aligned snap areas. If it is not possible to snap to both (e.g. if snapping to one resulted in the other being offscreen), it must prefer the focused box, followed by the targeted box, followed by the block axis if neither box is focused or targeted.
それまでと異なる(または新たな)~boxへ留直す操作oにより要求される~scrollingは、 他の[ ~viewの中へ~scrollする操作o† ]と同じ仕方で[ 挙動する, かつ~animateする† ]モノトスル — `scroll-behavior$p などの制御を尊守することも含め。 しかしながら,以前と同じ~boxに留直すときに~scrollする挙動は、 ~UAにより定義される。 ~UAは、 例えば,ある~sectionの始端に留められたとき、[ 文書~内の そこより前に内容が動的に追加されるに伴い,~sectionの新たな位置へ~scrollすること ]を[ ~scrollしていないかのように見せるために,~animateしない ]ことを選んでもヨイ。 ◎ Scrolling required by a re-snap operation to a new or different box must behave and animate the same way as any other scroll-into-view operation, including honoring controls such as scroll-behavior. Scrolling behavior for re-snapping to the same box as before however, is UA-defined. The UA may, for example, when snapped to the start of a section, choose not to animate the scroll to the section’s new position as content is dynamically added earlier in the document in order to create the illusion of not scrolling.
【† おそらく,順に[ `~viewの中へ~scrollする$こと, `滑らかに~scrollする$ときのそれ ]を指していると見受けられる(該当するものは他にもあるかもしれないが)。 】
次の例における~log~console( `.log^css )は、[ 初期~時に読込まれたとき, および~messageたちが下端に追加される ]に伴い,内容の下端へ留められ続ける — 利用者が~scrollして,その下端~辺から離れない限り: ◎ In the following example, the log console, when initially loaded and as each message is added to the bottom, remains snapped to the bottom of the content unless the user has scrolled away from that edge:
.log { scroll-snap-type: y proximity; align-content: end; } .log::after { display: block; content: ""; scroll-snap-align: end; }
上の規則は、 単独の`~scroll留め区画$ %区画 を作成する — それは、 `after$pe 疑似要素で表現され, `~scroll留め容器$の下端に位置される。 利用者が下端 “近く” へ~scrollした場合、 容器は, %区画 へ留められることになる。 容器に他の内容が動的に追加されても、 %区画 は留められ続けることになる (~scroll容器は、 何かかが変化した後もまだ存在するならば, 同じ~scroll留め区画に留直すことが要求されるので)。 しかしながら,利用者が~log内のどこか他へ~scrollした場合には、 何もしない。 ◎ The rules create a single scroll snap area represented by the ::after pseudo-element, positioned at the very bottom of a scroll snap container. If the user scrolls “near” the bottom, the container will snap to it. If more content is dynamically added to the container, it’ll remain snapped to it (because scroll containers are required to re-snap to the same scroll snap area if it still exists after any changes). However, if the user has scrolled to somewhere else in the logs, it won’t do anything at all.
4.2. ~scroll留域: `scroll-padding^p ~prop
◎名 `scroll-padding@p ◎値 [ `auto$v | `length-percentage [0,∞]$vt ]{1,4} ◎初 `auto^v ◎適 `~scroll容器$ ◎継 されない ◎百 `~scrollport$の対応する次元に相対的 ◎ relative to the corresponding dimension of the scroll container’s scrollport ◎算 各~側ごとに,[ ~keyword `auto^v / `length-percentage$t の算出d値 ] ◎ per side, either the keyword auto or a computed <length-percentage> value ◎順 文法に従う ◎ア 算出d値の型による ◎表終この~propは、 ~scrollportを成す `最適な~view用~領域@ を定義する~offsetを指定する(`~scroll留め容器$のみならず,すべての`~scroll容器$用に) — その領域は、 利用者の~viewにモノを配置する領域として利用される。 これにより,作者は、 `~scrollport$内の[ 他の内容(`固定的に位置され$た~toolbarや~sidebarなど)に遮られる領域 ]を除外したり, 単純に[ 当の要素と~scrollportの各~辺との合間に余白をとる ]ことが可能になる。 ◎ This property specifies (for all scroll containers, not just scroll snap containers) offsets that define the optimal viewing region of a scrollport: the region used as the target region for placing things in view of the user. This allows the author to exclude regions of the scrollport that are obscured by other content (such as fixed-positioned toolbars or sidebars) or simply to put more breathing room between a targeted element and the edges of the scrollport.
`scroll-padding$p ~propは、 すべての `scroll-padding-*^p 下位propを 一つの宣言でまとめて設定する`略式~prop$であり, 各~側を表現している値をその各 下位propにアテガう — `padding$p ~propがその各 下位propに値をアテガうときとちょうど同じように。 各種~値の意味は: ◎ The scroll-padding property is a shorthand property that sets all of the scroll-padding-* longhands in one declaration, assigning values to the longhands representing each side exactly as the padding property does for its longhands. Values have the following meanings:
- `length-percentage [0,∞]$t
- `~scrollport$の対応する辺から内方への~offsetを定義する。 根~表示域に適用されるときは、 ~offsetは,(可視域ではなく)~layout表示域に相対的に — `固定的に位置され$た~boxの対応する`~inset~prop$と同じ仕方で — 計算された上で適用される。 `最適な~view用~領域$は、 その結果と可視域が交差する区画になる。 【~layout表示域は、~scrollして見出せるもの全体を囲う区画と考えればよいであろう(一般に,可視域より広くなる)。】 ◎ Defines an inward offset from the corresponding edge of the scrollport. When applied to the root viewport, the offset is calculated and applied relative to the layout viewport (rather than the visual viewport) the same way as the corresponding inset properties on fixed-positioned boxes; the optimal viewing region is the remaining area that intersects with the visual viewport.
- `auto@v
- `~scrollport$の対応する辺からの~offsetは、 ~UAが決定することを指示する。 これに対する使用~長さは,一般に既定で `0px^v になるべきであるが、 ~UAは, 0 以外の値の方が適切になるときは,それを検出する経験則を利用してヨイ。 ◎ Indicates that the offset for the corresponding edge of the scrollport is UA-determined. This should generally default to a used length of 0px, but UAs may use heuristics to detect when a non-zero value is more appropriate.
- 例えば~UAは、[ `固定的に位置され$た【!position:fixed】要素が不透明な~scroll不能な “頭部見出し” として利用されていて, それが下にある内容を遮っていることを検出した ]ときは、 上端~offsetを,その要素の縦幅に解決することもできる — “~pageをめくる” 操作o ( PgDn キーを押下げたときなど)が, 内容の “可視な 1 ~page” 分だけ自動的に~scrollするように。 ◎ For example, a UA could detect when a position:fixed element is being used as an opaque unscrollable “header” that obscures the content below it, and resolve the top offset to the height of that element so that a “page down” operation (such as pressing PgDn) automatically scrolls by one “visible page” of content.
これらの~offsetは、 `~scrollingにおいて^em[ `~scrollport$を成す “利用者から見える” と見なされる領域 ]を~offsetして抑制する。 その効果は、[ ~layout / ~scroll原点 / 初期~位置 / 要素が実際に`可視^emと見なされるかどうか ]には及ばないが、 次には影響して,[ `~scrollport$の`最適な~view用~領域$の中では、 利用者は,内容を途切れなく見れる ]ようになるべきである:
- [ 要素 /~caret ]は,~viewの中へ~scrollされると見なされるかどうか (例:[ ~targetにする/~focusする ]操作o用に)
- ~paging ( PageDown / PageUp ~UIkey, あるいは ~scrollbarから等価な操作oを誘発することによる,それ) に対する~scroll量を抑制するかどうか。
当の`~scroll容器$が`留め容器$でもある場合、 この領域は,その `留域@ も定義する。 それは、 当の容器の`~scrollport$内の区画であり, `留め位置$を計算するときに`~scroll留め区画$用の`整列~容器$として利用される。 ◎ For a scroll snap container this region also defines the scroll snapport—the area of the scrollport that is used as the alignment container for the scroll snap areas when calculating snap positions.
`scroll-padding$p を利用して、 ~slideshow画像を,[ `~scrollport$内の,固定的に位置された `.toolbar^css で遮られていない部分 ]の中央に据える例: ◎ In this example, scroll-padding is used to center slideshow images within the portion of the scrollport that is not obscured by a fixed-position toolbar.
html { `overflow-x$p: auto; `overflow-y$p: hidden; `scroll-snap-type$p: `x$v `mandatory$v; `scroll-padding$p: 0 500px 0 0; } .toolbar { position: fixed; height: 100%; width: 500px; right: 0; } img { `scroll-snap-align$p: none `center$v; }
~UAは、 `根~要素$に設定された `scroll-padding$p 値を文書~表示域に適用するモノトスル。 ( `overflow$p と違って, `scroll-padding^p 値は、 ~HTML `body$e 要素からは`伝播しない^emことに注意。) ◎ UAs must apply the scroll-padding values set on the root element to the document viewport. (Note that, unlike overflow, scroll-padding values are not propagated from HTML body.)
5. ~scroll留め区画の整列-法: 要素の各種~prop
5.1. ~scroll留め区画: `scroll-margin^p ~prop
◎名 `scroll-margin@p ◎値 `length$t{1,4} ◎初 `0^v ◎適 すべての要素 ◎継 されない ◎百 受容しない ◎算 各~側ごとに,絶対~長さ ◎ per side, an absolute length ◎順 文法に従う ◎ア 算出d値の型による ◎表終この~propは、 すべての `scroll-margin-*^p 下位propを 一つの宣言でまとめて設定する`略式~prop$であり, 各~側を表現している値をその各 下位propにアテガう — `margin$p ~propがその各 下位propにアテガうときとちょうど同じように。 ◎ This property is a shorthand property that sets all of the scroll-margin-* longhands in one declaration, assigning values to the longhands representing each side exactly as the margin property does for its longhands.
値を成す各~長さは、 外方への~offsetを表現する。 それらは、 当の要素の `~scroll留め区画@ — 当の要素を`留域$に`留める$ときに利用される~box — を定義する。 `~scroll留め区画$は、[ 変形された`~border~box$†から (`~scroll容器$の座標~空間に軸が整列された)矩形な限界~boxを見出した結果 ]に[ 指定された外方への~offset ]たちを加算する††ことにより,決定される。 ◎ Values represent outsets defining the scroll snap area that is used for snapping this box to the snapport. The scroll snap area is determined by taking the transformed border box, finding its rectangular bounding box (axis-aligned in the scroll container’s coordinate space), then adding the specified outsets.
【† 当の要素の~border~boxに `transform$p などによる変形を(適用-可能ならば)適用した結果。 】【†† 負な値を与えた場合、 内方へ~offsetされることになる。 】
注記: これは、 `~scroll留め区画$が常に矩形になり, その軸は`~scroll容器$の座標~空間に整列されることを確保する。 ◎ Note: This ensures that the scroll snap area is always rectangular and axis-aligned to the scroll container’s coordinate space.
~UAは、[ ~target要素を定義する素片 ( `target$ps に合致するもの/ `scrollIntoView()$m の~targetになるもの) へ~pageが~navigateされた ]ときに[ `~scroll可能な~overflow区画$を成す どの区画を~viewの中へ持込むか決定する ]ときには,当の要素の[ `~border~box$ではなく,`~scroll留め区画$ ]を利用するべきである — 当の要素に対し`留ngが[~offにされた/適用されない]ときでも^em。 ◎ If a page is navigated to a fragment that defines a target element (one that would be matched by :target, or the target of scrollIntoView()), the UA should use the element’s scroll snap area, rather than just its border box, to determine which area of the scrollable overflow area to bring into view, even when snapping is off or not applied on this element.
5.2. ~scroll留ngの整列-法: `scroll-snap-align^p ~prop
◎名 `scroll-snap-align@p ◎値 [ `none$v | `start$v | `end$v | `center$v ]{1,2} ◎初 `none$v ◎適 すべての要素 ◎継 されない ◎百 受容しない ◎算 2 個の~keyword ◎順 文法に従う ◎ア 離散的 ◎表終`scroll-snap-align$p ~propは、 要素が生成する~box %~box の`留め位置$を,各~軸ごとに[ %容器 の中における %~subject の整列-法 ]として指定する — ここで:
- %容器 は、 `整列~容器$としての[ %~box の`留め容器$の`留域$ ]である
- %~subject は、 `整列~subject$としての[ %~box の`留め区画$ ]である
2 個の値は、 順に,留ngにおける[ `塊-軸$, `行内-軸$ ]~~方向の整列を指定する — これらの軸は、 %~box の`留め容器$の`書字~mode$により決定される。 値が 1 個だけ指定された場合、 その値が 2 個目の値も与える。
◎ The scroll-snap-align property specifies the box’s snap position as an alignment of its snap area (as the alignment subject) within its snap container’s snapport (as the alignment container). The two values specify the snapping alignment in the block axis and inline axis, respectively, as determined by the snap container’s writing mode. If only one value is specified, the second value defaults to the same value.%~box の`留め位置$は、 値に応じて,[ 対応する軸において, %~subject, %容器 を次のように整列させる位置 ]として定義される: ◎ Values are defined as follows:
- `none@v
- `留め位置$は定義されず, %~subject, %容器 は互いに整列されない。 ◎ This box does not define a snap position in the specified axis.
- `start@v
- %~subject, %容器 の始端どうしを整列させる。 ◎ Start alignment of this box’s scroll snap area within the scroll container’s snapport is a snap position in the specified axis.
- `end@v
- %~subject, %容器 の終端どうしを整列させる。 ◎ End alignment of this box’s scroll snap area within the scroll container’s snapport is a snap position in the specified axis.
- `center@v
- %~subject, %容器 の中央どうしを整列させる。 ◎ Center alignment of this box’s scroll snap area within the scroll container’s snapport is a snap position in the specified axis.
[ 始端/終端 ]どうしの整列は、 %~box の`留め容器$の`書字~mode$に基づいて解決される — ただし, %~subject が %容器 より大きい事例では、 %~box の`書字~mode$に基づいて解決される (これは、[ 容器~内の~subjectたち【!items】の留め整列が,一般には一貫する ]ことを許容しつつ,[ `start$v は,常に[ %~box の内容を始めから読める ]ように %~subject 【!the item】を整列する ]ことを確保する。) ◎ Start and end alignments are resolved with respect to the writing mode of the snap container unless the scroll snap area is larger than the snapport, in which case they are resolved with respect to the writing mode of the box itself. (This allows items in a container to have consistent snap alignment in general, while ensuring that start always aligns the item to allow reading its contents from the beginning.)
5.2.1. 妥当な留め位置を可視な~boxに~~絞る
~scrollを留める目的は,[ `~scrollport$の中で最適に見えるよう,内容を整列する ]ことなので、[ 留めたときに`留め区画$全体が`留域$の外側に出る ]ような留め位置は — `留域$に要求される整列を満たすことになるとしても — 妥当とは見なされない。 ◎ Since the purpose of scroll snapping is to align content within the scrollport for optimal viewing, a scroll position cannot be considered a valid snap position if snapping to it would leave the contributing snap area entirely outside the snapport, even if it otherwise satisfies the required alignment of the snap area.
`留め区画$は、 例えば[ その上端~辺が`留域$の上端~辺に符合する ]ならば,`留域$にて上端が整列される。 これは、 `留め区画$が一部でも~screenに入るならば,[ 【横組みにおいては】`塊-軸$の始端に整列される留ng ]用の妥当な留め位置と見なされる。 しかしながら,`留め区画$全体が`留域$の外側に出る場合、 当の`~scroll容器$は,そこへ留められるものとは見なせない — 要求される整列が満たされようが,視者には関連しないので。 ◎ For example, a snap area is top-aligned to the snapport if its top edge is coincident with the snapport’s top edge; and this would be considered a valid snap position for block-axis start-aligned snapping of that snap area if at least part of the snap area is on-screen. If the entire snap area is outside the snapport, however, then the scroll container cannot be considered to be snapped because the required alignment, though satisfied, would not be relevant to the viewer.
なぜ、 留ngを[ 可視な要素に限る ]よう制限するのか? ◎ Why limit snapping to only when the element is visible?
`WebKit の実装者たちが指摘した@https://www.webkit.org/blog/4017/scroll-snapping-with-css-snap-points/$ように、 留め辺を~canvasを超えて無限に延長すると,[ 【そのような辺たちが成す】格子~化された~layoutの留ng ]しか許容されなくなり、[ ~screenから外れた要素が,~screen上の要素と整列しないとき ]に,利用者にとって不可解な挙動になる (しかしながら,この要件が実装者にとって荷が重い場合には、 格子~化された挙動を既定として,より賢い挙動を得るような~switchが後で導入され得る。) ◎ As the WebKit implementers point out, extending a snap edge infinitely across the canvas only allows for snapping gridded layouts, and produces odd behavior for the user when off-screen elements do not align with on-screen elements. (If this requirement is onerous for implementers however, we can default to a gridded behavior and introduce a switch to get smarter behavior later.)
注記: `scroll-snap-type$p は,`留め位置$を各~軸ごとに独立に評価するが、 一方の軸における`留め位置$は,他方の軸における`留め位置$の`選び方@#choosing$に波及する。 例えば,ある軸から先に`留め位置$を選んで整列するとき、 他方の軸における`留め位置$は,`留め区画$を~screenの外へ押し出すため無効になる — したがって選べなくなる — こともある。 ◎ Note: Although scroll-snap-type: both evaluates snap positions independently in each axis, choosing of a snap position in one axis can be influenced by snap positions in the other axis. For example, snapping in one axis may push off-screen the snap area that the other axis would otherwise align to, making its snap position invalid and therefore unchooseable.
5.2.2. ~scrollportを~overflowする~boxの留ng
`留め区画$ %区画 が特定0の軸 %軸 において`留域$ %留域 より大きい場合、 ~AND↓ を満たす~scroll位置が, %軸 において妥当な`留め位置$になる:
- 【そこへ~scrollしたとき、 %軸 において,】 %区画 は %留域 を覆う
- %軸 において幾何的に[ 直前/直後 ]にある`留め位置$ — この定義~以外に関しては妥当なそれ — までの距離は、 %軸 における %留域 の~sizeより大きい
~UAは、 ある種の~scroll操作o(例: 明示的な~paging)に際しては, それに指定された整列を より精確な~targetとして利用してヨイ。 ◎ The UA may use the specified alignment as a more precise target for certain scroll operations (e.g. explicit paging).
例えば、 それぞれが留め区画を成す何枚かの写真があって, どの留め区画も `mandatory$v に留めるものとされた場合 ( `§ 2@#examples$ の最初の例)、 写真が`~scrollport$より大きい場合でも,写真の隅々まで見れるように~scroll可能になることが求まれよう。 ◎ For example, take the first example in § 2 Motivating Examples, which had a photo as the area. The author wants mandatory snapping from item to item, but if the item happens to be larger than your viewport, you want to be able to scroll around the whole thing once you’re over it.
`留域$より広い`留め区画$が,`~scrollport$を全部的に埋めている間は、 容器は任意に~scrollでき,最初に整列された位置へ戻すよう留めようとはしない。 一方で,全部的に埋めなくなる所まで容器が~scrollされたときは、 その区画は — 異なる`留め位置$への留ngを誘発するに足るほど~scrollされるまでは — 外方への~scrollingに抵抗する。 ◎ Since the snap area is larger than the snapport, while the area fully fills the viewport, the container can be scrolled arbitrarily and will not try to snap back to its aligned position. However, if the container is scrolled such that the area no longer fully fills the viewport in an axis, the area resists outward scrolling until it is scrolled sufficiently to trigger snapping to a different snap position.
別の例として、 入子な `section$e 要素たちにより[ (上位~sectionを成す)大きい留め区画が(下位~sectionを成す)小さい留め区画で埋められる ]こともある。 ここでは、 どの~sectionも[ `mandatory$v かつ, 上端( `start$v )に留める ]ようにされていたとする。 十分~短い下位~sectionの中では,通常に留められる一方で、 より長い下位~sectionや[ 上位~section内の下位~sectionを含まない広い区間 ]の中では,視者は任意に~scrollできる: ◎ For another example, mandatory top-snapping on nested section elements can produce large snapping areas (from large top-level sections) potentially filled with smaller snapping areas (from the subsections). When the subsections are small enough, they snap normally; when they’re longer, the viewer can scroll arbitrarily within them, or within a large segment of the top-level section that has no subsections to snap to.
注記: 作者が — ~section自身に代えて — ~sectionの`見出し^emに `mandatory$v 留め位置を設定した場合、 1 番, 5 番の~sectionを成す内容の一部は,利用者から~accessできなくなる — 見出し留め区画は、 ~section全体を覆うまで拡張されないので。 そのようなわけで、 互いの~~間隔が広い要素たちの留め位置に `mandatory$v を利用するのは,不良な案になる。 ◎ Note: If the author had instead set mandatory snap positions on the headings of each section (rather than the sections themselves), the contents of the first and fifth sections would be partially inaccessible to the user, as the heading snap area does not extend to cover the whole section. This is why it’s a bad idea to use mandatory snap positions on elements that might be widely spaced apart.
5.2.3. 到達-不能な留め位置
指定された`留め位置$に到達-不能な場合 — すなわち、 そこへ整列させるためには,[ `~scrollport$において`~scroll可能な~overflow区画$の辺を過ぎる所まで~scrollする ]ことが要求される場合 — この`留め区画$に対する各~軸における `使用^em `留め位置$は、[ 当の軸~~方向に欲される`留め位置$へ向けて,`アリな限り^em~scrollした結果 ]の位置になる。 ◎ If a snap position is unreachable as specified, such that aligning to it would require scrolling the scroll container’s viewport past the edge of its scrollable overflow area, the used snap position for this snap area is the position resulting from scrolling as much as possible in each relevant axis toward the desired snap position.
5.3. ~scroll留めに対する制限s: `scroll-snap-stop^p ~prop
◎名 `scroll-snap-stop@p ◎値 `normal$v | `always$v ◎初 `normal$v ◎適 すべての要素 ◎継 されない ◎百 受容しない ◎算 指定された~keyword ◎順 文法に従う ◎ア 離散的 ◎表終ある意図された方向へ~scrollするとき、 `~scroll容器$は,[ `自然な終止-点$に到達して最終的な`~scroll位置$を選定する前 ]に いくつかのアリな`留め位置$ (同じ方向へ~scrollする距離がより短い場合に,留めるに妥当な位置) を “通過-” し得る。 `scroll-snap-stop$p ~propは、 そのようなアリな`留め位置$が~scrollingを “捉えて”,[ それが自然に終止する前に`~scroll容器$を停止する ]よう強制することを許容する。 ◎ When scrolling with an intended direction, the scroll container can “pass over” several possible snap positions (that would be valid to snap to, if the scrolling operation used the same direction but a lesser distance) before reaching the natural endpoint of the scroll operation and selecting its final scroll position. The scroll-snap-stop property allows such a possible snap position to “trap” the scrolling operation, forcing the scroll container to stop before the scrolling operation would naturally end.
各種 値の定義は: ◎ Values are defined as follows:
- `normal@v
- `~scroll容器$は、 ~scrollingを実行する間, この要素により定義される`留め位置$を通過してもヨイ。 ◎ The scroll container may pass over a snap position defined by this element during the execution of a scrolling operation.
- `always@v
- `~scroll容器$は、 ~scrollingを実行する間, この要素により定義される`留め位置$を通過しないモノトスル — そのような要素たちの`留め位置$のうち,最初に~~遭遇した所で留めるモノトスル。 ◎ The scroll container must not pass over a snap position defined by this element during the execution of a scrolling operation; it must instead snap to the first of this element’s snap positions.
この~propは、 `終止-位置のみ意図され$ている~scrollingには効果がない — それは、 概念的に`留め位置$を “通過しない” ので。 ◎ This property has no effect on scrolling operations with only an intended end position, as they do not conceptually “pass over” any snap positions.
6. 留ngの仕組み
留める際に`留め位置$を選定する~modelを成す精確な~algoは、 意図的に,ほぼ未定義である — ~UAは、[ 利用者の意図n, 利用者-ヤリトリ ]が成す~modelを[ 利用者に最善に仕える ]ように洗練して,[ 時間~越しにどう応答するか ]を調整できる。 ◎ The precise model algorithm to select a snap position to snap to is intentionally left mostly undefined, so that user agents can take into account sophisticated models of user intention and interaction and adjust how they respond over time, to best serve the user.
この節では、[ ~scroll留ngの機構について論じる ]ため, および[ 効果的な~scroll留ng策は どの様なものになるかについて,いくつかの指針を供する ]ために有用になる概念を,いくつか定義する。 ~UAには、 この指導に順応するように,[ 自身による最善な判定を適用しつつ,留ngにおける自前の挙動を定義する ]ことが奨励される。 それはまた、 作者が[ ~scroll留ngを念頭に,自身の~UIを設計する ]ときに依存できるような,[ 最低限の適度な挙動を確保するための,少数の要件 ]も供する。 ◎ This section defines some useful concepts to aid in discussing scroll-snapping mechanics, and provides some guidelines for what an effective scroll-snapping strategy might look like. User agents are encouraged to adapt this guidance and apply their own best judgement when defining their own snapping behavior. It also provides a small number of behavior requirements, to ensure a minimum reasonable behavior that authors can depend on when designing their interfaces with scroll-snapping in mind.
6.1. ~scrolling~methodの種別
~pageの~scroll動作は、 意図された[ 終止-位置 / 方向 ]の下で遂行される。 ~scrollingは、 この 2 つの組合nに応じて,次に挙げるものに類別される — それぞれが,少しばかり異なる扱いになるような: ◎ When a page is scrolled, the action is performed with an intended end position and/or an intended direction. Each combination of these two things defines a distinct category of scrolling, which can be treated slightly differently:
- `終止-位置のみ意図され@ る~scroll ◎ intended end position
-
`終止-位置のみ意図され$る~scrollに共通的な例としては、 次が挙げられる: ◎ Common examples of scrolls with only an intended end position include:
- 勢いを伴わずに放された,~panning~gesture ◎ a panning gesture, released without momentum
- ~scrollbarの “つまみ” を明示的に操作するとき ◎ manipulating the scrollbar “thumb” explicitly
- `scrollTo()$m などの API を介して~program的に~scrollするとき ◎ programmatically scrolling via APIs such as scrollTo()
- 文書の~focus可能な要素を,~tabbing-throughするとき ◎ tabbing through the document’s focusable elements
- ~page内のある~anchorへ~navigateするとき ◎ navigating to an anchor within the page
- ~homing操作o — Home / End ~UIkeyなどによる ◎ homing operations such as the Home/End keys
- `方向, 終止-位置ともに意図され@ る~scroll ◎ intended direction and end position
-
`方向, 終止-位置ともに意図され$る~scrollに共通的な例としては、 次が挙げられる: ◎ Common examples of scrolls with both an intended direction and end position include:
- 勢いを伴う “投げつけ( `fling^en )” ~gestureに解釈されるもの ◎ a “fling” gesture, interpreted with momentum
- `scrollBy()$m などの API を介して~program的に~scrollするとき ◎ programmatically scrolling via APIs such as scrollBy()
- ~paging — PageDown / PageUp ~UIkeyなどによる (あるいは ~scrollbarから誘発される等価な操作o) ◎ paging operations such as the PgUp/PgDn keys (or equivalent operations on the scrollbar)
- この~scrollに意図される終止-点 — 留め点などの特能から干渉されない下でのそれ — を指して, `自然な終止-点@ という。 ◎ The intended end point of the scroll prior to intervention from features such as snap points is its natural end-point.
- `方向のみ意図され@ る~scroll ◎ intended direction
-
`方向のみ意図され$る~scrollに共通的な例としては、 次が挙げられる: ◎ Common examples of scrolls with only an intended direction include:
- ~keyboardの矢印~UIkeyの押下げ(または~scrollbarに対する等価な操作o)によるもの ◎ pressing an arrow key on the keyboard (or equivalent operations on the scrollbar)
- (慣性的でなく)固定的な~scrollとして解釈されるような,~swiping~gesture ◎ a swiping gesture interpreted as a fixed (rather than inertial) scroll
加えて、 ~pageの内容は,通例的に[ 縦, 横 ]軸に整列するように~lay-outされるので、 ~UAは,その方向が[ 縦/横 ]に十分近いときには、 ~scrollをその `軸に~lock@ することもある。 `軸に~lock$された~scrollは、 その軸のみに沿って~scrollするよう束縛される。 これは、 入力の仕組みが精確さに欠くときでも, 軸からそれていかないようにする。 ◎ Additionally, because page layouts usually align things vertically and/or horizontally, UAs sometimes axis-lock a scroll when its direction is sufficiently vertical or horizontal. An axis-locked scroll is bound to only scroll along that axis. This prevents less-precise input mechanisms from drifting in the non-primary axis.
注記: この仕様が適用されるのは、 ~UAが~supportする~scrolling~methodに限られる。 ~UAには、 特定0の[ 入力/~scrolling ]~methodを~supportすることは,要求されない。 ◎ Note: This specification only applies to scrolling methods supported by the user agent; it does not require the user agent to support any particular input or scrolling method.
6.2. 留め位置の選び方
`~scroll容器$は、 その`~scroll可能な~overflow区画$に散らばる多数の`留め区画$を有し得る。 素朴な~algoで`留め位置$を選定すると,利用者にとって直感に反する挙動を生産し得るので、 選定~algoを設計する際には~careが要求される。 以下に,~UAが~~考慮すべき事項を挙げる: ◎ A scroll container can have many snap areas scattered throughout its scrollable overflow area. A naïve algorithm for selecting a snap position can produce behavior that is unintuitive for users, so care is required when designing a selection algorithm. Here are a few pointers that can aid in the selection process:
- `留め位置$は、[ 終止-点(または`自然な終止-点$)と最終的に留められる~scroll位置との距離 ]を最小~化するように選ぶべきである。 これは、 この節に挙げる追加的な拘束の~subjectになる。 ◎ Snap positions should be chosen to minimize the distance between the end-point (or the natural end-point) and the final snapped scroll position, subject to the additional constraints listed in this section.
- ~scrollが`軸に~lock$されていてる場合、 ~scrollしている間は,他方の軸における`留め位置$を無視するべきである (それでも、 他方の軸における`留め位置$は,最終的な~scroll位置に効果を及ぼし得る)。 ◎ If a scroll is axis-locked, any snap positions in the other axis should be ignored during the scroll. (However, snap positions in the other axis can still effect the final scroll position.)
- [ ~screenから遠く外れた要素が~scroll位置に不可解な効果を及ぼす ]ことを防止するため、[ 各~要素の`留め位置$のうち,`留域$が定義する “回廊” から遠く外れたもの ]は,無視するべきである — ここでの回廊とは ⇒# `~scroll可能な~overflow区画$を通って移動する回廊 / `方向のみ意図され$た~scrollにおける~~仮想の “回廊” / `終止-位置のみ意図され$た~scroll後の`留域$ ◎ In order to prevent a far-offscreen element from having difficult-to-understand effects on the scroll position, snap positions should be ignored if their elements are far outside of the “corridor” that the snapport defines as it moves through the scrollable overflow area, or a hypothetical “corridor” in the direction of a scroll with only an intended direction, or the snapport after an scroll with only an intended end position.
-
~UAは、 ~scroll~methodに関わらず, 利用者が`留め位置$から “逃れられる” ことを確保する`モノトスル^em。 例えば,[ 留め種別が `mandatory$v で,次にある`留め位置$が~screen幅の 2 倍より離れている ]場合、 “常に最も近傍に留める” ような素朴な選定~algoでは,[ 終止-位置が~screen幅の 1 倍までしか離れていない場合に,利用者を “嵌め続ける” ]ことになりかねない。 代わりに,[ 終止-点までの距離が開始-時の`留め位置$から相応に近いときに限り,開始-時の`留め位置$に戻り、 他の場合は,開始-時の留め位置を無視する ]方が,もっと良い挙動を与える賢い~algoになる。 ◎ User agents must ensure that a user can “escape” a snap position, regardless of the scroll method. For example, if the snap type is mandatory and the next snap position is more than two screen-widths away, a naïve “always snap to nearest” selection algorithm might “trap” the user if their end position was only one screen-width away. Instead, a smarter algorithm that only returned to the starting snap position if the end-point was a fairly small distance from it, and otherwise ignored the starting snap position, would give better behavior.
(これは、 `方向のみ意図され$る~scrollにおいては, 開始-時の`留め位置$を常に無視するモノトスルことを含意する。) ◎ (This implies that a scroll with only an intended direction must always ignore the starting snap positions.)
-
~target要素 %要素 を定義する素片 (例: `target$ps に合致するもの/ `scrollIntoView()$m の~targetになるもの) へ~pageが~navigateされたときは、 %要素 に`留め位置$が定義されている場合には,~UAは:
- %要素 に最も近い`~scroll容器$ %容器 が`~scroll留め容器$であるならば、 %容器 を %要素 のいずれかの【縦, 横いずれかの軸における】`留め位置$に`留める$モノトスル。
- 他の場合( %容器 の `scroll-snap-type$p は `none^v のとき)でも,そうしてヨイ。
6.2.1. 整列される留め区画が複数ある場合の選定-法
ある~scroll位置へ`留める$とき、 そこに整列された`留め区画$が複数ある場合に[ `塊-軸$, `行内-軸$ ]において どの~boxへ`留める$かを決定するときは, 次の~algoが利用される: ◎ When snapping to a scroll position that is aligned with multiple scroll snap areas, the following algorithm procedure is used to determined which box is snapped on the block and inline axes for a particular scroll container:
- %~scroll位置 ~LET 当の`~scroll容器$の`~scroll位置$ ◎ Let scroll position be the scroll position of the scroll container
- %行内 ~LET 次を満たす~boxたちが成す集合 ⇒ その`~scroll留め区画$は`行内-軸$において %~scroll位置 に整列されている ◎ Let inline be the set of boxes whose scroll snap areas are aligned at this scroll position in the inline axis.
- %塊 ~LET 次を満たす~boxたちが成す集合 ⇒ その`~scroll留め区画$は`塊-軸$において %~scroll位置 に整列されている ◎ Let block be the set of boxes whose scroll snap areas are aligned at this scroll position in the block axis.
-
« %塊, %行内 » を成す ~EACH( %~list ) に対し: ◎ For each list of block and inline:
- ~IF[ %~list は~focusされた~boxを包含する ] ⇒ %~list から他のすべての~boxを除去する ◎ If list contains the focused box, remove all other boxes from list.
- ~IF[ %~list は~targetにされた~boxを包含する ] ⇒ %~list から他のすべての~boxを除去する ◎ If list contains the targeted box, remove all other boxes from list.
- %~list を成す ~EACH( %~box ) に対し ⇒ %~list から %~box の先祖である~boxを除去する ◎ For each box in list: • Remove any box from list which is an ancestor of box.
- %交差集合 ~LET [ %行内, %塊 ]の交差集合 ◎ ↓
-
~IF[ %交差集合 は空でない ]: ◎ If inline and block are overlapping sets:
- %行内 ~SET %交差集合 ◎ Replace inline with the intersection of inline and block.
- %塊 ~SET %交差集合 ◎ Replace block with the intersection of inline and block.
- `行内-軸$において`留められ$る~boxとして, %行内 を成す要素のうち`~tree順序$で最初のものを選定する ◎ Select the first element in tree order from inline as the snapped inline axis box.
- `塊-軸$において`留められ$る~boxとして, %塊 を成す要素のうち`~tree順序$で最初のものを選定する ◎ Select the first element in tree order from block as the snapped block axis box.
付録 A. 各種~下位prop
[ 物理的, 論理的 ]な下位prop(および対応する略式~prop)は、 `CSS-LOGICAL-1$r に定義されるとおりに相互作用する。 ◎ The physical and logical longhands (and their shorthands) interact as defined in [CSS-LOGICAL-1].
`scroll-padding$p 用の物理的な下位prop
◎名 `scroll-padding-top@p,`scroll-padding-right@p,
`scroll-padding-bottom@p,
`scroll-padding-left@p ◎値 `auto^v | `length-percentage [0,∞]$t ◎初 `auto^v ◎適 `~scroll容器$ ◎継 されない ◎百 `~scrollport$の対応する次元に相対的 ◎ relative to the scroll container’s scrollport ◎算 ~keyword `auto^v / `length-percentage$t の算出d値 ◎ the keyword auto or a computed <length-percentage> value ◎順 文法に従う ◎ア 算出d値の型による ◎論 `scroll-padding$p ◎表終
`scroll-padding$p を成すこれらの `下位prop$は、 順に,`留域$の[ 上端, 右端, 下端, 左端 ]辺を指定する。 負な値は無効。 ◎ These longhands of scroll-padding specify the top, right, bottom, and left edges of the snapport, respectively. Negative values are invalid.
`scroll-padding$p 用の~flowに相対的な下位prop
◎名 `scroll-padding-inline-start@p,`scroll-padding-block-start@p,
`scroll-padding-inline-end@p,
`scroll-padding-block-end@p ◎値 `auto^v | `length-percentage [0,∞]$t ◎初 `auto^v ◎適 `~scroll容器$ ◎継 されない ◎百 `~scrollport$の対応する次元に相対的 ◎ relative to the scroll container’s scrollport ◎算 ~keyword `auto^v / `length-percentage$t の算出d値 ◎ the keyword auto or a computed <length-percentage> value ◎順 文法に従う ◎ア 算出d値の型による ◎論 `scroll-padding$p ◎表終
`scroll-padding$p を成すこれらの`下位prop$は、 順に,`留域$の[ 塊-始端, 行内-始端, 塊-終端, 行内-終端 ]辺を指定する。 負な値は無効。 ◎ These longhands of scroll-padding specify the block-start, inline-start, block-end, and inline-end edges of the snapport, respectively. Negative values are invalid.
◎名 `scroll-padding-block@p,`scroll-padding-inline@p ◎値 [ `auto^v | `length-percentage [0,∞]$t ]{1,2} ◎初 `auto^v ◎適 `~scroll容器$ ◎継 されない ◎百 `~scrollport$の対応する次元に相対的 ◎ relative to the scroll container’s scrollport ◎算 個々の~propを見よ ◎順 文法に従う ◎ア 算出d値の型による ◎表終
これらは, `scroll-padding$p を成す`下位prop$であると同時に、 前者は[ `scroll-padding-block-start$p, `scroll-padding-block-end$p ]用の, 後者は[ `scroll-padding-inline-start$p, `scroll-padding-inline-end$p ]用の`略式~prop$であり、 順に,`留域$の[ `塊-軸$, `行内-軸$ ]辺を指定する。 ◎ These shorthands of scroll-padding-block-start + scroll-padding-block-end and scroll-padding-inline-start + scroll-padding-inline-end are longhands of scroll-padding, and specify the block-axis and inline-axis edges of the snapport, respectively.
値が 2 個~指定された場合、 順に,[ 始端, 終端 ]用の値を与える。 ◎ If two values are specified, the first gives the start value and the second gives the end value.
値が 1 個だけ指定された場合、 その値が 2 個目の値も与える。 ◎ If only one value is specified, the second value defaults to the same value.
`scroll-margin$p 用の物理的な下位prop
◎名 `scroll-margin-top@p,`scroll-margin-right@p,
`scroll-margin-bottom@p,
`scroll-margin-left@p ◎値 `length$t ◎初 `0^v ◎適 すべての要素 ◎継 されない ◎百 受容しない ◎算 絶対~長さ ◎順 文法に従う ◎ア 算出d値の型による ◎論 `scroll-margin$p ◎表終
`scroll-margin$p を成すこれらの`下位prop$は、 順に,`~scroll留め区画$の[ 上端, 右端, 下端, 左端 ]辺を指定する。 ◎ These longhands of scroll-margin specify the top, right, bottom, and left edges of the scroll snap area, respectively.
`scroll-margin$p 用の~flowに相対的な下位prop
◎名 `scroll-margin-block-start@p,`scroll-margin-inline-start@p,
`scroll-margin-block-end@p,
`scroll-margin-inline-end@p ◎値 `length$t ◎初 `0^v ◎適 すべての要素 ◎継 されない ◎百 受容しない ◎算 絶対~長さ ◎順 文法に従う ◎ア 算出d値の型による ◎論 `scroll-margin$p ◎表終
`scroll-margin$p を成すこれらの`下位prop$は、 順に,`~scroll留め区画$の[ 塊-始端, 行内-始端, 塊-終端, 行内-終端 ]辺を指定する。 ◎ These longhands of scroll-margin specify the block-start, inline-start, block-end, and inline-end edges of the scroll snap area, respectively.
◎名 `scroll-margin-block@p,`scroll-margin-inline@p ◎値 `length$t{1,2} ◎初 `0^v ◎適 すべての要素 ◎継 されない ◎百 受容しない ◎算 個々の~propを見よ ◎順 文法に従う ◎ア 算出d値の型による ◎表終
これらは, `scroll-margin$p を成す`下位prop$であると同時に、 前者は[ `scroll-margin-block-start$p, `scroll-margin-block-end$p ]用の, 後者は[ `scroll-margin-inline-start$p, `scroll-margin-inline-end$p ]用の`略式~prop$であり、 順に,`~scroll留め区画$の[ `塊-軸$, `行内-軸$ ]辺を指定する。 ◎ These shorthands of scroll-margin-block-start + scroll-margin-block-end and scroll-margin-inline-start + scroll-margin-inline-end are longhands of scroll-margin, and specify the block-axis and inline-axis edges of the scroll snap area, respectively.
値が 2 個~指定された場合、 順に,[ 始端, 終端 ]用の値を与える。 ◎ If two values are specified, the first gives the start value and the second gives the end value.
値が 1 個だけ指定された場合、 その値が 2 個目の値も与える。 ◎ If only one value is specified, the second value defaults to the same value.
7. ~privacyと~securityの考慮点
この仕様は、 すでに DOM に直に公開されているものを超えるような, いかなる情報も公開させない。 これは、 ~scrollingを少しばかり機能的にするだけである。 新たな[ ~privacy/~security ]の考慮点はない。 ◎ This specification does not expose any information whatsoever that is not already exposed to the DOM directly; it just makes scrolling slightly more functional. There are no new privacy or security considerations.
8. 謝辞
提案と推奨を寄せられた次の方々に。 うち一部は、 この文書に組入れられている:
Many thanks to David Baron, Simon Fraser, Håkon Wium Lie, Theresa O’Connor, François Remy, Majid Valpour, and most especially Robert O’Callahan for their proposals and recommendations, which have been incorporated into this document.
9. 変更点
【 この訳では、 変更箇所の引用は省略する。 】
- `2019年 3月 19日 勧告候補@~TR/2019/CR-css-scroll-snap-1-20190319/$ からの変更点 ◎ 9.1. Changes Since 19 March 2019 CR ◎ Changes since the 19 March 2019 Candidate Recommendation include:
- `scroll-snap-align$p を解決するとき,どの書字~modeを利用するか指定した。 ( `3815$issue ) ◎ Specified which writing mode is used to resolve scroll-snap-align. (Issue 3815)
- 符合する要素が複数あるとき,どれに留直すかについての要件を定義した。 ( `4651$issue ) ◎ Define requirements for re-snapping when multiple elements coincide. (Issue 4651) • (以下略)
- それまでと異なる要素に留直すときには、 他の[ ~viewの中へ~scrollする操作o ]と同じ仕方で~animateすることを要求した。 ( `4609$issue ) ◎ Require re-snapping to a new element to animate the same way as any other scroll-into-view operation. (Issue 4609) • Scrolling required by a re-snap operation to a new or different box must behave and animate the same way as any other scroll-into-view operation, including honoring controls such as scroll-behavior. Scrolling behavior for re-snapping to the same box as before however, is UA-defined. The UA may, for example, when snapped to the start of a section, choose not to animation the scroll to the section’s new position as content is dynamically added earlier in the document in order to create the illusion of not scrolling.
- [ `scroll-snap-type$p / `scroll-padding$p ]値は、[ 期待されるように,`根~要素$から文書~表示域へ伝播する ]ことを明示的に定義した。 ( `3740$issue ) ◎ Defined explicitly that scroll-snap-type and scroll-padding values are propagated from the root element to the document viewport as would be expected. (Issue 3740) • (以下略)
- 留め整列は,可視域に相対的になる一方で、 `scroll-padding$p は,根~表示域に対しては — `scroll-padding$p と~inset~prop【による~offsetの計算】が一貫するよう — ~layout表示域を~~基準に解決されることを明確化した。 ( `4393$issue ) ◎ Clarified that while snap alignment is relative to the visual viewport, scroll-padding is resolved against the layout viewport, so that scroll-padding and inset are consistent on the root viewport. (Issue 4393) • (以下略)
- [ `scroll-padding-inline$p / `scroll-padding-block$p ]の “適用対象” を正した。 ( `5845$issue ) ◎ Corrected the “Applies to” line for scroll-padding-inline and scroll-padding-block. (Issue 5845)
- `各~commentに対する処置集@~CSSWG/css-scroll-snap-1/issues-cr-2019$もある。 ◎ A Disposition of Comments is available.
- `2019年 1月 31日 勧告候補@~TR/2019/CR-css-scroll-snap-1-20190131/$ からの変更点 ◎ 9.2. Changes Since 31 January 2019 CR ◎ Changes since the 31 January 2019 Candidate Recommendation include:
- ~scroll留ngが~offにされていても,[ `scroll-padding$p, `scroll-margin$p ]は適用されることを強勢した。 ( `3721$issue ) ◎ Emphasized that scroll-padding and scroll-margin do apply even when scroll snapping is off. (Issue 3721) • (以下略)
- `2018年 8月 14日 勧告候補@~TR/2018/CR-css-scroll-snap-1-20180814/$ からの変更点 ◎ 9.3. Changes Since 14 August 2018 CR ◎ Changes since the 14 August 2018 Candidate Recommendation include:
- `scroll-padding$p の下位propの定義~表tにて, 新たな `auto@#valdef-scroll-padding-auto$v ~keywordを挙げるよう正した。 ( `3189$issue ) ◎ Corrected scroll-padding longhands to list the new auto keyword in their property definition tables. (Issue 3189)
- ~prop定義~表tにおける “算出d値”, “~animation型” を修正した。 ◎ Fixed up “Computed value” and “Animation type” lines in the property definition tables.
- `scroll-margin$p ~prop定義~表tにとり残されていた `percentage$t 値を片付けた。 ( `3289$issue ) ◎ Cleaned up stray <percentage> values in scroll-margin property definition tables. (3289)
- `各~commentに対する処置集@~CSSWG/css-scroll-snap-1/issues-cr-2018$もある。 ◎ A Disposition of Comments is available.
- `2017年 12月 14日 勧告候補@~TR/2017/CR-css-scroll-snap-1-20171214/$ からの変更点 ◎ 9.4. Changes Since 14 December 2017 CR ◎ Changes since the 14 December 2017 Candidate Recommendation include:
- `scroll-snap-align$p 略式~propは、 論理-略式~propの規約に則って,[ 1 個目, 2 個目 ]の値を順に[ 塊-軸, 行内-軸 ]にアテガうよう修正した。 ( `2232$issue ) ◎ Fixed scroll-snap-align shorthand to assign block-axis value first, inline-axis value second, accordingly to logical shorthand conventions. (Issue 2232
- `scroll-padding$p に初期~値として, ~UAによる経験則を織り込むための~keyword `auto^v を追加した ( `2728$issue ) ◎ Added auto keyword to 'scroll-padding as its initial value to account for UA heuristics. (Issue 2728
- `scroll-snap-type$p の定義を, `scrollTo()$m などの~programによる~scrollも留ngの~subjectになるものと明確化した。 ( `2593$issue ) ◎ Clarified in the definition of scroll-snap-type that programmatic scrolls such as scrollTo() are also subject to snapping. (Issue 2593) • (以下略)
- `§ 妥当な留め位置を可視~boxに~~絞る@#snap-scope$ における言い回しを, `旧~version@~TR/2017/CR-css-scroll-snap-1-20171214/#snap-scope$より明瞭になるよう調整した。 ( `2526$issue ) ◎ Adjusted wording in § 5.2.1 Scoping Valid Snap Positions to Visible Boxes to be clearer—compared to old version. (Issue 2526)
- `各~commentに対する処置集@~CSSWG/css-scroll-snap-1/issues-cr-2017-12$もある。 ◎ A Disposition of Comments is available.
- `2017年 8月 24日 勧告候補@~TR/2017/CR-css-scroll-snap-1-20170824/$からの変更点 ◎ 9.5. Changes Since 24 August 2017 CR ◎ Changes since the 24 August 2017 Candidate Recommendation include:
- `target$ps, `scrollIntoView()$m, 等々は、 留ngありかどうかに関わらず, `scroll-margin$p を織り込むべきである。 `課題 #1@~CSSWG/css-scroll-snap-1/issues-cr-2016-08#issue-1$ ◎ :target/scrollIntoView()/etc should take scroll-margin into account, regardless of whether snapping is turned on or not. (Issue 1
- `target$ps, `scrollIntoView()$m, 等々は、 留ngありの場合には留め位置を利用するモノトスル(ベキ、ではなく)。 `課題 #1@~CSSWG/css-scroll-snap-1/issues-cr-2016-08#issue-1$ ◎ :target/scrollIntoView()/etc must (rather than should) use snap positions if snapping is turned on. (Issue 1
- `scroll-snap-margin^p から `scroll-margin^p に改称した — [ 留ngの挙動に関わらず,要素へ~scrollするときに余白を供する ]汎用な役割を,より反映するため。 `課題 #4@~CSSWG/css-scroll-snap-1/issues-cr-2016-08#issue-4$ ◎ Renamed scroll-snap-margin to scroll-margin to reflect its more generic role in providing breathing space for scrolling to an element regardless of snapping behavior. (Issue 4)
- `各~commentに対する処置集@~CSSWG/css-scroll-snap-1/issues-cr-2016-08$もある。 ◎ A Disposition of Comments is available.
- `2016年 10月 20日 作業草案@~TR/2016/CR-css-scroll-snap-1-20161020/$ からの変更点 ◎ 9.6. Changes Since 20 October 2016 CR ◎ Changes since the 20 October 2016 Candidate Recommendation include:
- `scroll-padding$p の値は、 負でない値に制約した。 ( `1084$issue ) ◎ Restricted scroll-padding to non-negative values. (Issue 1084) ◎ Values must be non-negative and are interpreted as for padding …
- `§ ~scrolling~methodの種別@#scroll-types$の例に ~pagingと~homing操作oを追加した。 ( `1605$issue ) ◎ Added paging and homing operations to examples in § 6.1 Types of Scrolling Methods. (Issue 1605)
- 一方の軸における留ngは、 他方の軸において,[ 特定0の留め区画への留ngはアリかどうか ]に影響し得ることを明確化した。 ( `950$issue ) ◎ Clarified that snapping in one axis may affect whether snapping to a particular snap area is possible in the other axis. (Issue 950) • (以下略)
- [ `scroll-padding$p / `scroll-margin$p ]略式~propがそれぞれの下位propにどう値をアテガうかを明確化した。 ( `1050$issue ) ◎ Clarified how the scroll-padding and scroll-margin shorthands assign values to their longhands. (Issue 1050)
- ~scroll留ngは、 特定0の入力~methodを義務付けないことを明確化した。 ( `1305$issue ) ◎ Clarified that scroll snapping does not mandate any particular input method. (Issue 1305) • (以下略)
- 各種~scrollingに対する, `scroll-snap-stop$p に意図される効果を明確化した。 ( `1552$issue ) ◎ Clarified the intended effects of scroll-snap-stop on various scrolling operations. (Issue 1552)
- `scroll-snap-stop$p が適用されるのは、 `~scroll留め容器$におけるすべての`留め位置$ではなく, 要素が定義する`留め位置$であることを明確化した。 ◎ Clarified that scroll-snap-stop is applied to the snap positions defined by the element, not applied to all snap positions in the scroll snap container.
- 例における構文の誤りを修正した。 § `scroll-snap-type$p にも新たな例を追加した。 ( `827$issue ) ◎ Fixed some syntax errors in examples and added a new one to the scroll-snap-type section. (Issue 827)