1. 序論
◎非規範的歴史的に,ほとんどの~browserは、 ~focusをある方向へ移動する特能を利用者に提供していなかった。 ~TV~browserなど,一部のものは、 必要に迫られ,利用者が矢印~UIkeyを利用して~focusを移動するのを可能化する — 典型的な~TV~remote-controlには可用な入力の仕組みが他にないので。 ◎ Historically, most browsers have not offered features to let the user move the focus directionally. Some, such as TV browsers, have enabled the user to move the focus using the arrow keys out of necessity, since no other input mechanism is available on a typical TV remote control.
その他ものは、 空間的~naviを制御するための,異なる~UIkey組合nを可能化していた — `Shift$kY ~UIkeyと矢印~UIkeyを一緒に~pressするなど。 ◎ Others, have enabled different key combinations to control spatial navigation, such as pressing the Shift key together with arrow keys.
ある方向へ,~pageを巡って移動するこの能は、 `空間的~navi@ ( `spatial navigation^en )と呼ばれる。 ◎ This ability to move around the page directionally is called spatial navigation.
`空間的~navi$は、 格子~状の~layoutその他のおよそ一次元的でない~layoutを利用して築かれた~web~page用に有用になり得る。 下の図は、 格子~layoutに配列された写真展示を表現する。 利用者が `Tab$kY ~UIkeyを~pressして各~画像~間で~focusを移動する場合、 欲される画像~要素へ到達するまで,~UIkeyを何回も~pressする必要がある。 ◎ Spatial navigation can be useful for a web page built using a grid-like layout, or other predominantly non linear layouts. The figure below represents a photo gallery arranged in a grid layout. If the user presses the Tab key to move focus around the images, they need to press the key many times to reach the desired image element.
`空間的~navi$による~focusの移動-先は、 利用者にとって予測-可能にもなる — それは、 ~focus可能な各~要素~間で,要素の位置に依存するように~focusを移動するので。 ~page上の要素は,~source順序とは独立に配列されることもあり、 その場合, `Tab$kY ~UIkeyを利用する連列的~naviによる~focus~naviは — 空間的~naviと違って — 予測-不能になる。 ◎ Also, spatial navigation moves the focus to the predictable element for users because it moves the focus among focusable elements depending on their position. Sometimes elements on the page aren’t arranged independently of their source order. Therefore unlike spatial navigation, sequential navigation using the Tab key makes focus navigation unpredictable.
矢印~UIkeyは,空間的~naviを制御するには自然に適するが、 それがどう働くベキで, どう制御されてヨイか/できるかを述べる仕様は,これまで無かった。 この仕様は、[ 空間的~navi用の処理~model ], および[ 空間的~naviがどう働くかを,作者が[ 制御する/上書きする ]ことを可能化する~API ]を導入する。 ◎ While arrow keys are naturally suited to control spatial navigation, no previous specification describes how that should work, or how it may be controlled. This specification introduces a processing model for spatial navigation, as well as APIs enabling the author to control and override how spatial navigation works.
注記: この仕様を成す一部の側面 — ~JS[ ~Event/~API ]など — は、 連列的~naviにも拡張できる — ~keyboard~naviが一般に,一貫した, かつ きちんと定義された~modelを必ず備えるようにするための。 ◎ Note: Some aspects of this specification, such as the JavaScript Events and APIs could also be extended to sequential navigation, in order to make sure that keyboard navigation has a consistent and well defined model in general.
注記: 一般~原則として、 ~keyboard~navi, 特に空間的~naviは,~JSなしに利用したり制御することがアリになるベキであり、 したがって宣言的な解決策が選好される。 空間的~naviは~layoutに依存するので、 概して,~CSSが空間的~naviに関係する制御-を定義するための~rightな仕組みになることを意味する。 しかしながら,`拡張-可能な~Web$ `EXTENSIBLE$r の精神においては、 ~rightな~JS~primitiveを供して,作者に問題~空間を試験して探求してもらうことが重要であると感じられる。 後には、 そのような~JS用法を通して獲得された~feedbackと経験に基づいて,より宣言的な特能が追加されるであろう。 ◎ Note: As a general principle, keyboard navigation, and spatial navigation in particular, should be possible to use and control without JavaScript, and declarative solutions are therefore preferred. Since spatial navigation depends on layout, that means CSS is typically the right mechanism to define spatial navigation related controls. However, in the spirit of the Extensible Web Manifesto [EXTENSIBLE], we feel it is important to provide the right JavaScript primitives to let the author experiment and explore the problem space. More declarative features may be added later, based on feedback and experience acquired through such JavaScript usage.
注記: 少数の特能は、 `~risk下@ にあるとされる。 編集者は、 それらが[ この仕様に定義される特能の利用者や作者による体験 ]を成す重要な一部を表現すると予見している。 と同時に、 この仕様を成す中核の機能性は,これらを実装せずに実装できるので、 最初の実装の視野を抑制するため,実装者は それらの優先度を下げることもあり得ると見受けられる。 これらの特能は — 実装されることになると希望されているが — 最優先でないかもしれない認識の下で,~risk下にあるとされる。 ◎ Note: A few features are marked at-risk. The editors of this specification believe they represent an important part of the user or author experience of the features defined in the specification. At the same time, the core functionality of this specification can be implemented without implementing these so it seems possible that implementers may choose to down-prioritize them to reduce the scope of the first implementation. While it is hoped that these features will be implemented as well, they are marked at-risk in recognition that they might not be at first.
2. ~module間の相互作用
この文書は `infra$r に依存する。 ◎ This document depends on the Infra Standard [infra].
【以下略:`RFC 2119 が規定する句に利用される対訳@index.html#rfc2119-phrase$を参照されたし。】 ◎ The keywords "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" are to be interpreted as described in RFC 2119. [RFC2119]
2.1. 値~定義
【 この節の内容は `~CSS日本語訳 共通~page@~CSScommon#values$に移譲。 】
【この訳に特有な表記規約】
◎表記記号この訳では、 原文にて利用され, `HTML$r にて定義される用語のうち一部を`より適切と見なされる用語@~HTMLds#warning-avoid-using-bcs$に置換している — 次の様に ⇒# `閲覧~文脈$ → `~navigable$, `~top-level閲覧~文脈$ → `辿可能な~navigable$, (文書が)`属する閲覧~文脈$ → (文書の)`~node~navigable$
3. 概観
◎非規範的~UAにより定義される仕組みを利用して(概して矢印~UIkey,場合によっては `Shift$kY や `Control$kY の様な修飾keyとの組合nで)、 利用者は特定0の方向へ~navigateするよう~UAに依頼することもある。 これは、 その現在の所在から要請された方向に~focus可能な新たな~itemが在れば,そこへ~focusを移動し、 適切な~itemが無ければ~scrollすることになる。 ◎ Using a UA-defined mechanism (typically arrow keys, possibly in combination with modifier keys like Shift or Control), the user may ask the user agent to navigate in a particular direction. This will either move the focus from its current location to a new focusable item in the direction requested, or scroll if there is no appropriate item.
より特定的には、 ~UAは先ず,[ 現在の`空間的~navi容器$の中で指示された方向にある,可視かつ~focus可能な~item ]を探索することになる (`空間的~navi容器$は、 既定では,[ `根~要素$, ~scroll可能な要素, ~iframe ]いずれかであるが、 `spatial-navigation-contain$p ~propを利用すれば,他の要素も`空間的~navi容器$を成すようにできる)。 ◎ More specifically, the user agent will first search for visible and focusable items in the direction indicated within the current spatial navigation container (by default, the root element, scrollable elements, and iframes, but other elements can be made into spatial navigation containers using the spatial-navigation-contain property).
何かが見出された場合、 その方向にある最良な 1 つを選取って,~focusをそこへ移動することになる。 ◎ If it finds any, it will pick the best one for that direction, and move the focus there.
何も見出されなかった場合、 ~focusを移動する代わりに,要請された方向へ`空間的~navi容器$を~scrollすることになる。 その結果,~focus可能な要素が~~現れ得る — その場合、 次回に同じ方向へ空間的~naviが要請されたとき,それが~focusを移動する適格な~targetになるであろう。 ◎ If it does not, it will scroll the spatial navigation container in the requested direction instead of moving focus. Doing so may uncover focusable elements which would then be eligible targets to move the focus to next time spatial navigation in the same direction is requested.
[ ~scroll可能な要素でないか,すでにその方向へ~scrollし切った ]ため,`空間的~navi容器$を~scrollできない場合、 ~UAは先祖上の連鎖†を遡って次にある`空間的~navi容器$を選定して,何らかの[ ~focus/~scroll ]可能な要素を見出すか,`根~要素$に到達するまで,上の処理-を再帰的に繰返すことになる。 ◎ If the spatial navigation container cannot be scrolled, either because it is not a scrollable element or because it is already scrolled to the maximum in that direction, the user agent will select the next spatial navigation container up the ancestry chain, and recursively repeat the above process until it finds some element to focus or scroll, or reaches the root element.
【† この仕様に現れる “先祖” は、 ~APIも含め,`~box~tree$に基づく先祖と解釈すべきように思われる。 】
注記: この処理~modelの帰結として、 連列的~naviにより到達-可能な要素たちは,空間的~naviにより到達-可能なものとほぼ同じになる。 現在~scroll可能な要素の表示域の外側にある要素へは、 空間的~naviにより~viewの中へ~scrollされたときに限り到達できる。 したがって,~viewの中へ~scrollできない要素は、 既定では,空間的~naviでも到達できない。 ◎ Note: As a consequence of this processing model, the elements that are reachable by sequential navigation and by spatial navigation are almost the same. Elements that are currently outside of the viewport of a scrollable element can only be reached by spatial navigation once they have been scrolled into view. Therefore, elements that cannot be scrolled into view by default.
この[ 空間的~navi要請に対し適切な応答を得るため,探索する間 ]の主要な箇所にて,~UAは~eventを発火することになる。 これらは、 作者が来たる動作を防止すること( `preventDefault()$m を~callして),および 欲されるなら代替-動作 — 作者が選んだ異なる要素に対し `focus()$m ~methodを利用するなど — を供することを可能化する。 ◎ At key points during this search for the appropriate response to the spatial navigation request, the user agent will fire events. These enable the author to prevent the upcoming action (by calling preventDefault()), and if desired to provide an alternate action, such as using the focus() method on a different element of the author’s choosing.
作者がそのような代替-動作を書き易くするため、 および`拡張-可能な~Web$ `EXTENSIBLE$r の原則の下に,下層の~platform~primitiveを公開する一部として、 この仕様は,下層の~modelの主要な構成子を公開する~JS~APIも定義する。 ◎ To help the author write such alternate actions, and as part of exposing underlying platform primitives as per the Extensible Web principles, this specification also defines JavaScript APIs that expose key constructs of the underlying model.
~JS~APIについての詳細は `§ ~JS~API@#js-api$ / 様々な~eventについての詳細は `§ ~navi~event型@#events-nav-type$ / ~CSS~propについての詳細は `§ 宣言的な手段による空間的~naviの制御-法@#declarative$ を見よ。 ◎ See § 5 JavaScript API for details about the JavaScript API, § 6.2 Navigation Event Types for details about the various events, and § 9 Controlling spatial navigation through declarative means for details about the CSS properties.
この例は、 ~scroll可能な要素~内に配列された一連の~focus可能な要素が,空間的~naviを利用して どう~navigateされるかを示す。 記述を単純に保つため、 この例の空間的~naviは,矢印~UIkeyを利用して誘発されるものと見做す。 【!user agent where】 ◎ This example shows how a series of focusable elements arranged in a scrollable element would be navigated when using spatial navigation. For the sake of keeping the description simple, this example assumes a user agent where spatial navigation is triggered using arrow keys.
上の図では、 左端にある "Box 2" が~focusされている。 `ArrowDown$kY ~UIkeyを~pressすると、 ~scrollすることなく,~focusは "Box 3" へ移動する — "Box 3" は`空間的~navi容器$の`~scrollport$内に可視なので。 ◎ On the left of figure 2, "Box 2" is focused. Pressing the ArrowDown key moves the focus to "Box 3" without scrolling because "Box 3" is visible in the scrollport of the spatial navigation container.
上の 1 個目の図において、 `~scrollport$内には, "Box 3" の下には可視な要素は無い。 したがって, `ArrowDown$kY を~pressしたときの効果は、 2 個目の図に示されるように下へ~scrollする。 もう一回 `ArrowDown^kY ~UIkeyが~pressされると `~scrollport$の中へ "Box 4" が来るようになり( 3 個目の図)、 さらにもう一回 `ArrowDown^kY が~pressされると,~focusは そこへ移動することになる( 4 個目の図)。 ◎ On the first of figure 3, under "Box 3", there isn’t any visible element in the scrollport. Therefore, the effect of pressing the ArrowDown is to scroll down, as shown in the second. The next press of the ArrowDown key makes "Box 4" come into the scrollport, and the focus will move to it when there is additional pressing the ArrowDown, as the fourth.
この例では、 次の~markupが利用されている: ◎ This example uses the markup as follows:
#scroller { width: 700px; height: 700px; overflow-x: hidden; overflow-y: auto; } .box { width: 150px; height: 110px; background-color: blue; } .box:focus { background-color: red; }
<div id="scroller"> <div class="box" tabindex="0">Box 1</div> <div class="box" tabindex="0">Box 2</div> <div class="box" tabindex="0">Box 3</div> <div class="box" tabindex="0">Box 4</div> </div>
4. 空間的~naviの誘発-法
利用者が所与の方向への空間的~naviを誘発するとき、 ~UAは,その方向への`空間的~navi手続き$を走らすモノトスル。 ◎ When the user triggers spatial navigation in a given direction, the user agent must run the spatial navigation steps in that direction.
この仕様は、 ~UAが[ 空間的~naviを誘発する~UIの仕組み ]として何を利用者に提供するベキかは,定義しない。 これは、 意図的に~UAの裁定に委ねられている。 ◎ This specification does not define what UI mechanism user agents should offer to users to trigger spatial navigation. This intentionally left for user agents to decide.
注記: [ ~remote-controlで操作oされる~TV, ~feature-phone, ~game~controllerで操作oされている機器 ]など,入力~能力が制限された機器~上の~UAは、 首な, または排他的な~naviの仕組みとして,空間的~naviを利用することになるものと期待される。 ◎ Note: It is expected that user agents on devices with limited input capabilities, such as TVs operated with a remote control, feature phones, or devices operated with a game controller, will use spatial navigation as their primary or exclusive navigation mechanism.
~UAは,この仕様が定義する[ 処理~model, ~API ]を実装できるが、 ~UAには,[ ~APIを利用することなく,直に空間的~naviを誘発する手段 ]を利用者に【!should】提供することが推奨される。 ◎ Although user agents can implement the processing model and APIs defined by the specification, this specification recommends that user agents should offer a means for users to trigger spatial navigation directly, without having to use the APIs.
注記: 逆に,作者は、 ~APIを呼出さないときでも[ 空間的~naviは、 利用者~動作に呼応して,~UAにより誘発され得る ]ものと見做すベキである。 ◎ Note: Conversely, the author should assume that spatial navigation may be triggered by the user agent in response to user actions even if the author has not invoked any of the APIs.
空間的~naviを誘発するために選ばれる実際の仕組みに関わらず,次に挙げる要件が適用される: ◎ Regardless of the actual mechanism chosen to trigger spatial navigation, the following requirements apply:
-
空間的~naviを誘発するために利用者が利用しなければナラナイ仕組みが,通常は `UIEvent$I を発火する場合 ⇒ `空間的~navi手続き$を走らすに先立って,その~eventを発火した上で、 その~eventの`取消されたか$evが ~T にされた場合には,この手続きを走らせないモノトスル。 ◎ If the mechanism the user must use to trigger spatial navigation would normally fire a UIEvent, the event must be fired prior to running the spatial navigation steps and these steps must not be run if that event’s canceled flag gets set.
~game用~機器の十字キーが~pressされたとき、 空間的~naviを誘発し得る。 これは、 ~UIkeyが[ `ArrowDown$kY, `ArrowLeft$kY, `ArrowRight$kY, `ArrowUp$kY ]いずれかに設定された `keydown$et ~eventを発火する結果になる。 これが取消されなかった場合、 `空間的~navi手続き$を走らす — 関連な `NavigationEvent$I を発火することも含め。 ◎ Gaming devices may trigger spatial navigation based on pressing the D-pad. This would result in firing a keydown event with the key set to one of ArrowDown, ArrowLeft, ArrowRight, or ArrowUp, followed if not canceled by running the spatial navigation steps, including firing the relevant NavigationEvents.
~keyboardの矢印~UIkeyを利用して空間的~naviを誘発する,~desktop~computer上の~UAは、 同じ連列に従うことになる。 ◎ A user agent on a desktop computer that triggers spatial navigation using the arrow keys of the keyboard would follow the same sequence.
-
空間的~naviを誘発するために利用者が利用しなければナラナイ仕組みが,何らかの文脈においては他の動作を遂行することになる場合、 ~UAは[ そのような文脈においては,それら他の動作に優先度を与えて、 空間的~naviの代わりに,それらを実行する ]ベキであり,両者とも誘発しないモノトスル。 ◎ If the mechanism the user must use to trigger spatial navigation would also perform other actions in some contexts, the user agents should in these contexts give priority to these other actions and execute them instead of spatial navigation. It must not trigger both.
修飾keyなしの矢印~UIkey利用して,空間的~naviを誘発し,同じ矢印~UIkeyを~text挿入~caretを移動するためにも利用する~UAにおいて、 編集-可能な要素に~focusされたときは,矢印~UIkeyは,既定では~caretを移動するベキである。 空間的~naviは、 ~focusされた要素が[ 編集-可能でない/ 編集-可能であるが,要請された方向へは それ以上~caretを移動できないとき ]に限り,矢印~UIkeyにより誘発されることになる。 ◎ In a user agent that triggers spatial navigation using the arrow keys without modifier keys, and uses these same arrow keys to move the text insertion caret when an editable element is focused, the arrow keys should by default to moving the caret. Spatial navigation would only be triggered by the arrow keys when the focused element is not editable or when it is editable, but the caret cannot move any further in the requested direction.
ただし、 ~scrollingには例外がある: 空間的~navi自体は(~focusを移動することに加えて)~scrollingも取扱うので、 ~UAは,同じ仕組みを[ 空間的~navi, 空間的~naviとは別々な~scrollingの挙動 ]の両者を誘発するものとして提供するベキでない。 しかしながら,~UAは、[ それらの間で異なる~modeに切替える仕方,あるいは 異なる~UIの仕組みに基づいて両者 ]を利用者に提供してもヨイ。 ◎ An exception is made for scrolling: since spatial navigation itself handles scrolling (in addition to moving the focus) user agents should not offer the same mechanism to trigger both spatial navigation and the scrolling behavior separate from spatial navigation. However, user agents may offer a way for the user to switch between different modes, or offer both based on different UI mechanisms.
~UAは、[ 空間的~navi用, ~scrolling用 ]のどちらに修飾keyなしの矢印~UIkeyを利用するか,利用者に選んでもらう設定を備えることもあろう。 別の~UAは、[ ~scroll用には修飾keyなしの矢印~UIkey ], 空間的~navi用には[ 矢印~UIkeyが `Shift$kY ~UIkeyと一緒に~pressされたとき,あるいは[ `W^kY `A^kY `S^kY `D^kY ]~UIkey ]を提供することもあろう。 矢印~UIkeyを~pressしたときに[ 空間的~navi, ~scrolling ]どちらかのみを応答として提供する可能性もある。 ◎ A user agent may have a setting to let the user choose between using the arrow keys without modifier keys for spatial navigation or for scrolling. Another one may offer scrolling on arrow keys without modifiers, and spatial navigation on arrow keys when pressed together with the Shift key, or on the W A S D keys. Offering only spatial navigation or only scrolling as responses to pressing arrow keys would also be possibilities.
5. ~JS~API
5.1. ~program的な~naviの誘発-法
`navigate()$m ~methodは、 空間的~naviを~program的に誘発することを作者に可能化する — 利用者が手動でそれを行なったかのように(一例として,矢印~UIkeyが空間的~naviを誘発する仕方である~browser内で矢印~UIkeyを~pressすることにより)。 ◎ The navigate() method enables the author to trigger spatial navigation programmatically, as if the user had done so manually (for instance, by pressing the arrow keys in a browser where that is the way to trigger spatial navigation).
注記: これは,手動~naviと同じ処理~modelを誘発するので、 まったく同じ結果 — 同じ~eventの連鎖が発火され,同じ要素が[ ~scroll/~focus ]されるよう — になるベキと期待される。 ◎ Note: As this triggers the same processing model as manual navigation, all the same results should be expected: the same chain of events will be fired and the same element will be scrolled or focused.
注記: これを利用すれば、 作者は,~UAがアテガうものと異なる~UIの仕組みに基づいて空間的~naviを誘発できる — [ 異なる~UIkeyに対応付ける / ~screen上の~click可能な十字キーから空間的~naviを誘発する / ~UI以外の~eventに対する反応において ]など。 それはまた、 作者が[ ~naviを中断して,何らかの非同期的な演算を行って(例:無限~scroller内にもっと内容を読込む),取消した所から~naviを再開したい ]と求めるときにも利用できる。 ◎ Note: The author can use this to trigger spatial navigation based on a different UI mechanism than the one assigned by the user agent, such as mapping to different keys, or triggering spatial navigation from a clickable on-screen directional pad, or in reaction to other events than UI ones. It could also be used when an author wants to interrupt navigation to do some asynchronous operation (e.g. load more content in an infinite scroller) then resume the navigation where they canceled.
注記: この~APIは、 ~testする目的にも有用になる — ~vendorに特有な~UI規約に依存しなければ,空間的~naviを誘発するのは困難なので。 ◎ Note: This API is also useful for testing purposes, as there it is difficult to trigger spatial navigation that does not depend on vendor specific UI conventions.
enum `SpatialNavigationDirection@I { `up@l, `down@l, `left@l, `right@l, }; partial interface `Window$I { `undefined$ `navigate$m(`SpatialNavigationDirection$I %dir); };
`navigate(dir)@m ~method~手続きは ⇒ ~IF[ %dir ~IN { `up^l, `down^l, `left^l, `right^l } ] ⇒ `空間的~navi手続き$( %dir ) ◎ When the navigate(dir) method is called, the user agent must run the following step: • If direction dir is "up", "down", "left", or "right", run the spatial navigation steps in dir.
この~APIの名前は、 論の最中にある。 [`3387$issue] ◎ The name of this API is under discussion [Issue #3387]
5.2. 低~levelな~API
これらの~APIは、 処理~modelに近く従っている低~levelな構成子として設計されている。 そのようなわけで、 それらは空間的~naviが働く仕方を拡張したり上書きしたいと求める作者に利用し易くあるベキである。 ◎ These APIs are designed to be low level constructs following the processing model closely. As such, they should be easy to use by the author who wants to extend or override the way spatial navigation works.
enum `FocusableAreaSearchMode@I { `visible@l, `all@l }; dictionary `FocusableAreasOption@I { `FocusableAreaSearchMode$I `mode@m; }; dictionary `SpatialNavigationSearchOptions@I { `sequence$<`Node$I>? `candidates@mSO; `Node$I? `container@mSO; }; partial interface `Element$I { `Node$I `getSpatialNavigationContainer$m(); `sequence$<`Node$I> `focusableAreas$m(optional `FocusableAreasOption$I %option = {}); `Node$I? `spatialNavigationSearch$m(`SpatialNavigationDirection$I %dir, optional `SpatialNavigationSearchOptions$I %options = {}); };
注記: 方向を表出する仕方は、 必要yなら,後で上下左右~naviより拡げることも許容するようにしてある。 方向を表す~keywordや数量的な角度もさらに追加され得る。 ◎ Note: The way the direction is expressed allows us to expand to more than 4-way navigation later if this is found necessary. More directional keywords or a numerical angle could be added.
注記: `focusableAreas()$m, `getSpatialNavigationContainer()$m ~methodは`~risk下$にある。 ◎ Note: the focusableAreas() and getSpatialNavigationContainer() methods are at-risk. ◎ When these methods are called, the user agent must run the steps described below:
`getSpatialNavigationContainer()@m ~method~手続きは: ◎ getSpatialNavigationContainer()
- ~EACH( コレの先祖 %先祖 ) に対し,コレに近いものから順に ⇒ ~IF[ %先祖 は`空間的~navi容器$である ] ⇒ ~RET %先祖 ◎ Return the nearest ancestor of the element that is a spatial navigation container, or\
- ~RET `文書$【コレの`~node文書$】 ◎ the document if the nearest spatial navigation container is the viewport.
注記: この要素~自身が`空間的~navi容器$であっても、 先祖(または文書)を返す。 ◎ Note: If the element is a spatial navigation container, getSpatialNavigationContainer() also returns the nearest spatial navigation container, not the element itself.
`focusableAreas(option)@m ~method~手続きは: ◎ focusableAreas(option)
- %可視のみか ~LET ~IS[ %option[ "`mode$m" ] ~NEQ `all$l ] ◎ Let visibleOnly be false if option is present and its value is equal to all, or true otherwise.
- %区画~群 ~LET `要素の中で~focus可能な区画を見出す$( コレ, %可視のみか ) ◎ Let areas be the result of finding focusable areas within the element with visibleOnly as argument.
- ~RET %区画~群 【を成す各~区画の`~DOM~anchor$からなる同順の~list】 ◎ Return areas
次の~codeは、 `focusableAreas()$m を利用して,現在の~page内の可視かつ~focus可能な要素~すべてを取得する方法を示す。 ~methodが`空間的~navi容器$を見出した場合、 その内側にある`~focus可能な区画$たちを再帰的に見出す。 この~methodに渡す %option の `mode$m ~memberは `visible^l に設定されているので、 `~scrollport$の内側にない要素は,~focus可能であっても結果から除外される。 ◎ The following code shows how to get all the visible focusable elements in the current page using focusableAreas(). If the method finds a spatial navigation container, it recursively finds focusable areas inside it. Because the value of the mode attribute in this method is visible, the focusable elements which aren’t inside the scrollport are excluded from the result.
<body> <button></button> <div style="width:300px; height:200px; overflow-x: scroll;"> <button style="left:25px;"></button> <button style="left:150px;"></button> <button style="left:350px;"></button> </div> </body>
const %focusableAreas = document.body.focusableAreas({mode: 'visible'}); %focusableAreas && %focusableAreas.forEach(%focusable => { %focusable.style.outline = '5px solid red'; });
この~codeの結果を下の図に示す: ◎ The figure below is the result of this code.
`spatialNavigationSearch(dir, options)@m ~method~手続きは: ◎ spatialNavigationSearch(dir, options) • Let direction be the value of dir.
- %容器 ~LET %options の `container$mSO ~member ◎ ↓
-
~IF[ %容器 は`空間的~navi容器$でない ]:
- ~IF[ %容器 ~EQ ~NULL ] ⇒ %容器 ~SET コレ
- %容器 ~SET %容器 の先祖の`空間的~navi容器$のうち %容器 に最も近いもの
- %区画~群 ~LET %options の `candidates$mSO ~memberに応じて ⇒# ~NULL でないならば その値 / ~ELSE_ `要素の中で~focus可能な区画を見出す$( %容器 ) ◎ Let areas be • the value of candidates attribute of options if it is not null, • result of finding focusable areas within container otherwise.
- ~RET `最良な候補を選定する$( %区画~群, %dir, コレ ) 【!within %容器 】 ◎ Return the result of selecting the best candidate among areas within container in direction from the element.
注記: 容器( `container$mSO )も候補の~list( `candidates$mSO )も供されていないとき、 これは,[ 先祖の`空間的~navi容器$のうち最も近いもの ]に限り,可視かつ`~focus可能な区画$たちを探索する。 何もない場合、 先祖上の連鎖を更に遡ることはなく,`結果は ~NULL になる。^em ◎ Note: When neither a container nor a list of candidates is provided, this only searches through the visible focusable areas of the nearest spatial navigation container ancestor. If there isn’t any, this does not climb further up the ancestry chain, and the result will be null.
7. ~navi上書き 施策により制御される特能
`~navi上書き@ ( `navigation-override^en )は,`施策により制御される特能$であり、[ ~page作者が[ 空間的~naviの挙動に対する制御を司る/空間的~naviを即座に取消す ]ことを可能化する仕組み ]の可用性を制御する。 ◎ The navigation-override policy-controlled feature controls the availability of mechanisms that enables the page author to take control over the behavior of spatial navigation, or to cancel it outright.
- この特能の名前は、 `navigation-override^l とする。 ◎ The feature name is "navigation-override"
- `~navi上書き$用の`既定の許容list$は、 `'self'^l とする。 ◎ The default allowlist for navigation-override is "self"
`§ ~navi$にて更なる詳細が定義されるように、 ある文書~内で`~navi上書き$が不能化された場合,~navi~event (`§ ~navi~event@#events-navigationevent$を見よ) は発火されないことになる。 ◎ As defined in further details in § 8.3 Navigation, if navigation-override is disabled in a document, the navigation events (see § 6 Navigation Events) will not be fired.
注記: これは、 敵対的な~iframeがこれらの~eventを利用して~focusを乗取ることを防止する。 空間的~navi以前に、 悪意的な作者が[ ~focusがどこへ行くか制御する,利用者の能 ]に干渉することにも利用できるような他の仕組みが存在することは認識されている。 にもかかわらず、 この攻撃~面を増やさない試みに~~価値はあると見受けられる — そのような攻撃は、 この試みを~~無為にするほど,すでに容易に遂行することがアリだが。 この論題に対し,実装の経験やそのような攻撃の軽減-法に基づく更なる~feedbackがあれば、 ぜひ寄せてほしい。 ◎ Note: This is to prevent a hostile iframe from using these events in order to hijack the focus. We recognize that there exist other mechanisms predating spatial navigation that malicious the author could use to interfere with the user’s ability to control where the focus goes. Despite that, it seems worthwhile to attempt not to increase this attack surface, although it is possible that such attacks are already sufficiently easy to perform that this is a lost cause. Further feedback on this topic, based on experience with implementation or with mitigating such attacks, is very welcome.
8. 処理~model
`§ 概観@#overview$ では、 空間的~naviがどう働くか, および この仕様の読者が頭の中に一般的な~modelを築き易くするための,高~levelな案を与えた。 それは,直感的だが精確でない各種用語を利用し、 可読性のため多くの詳細を伏せていた。 ◎ The § 3 Overview section gives a high level idea of how spatial navigation works, to help readers of this specification build a general mental model. It uses intuitive but imprecise terminology, and glosses over many details for the sake of readability.
この節では、 対応する規範的な挙動を定義し,その挙動を全部的に定義するために必要yな詳細を与えることを目指す。 ◎ This section defines the corresponding normative behavior and aims for as much detail as necessary to fully define the behavior.
8.1. 用語集
空間的~navi用の処理~modelを説明するため、 以下に与える用語が定義される。 更なる情報は、 定義の中の~linkを見よ。 ◎ The following term definitions have been specified to explain the processing model for spatial navigation. See the links within the definitions for more information.
~objの `境界~box@ ( `boundary box^en )は、 次に従って定義される: ◎ The boundary box of an object is defined as follows:
- ~objは~pointである場合 ⇒ その~point ◎ if the object is a point, the boundary box is that point
- ~objは[ `~box$/`~box断片$ ]である場合 ⇒ ~objの`~border~box$ ◎ if the object is a box or box fragment, the boundary box is the border box of that box or fragment
- ~objは`~focus可能な区画$であって要素でない場合 ⇒ ~objの限界~box — その各~辺は軸に平行な ◎ if the object is a focusable area which is not an element, the boundary box is the axis-aligned the bounding box of that focusable area
~objの `内側~区画@ ( `inside area^en )は、 次に従って定義される: ◎ The inside area of an object is defined as follows:
- ~objは`~scroll容器$である場合 ⇒ ~objの`最適な~view用~領域$ ◎ if the object is a scroll container, its optimal viewing region
- ~objは`文書$である場合 ⇒ ~objの`~node~navigable$の表示域 【!~node~navigable ~EQ ~NULL の場合にどうなるかは述べられていない。】 ◎ if the object is a document, the viewport of its browsing context
- ~objは[ `~box$/`~box断片$ ]である場合 ⇒ その`境界~box$ ◎ if the object is a box or box fragment, its boundary box
- 他の場合 ⇒ [ ~objに最も近い,先祖`~scroll容器$ ]の`最適な~view用~領域$ ◎ otherwise, the optimal viewing region of its nearest ancestor scroll container
注記: ~objが~screenから外れている場合、 `内側~区画$は,可視な先祖~容器のうち最も近いものになるべきである。 ◎ NOTE: If an object is offscreen, the inside area should be the nearest visible ancestor container.
~CSSには “`border-radius^p の様な隅~形状付け~propを織り込んだ~border~box” 用の用語があるベキである。 [`2324$issue] ◎ CSS should have a term for “border box taking into account corner shaping properties like border-radius”. [Issue #w3c/csswg-drafts#2324]
`探索~起点@ ( `search origin^en )は、 次にある~targetを探索するための起点である。 ◎ The search origin is the origin for searching next target.
`空間的~navi始点@ ( `spatial navigation starting point^en )は、 次にある~targetを探索するために~UAが設定した起点である。 それは、 初期~時には ε であり,要素にも~pointにもなり得る。 ◎ The spatial navigation starting point is the origin for searching next target which is set by the user agent. It is initially unset and it can be element or point.
注記: 例えば~UAは、[ 利用者が文書~内容~上で~clickしたときは ~clickした位置に設定する / (空間的~naviその他の手段により)~focusが移動されたときは ε に設定する ]こともできる。 ◎ Note: For example, the user agent could set it to the position of the user’s click if the user clicks on the document contents, and unset when the focus is moved (by spatial navigation or any other means).
~UAは、[ `空間的~navi始点$, `連列的~focus~naviの始点$ ]両者とも【非 ε に】設定する場合,それらを同じ値に設定するモノトスル。 ◎ If the user agent sets both a spatial navigation starting point and a sequential focus navigation starting point, they must not be set differently.
`空間的~navi~eventを配送する@ ときは、 所与の ( %~target, %~event名, %方向, %関係する~target ) に対し ⇒ `~eventを発火する$( %~target, %~event名, `NavigationEvent$I ) — 次のように初期化して ⇒# `dir$m ~SET %方向, `relatedTarget$m ~SET %関係する~target, `bubbles^m 属性 ~SET ~T, `cancelable^m 属性 ~SET ~T
【 この手続きは、 他所の記述を集約する/明確化するために,この訳に導入している。 】
8.2. 要素の~group化
空間的~navi用の処理~modelは[ 文書の~layout, ~focus可能な要素の相対的~位置 ]から働くが、 ~UAには,局所的かつ論理的な~group化から優先的に要素を見出すことが要求される — ~group化の内側で探してから、 相応しいものを見出せなかったときに限り,外側で~focus可能な要素を探すように(詳細は`§ ~navi$を見よ)。 ◎ While the processing model for spatial navigation is to work from the layout of the document and the relative position of focusable elements, the user agent is required to prioritize finding elements from a local logical grouping, only looking for focusable elements outside of the grouping if a suitable one cannot be found inside it (see § 8.3 Navigation for details).
そのような~group化は、 `空間的~navi容器@ ( `spatial navigation container^en )と呼ばれる。 ◎ Such groupings are called spatial navigation containers.
既定では、 `空間的~navi容器$は,次により確立される: ◎ By default, spatial navigation containers are established by:
- `~navigable$の表示域(`辿可能な~navigable$に制限されない) ◎ The viewport of a browsing context (not limited to the top-level browsing context)
- `~scroll容器$ ◎ scroll containers
`spatial-navigation-contain$p ~propを利用すれば、 `空間的~navi容器$を追加的に作成できる ( `§ 追加的な空間的~navi容器の作成-法@#container$を見よ)。 ◎ Additional spatial navigation containers can be created using the spatial-navigation-contain property (see § 9.1 Creating additional spatial navigation containers: the spatial-navigation-contain property).
8.4. ~focus~naviの経験則
注記: 次の~algoは、 Chrome の実装, および `旧 WICD 仕様@https://www.w3.org/TR/WICD/#focus-handling$ から着想されている。 これらの~approachより良い~approachや精緻化を見出した実装者には — この仕様の改善を~~促して,相互運用能を最大化するため — ~feedbackを供することが強く奨励される。 特に,~UAが`要素の中で~focus可能な区画を見出す$方法に分岐があると、 何らかの要素が~focus可能かどうかが~UAごとにまちまちになり,利用者にとって不都合になる。 ◎ Note: The following algorithms are inspired from Chrome’s implementation as well as from the old WICD Spec. Implementors who find better approaches or refinements to these approaches are strongly encouraged to provide feedback and help improve this specification in order to maximize interoperability. In particular, divergences in how user agents find focusable areas may cause some elements to be focusable in some user agents but not in others, which would be bad for users.
この節における幾何-演算は、 すべて,~CSS~layoutの結果に対し働くよう定義される — `相対~位置決め$や `CSS-TRANSFORMS-1$r などの すべての~graphicな変形nも含めて。 ◎ All geometrical operations in this section are defined to work on the result of CSS layout, including all graphical transformations, such as relative positioning or [CSS-TRANSFORMS-1].
`探索~起点を設定する@ ( `set the search origin^en )ときは、 次の手続きを走らす — 加えて,`探索~起点$をその結果に設定する: ◎ To set the search origin, run the following steps:
- %探索~起点 ~LET `現在の被focus区画$tlTの`~DOM~anchor$ ◎ Let searchOrigin be the DOM anchor of the currently focused area of a top-level browsing context.
- %始点 ~LET `空間的~navi始点$ ◎ ↓
- ~IF[ %始点 ~NEQ ε【!~NULL】 ]~AND[ %始点 は %探索~起点 の内側にある ] ⇒ ~RET %始点 ◎ If the spatial navigation starting point is not null and it is inside searchOrigin, then return it.
- ~RET %探索~起点 ◎ Otherwise, return searchOrigin.
%~focus~target の状態sが[ ~focusを移動する以外の何か ]により変化したときは、 `探索~起点を更新する@ — `探索~起点$を %~focus~target に応じて次の結果に設定する: ◎ If the status of focus target changed not by moving the focus, update the search origin as following:
【 これは他所にどう影響する? 上の~algoの最初の段における %探索~起点 の設定を以下に改めるのか?それとも結果を以下に改めるのか? 】【 以下に与える条件は、 おそらく 2, 3, 1 個目の順に優先されるべきであろう (例えば, “除去された” なら、 必然的に “具現化されていない” ことになる)。 】
- %~focus~target は[ `実際に不能化され$た/ `不活$になった/ `具現化され$なくなった ] ⇒ %~focus~target の`境界~box$ ◎ If focus target becomes actually disabled or expressly inert or not being rendered, then let searchOrigin be the boundary box of focus target.
- %~focus~target は`除去された$ ⇒ 除去される直前における, %~focus~target の`境界~box$ ◎ If focus target is removed, then let searchOrigin be the boundary box of focus target with the position of focus target when it existed.
- %~focus~target は完全に~screenから外れている ⇒ [ 可視な`空間的~navi容器$のうち, %~focus~target に最も近い【先祖である?】もの ]の表示域 ◎ If focus target is completely off-screen, then let searchOrigin be the viewport of focus target’s nearest visible spatial navigation container.
- 他の場合 ⇒ 【更新しない? “変化したとき” は上に挙げたもので網羅されている?】 ◎ ↑
注記: ~UAは、 例えば,~focusされている要素が[ ~mouseにより~scrollされた/表示域から消え失せた ]とき,`探索~起点を更新する$ベキである。 ◎ NOTE: The user agent should update the search origin, for example, when the focused element was scrolled out by mouse scrolling or vanished from the viewport.
`要素の中で~focus可能な区画を見出す@ ( `find focusable areas within a containing element^en )ときは、 所与の ( 要素 %C, 真偽値 %可視のみか (省略時は ~T )) に対し,次の手続きを走らす: ◎ To find focusable areas within a containing element C, with an optional visibleOnly argument that defaults to true, run the following steps:
- %~focus可能~集合 ~LET [ `~focus可能な区画$のうち,その`~DOM~anchor$は %C の子孫であるもの ]からなる`有順序~集合$ — ただし、 `~box$が何個かの`~box断片$からなる事例では,各`~box断片$を別々なものと見なす。 ◎ Let focusables be the set of all the focusable areas whose DOM anchor are descendants of C. In the case of boxes with several box fragments, each box fragment is considered separately.
-
~UAは、 次を行うベキである ⇒ %~focus可能~集合 から次を満たす~itemを`除去する$ ⇒ ~itemの`~DOM~anchor$の `tabindex$a 属性は負な値に設定されている ◎ The user agent should remove from focusables items that have a DOM anchor whose tabindex attribute is set to a negative value.
注記: これが、 “ベキ” とされているのは、[ `連列的~focus~navi順序$からは,負な~tabindexを伴う要素を除外する “ベキ” ]ものと `tabindex^a にて定義されているからである。 【`~tabindex値$を見よ。】 ◎ Note: This is a "SHOULD" in order to mirror the exclusion of elements with negative tabindex from the sequential focus navigation order as defined in tabindex.
-
~IF[ %可視のみか ~EQ ~F ] ⇒ ~RET %~focus可能~集合 ◎ If visibleOnly is false, return focusables.
注記: %~focus可能~集合 は空になることもある。 ◎ Note: focusables may be empty
-
%可視~集合 ~LET %~focus可能~集合 から次に該当する~itemを除去した結果 ⇒ その`境界~box$は %C の`内側~区画$に一部でも入らないもの ◎ Let visibles be the subset of items in focusables whose boundary box is at least partly within the inside area of C.
~scroll容器~内で現在~可視でない要素は除き、 空間的~naviは,~clickできない要素 — 例えば,他の要素により遮られていることに因り — を自動的に除外しない。 [ 利用者が そのような要素を実際に~focusして作動化した場合に,~app~logicにおける前提を覆す ]のを避けるため,および[ 不可視あるいは外見的に到達-不能な要素に~focusして,利用者を惑わす ]のを避けるためには、 作者は[ 要素を連列的~naviから到達-不能にするのと同じ最善な実施 ]を利用して,これらの要素を空間的~naviから到達-不能にするベキである — `tab-index="-1"^c や `inert$a 属性 などを利用して。 ◎ Except for elements that are in the currently non visible part of a scroller, spatial navigation does not automatically exclude elements which cannot be clicked on, for example, due to being obscured by some other element. To avoid breaking assumptions in the application logic if a user actually focuses and activates such an element, and to avoid confusing users by focusing invisible or apparently unreachable elements, the author should use make these elements unreachable to spatial navigation using the same best practices as for making elements unreachable to sequential navigation, such as using tab-index="-1" or the inert attribute.
-
~RET %可視~集合 ◎ Return visibles.
注記: %可視~集合 は空になることもある。 ◎ Note: visibles may be empty
`最良な候補を選定する@ ( `select the best candidate^en )ときは、 所与の ( `有順序~集合$ %候補~群, 方向 %方向, %探索~起点 ) に対し,次の手続きを走らす: ◎ To select the best candidate within a set of candidates in a direction dir, starting from searchOrigin, run the following steps:
- ~IF[ %候補~群 は`空$である ] ⇒ ~RET ~NULL ◎ If candidates is empty, return null
- ~IF[ %候補~群 は 1 個の~itemのみからなる ] ⇒ ~RET その~item ◎ If candidates contains a single item, return that item
- %内側~区画 ~LET %探索~起点 の`内側~区画$ ◎ ↓
- %境界~box ~LET %探索~起点 の`境界~box$ ◎ ↓
-
%内側にあるものたち ~LET [ %候補~群 を成す~itemのうち,その`境界~box$は ~OR↓ を満たすもの ]たちが成す下位集合: ◎ Let insiders be the subset of candidates
- %内側~区画 に全部的に重合する 【 %内側~区画 に入りきる?(完全に覆うのではなく)】 ◎ whose boundary box fully overlaps with inside area of searchOrigin
-
%内側~区画 に部分的に — %方向 に応じて次を満たすように — 重合する: ◎ whose boundary box partially overlaps with inside area of searchOrigin as
- `down$l ⇒ 上端~辺は %境界~box の上端~辺より下にある ◎ top edge is below the top edge of searchOrigin’s boundary box if dir is down
- `up$l ⇒ 下端~辺は %境界~box の下端~辺より上にある ◎ bottom edge is above the bottom edge of searchOrigin’s boundary box if dir is up
- `left$l ⇒ 右端~辺は %境界~box の右端~辺より左にある ◎ right edge is left of the right edge of searchOrigin’s boundary box if dir is left
- `right$l ⇒ 左端~辺は %境界~box の左端~辺より右にある ◎ left edge is right of the left edge of searchOrigin’s boundary box if dir is right
注記: 要素【~item】が %探索~起点 とどう重合するかについての より詳細な条件【何を指す?】は、 ~focusの動きが成す連列【`連列的~focus~navi順序$?】に影響する。 この連列は、 ~UXに関係するので,~UA定義な仕組みに依存する。 ◎ NOTE: More detail condition about how the element is overlapped with the search origin affects the sequence of focus movement. The sequence of focus movement is related to UX, so it depends on the UA-defined mechanism.
注記: この下位集合~化は、 要請された方向の反対へ行くのを避けるために必要yである。 ◎ Note: this sub-setting is necessary to avoid going in the opposite direction than the one requested.
-
~IF[ %内側にあるものたち は空でない ] ⇒ ◎ If insiders is non empty,
-
%最も近いものたち ~LET %内側にあるものたち を成す~itemのうち[ その`境界~box$は %方向 に応じて次を満たすもの ]からなる下位集合: ◎ Let closest subset be the subset of insiders whose boundary box’s
- `down$l ⇒ 上端~辺は %内側~区画 の上端~辺に最も近い ◎ top edge is closest to the top edge of inside area of searchOrigin if dir is down
- `up$l ⇒ 下端~辺は %内側~区画 の下端~辺に最も近い ◎ bottom edge is closest to the bottom edge of inside area of searchOrigin if dir is up
- `left$l ⇒ 右端~辺は %内側~区画 の右端~辺に最も近い ◎ right edge is closest to the right edge of inside area of searchOrigin if dir is left
- `right$l ⇒ 左端~辺は %内側~区画 の左端~辺に最も近い ◎ left edge is closest to the left edge of inside area of searchOrigin if dir is right
- %最も近いものたち から次を満たす~item %A をすべて除去する† ⇒ %最も近いものたち 内に別の~item %B が在って,次を満たす ⇒ [ %A, %B の`境界~box$は重合する ]~AND[ %A より %B の方が`~CSS塗ng順序$において上層にある ] ◎ If closest subset contains a single item, return that item, else return the first item of closest subset in document order, unless its boundary box overlaps with the boundary box of another item and that item is higher in the CSS painting order. In that case, return that item instead, unless it too is overlapped with another higher item, recursively.
- ~RET %最も近いものたち 内の文書~順序で最初の~item ◎ ↑
【† 原文の再帰を孕む記述は,解りにくい(そのまま訳すと条件の適用-順序が不明瞭になる)ので、 この訳では等価に変形している。 下に現れる似た記述も同様。 】
-
-
~ELSE: ◎ Else
-
%候補~群 ~SET %候補~群 を成す~itemのうち,その`境界~box$ %~item~box が[ %境界~box と重合しない ]~AND[ %方向 に応じて次を満たす ]ものからなる下位集合: ◎ Set candidates be the subset of its items which satisfies one of the following conditions: • the item doesn’t overlap with searchOrigin and its boundary box’s
- `down$l ⇒ 上端~辺は %境界~box の下端~辺より下にある ◎ top edge is below the bottom edge of searchOrigin’s boundary box if dir is down
- `up$l ⇒ 下端~辺は %境界~box の上端~辺より上にある ◎ bottom edge is above the top edge of searchOrigin’s boundary box if dir is up
- `left$l ⇒ 右端~辺は %境界~box の左端~辺より左にある ◎ right edge is left of the left edge of searchOrigin’s boundary box if dir is left
- `right$l ⇒ 左端~辺は %境界~box の右端~辺より右にある ◎ left edge is right of the right edge of searchOrigin’s boundary box if dir is right
- %候補~群 を成す ~EACH( %候補 ) に対し ⇒ %候補 の `距離^i ~SET `最短~距離を見出す$( %探索~起点【, %候補, %方向 】) 【!* "and candidate in direction dir" を削除したのは何故?】 ◎ For each candidate in candidates, find the shortest distance between searchOrigin.
- %候補~群 から次を満たす~itemをすべて除去する ⇒ %候補~群 内の別の~itemより `距離^i が長い ◎ Return the item of the candidates set that has the smallest distance.\
- %候補~群 から次を満たす~item %A をすべて除去する ⇒ %候補~群 内に別の~item %B が在って,次を満たす ⇒ [ %A, %B の`境界~box$は重合する ]~AND[ %A より %B の方が`~CSS塗ng順序$において上層にある ] ◎ If several have the same distance, return the first one in document order, unless its boundary box overlaps with the boundary box of another item at the same distance, and that item is higher in the CSS painting order. In that case, return that item instead, unless it too is overlapped with another higher item at the same distance, recursively.
- ~RET %候補~群 内の文書~順序で最初の~item ◎ ↑
-
`最短~距離を見出す@ ( `find the shortest distance^en )ときは、 所与の ( %基準, %候補, %方向 ) に対し,[ %基準 の境界~box / %候補 の境界~box ]の中にある~point[ %P1 / %P2 ]を見出す — 次に定義される %距離 を最小~化するような ⇒ %距離 ~EQ %~euclidean距離 ~PLUS %転移 ~MINUS %整列 ~MINUS %重合する面積の平方根 ◎ To find the shortest distance between a reference and a candidate in direction dir, find the points P1 and P2, respectively within the boundary boxes of the reference and of the candidate, that minimize the distance as defined as below: • distance = euclidean + displacement - alignment - sqrt(Overlap)
各~項の意味は、 以下に従う: ◎ The meaning of each term is as follows:
- %~euclidean距離
- %P1 から %P2 までの~euclidean距離 ◎ The euclidean distance between P1 and P2
- %転移
- [ %基準, %候補 ]どうしの %方向 における転移の度合い【直交-方向におけるずれ】 ⇒ %転移 ~EQ ( ( %方向 に直交な軸における %P1 から %P2 までの絶対~距離 ) ~PLUS %直交-偏り ) ~MUL %直交-重み ◎ The degree of displacement in dir between the reference and the candidate, defined as ◎ displacement = (absolute distance on the axis orthogonal to dir between P1 and P2 + orthogonalBias) * orthogonalWeight
- %直交-偏り
-
%方向 に応じて:
- `left$l / `right$l ⇒ %基準 の限界~boxの縦幅 ~DIV 2
- `up$l / `down$l ⇒ %基準 の限界~boxの横幅 ~DIV 2
限界~boxの各~辺は、 軸に平行とする
◎ If the dir is left or right, the height of the axis-aligned bounding box of reference / 2 ◎ Else if the dir is up or down, the width of the axis-aligned bounding box of reference / 2 - %直交-重み
-
%方向 に応じて:
- `left$l / `right$l ⇒ 30
- `up$l / `down$l ⇒ 2
- %整列
- %方向 における %基準, %候補 どうしの整列の度合い ⇒ %整列 ~EQ %整列-偏り ~MUL %整列-重み ◎ The degree of alignment in dir between the reference and the candidate, defined as: • alignment = alignBias * alignWeight
- %整列-偏り
-
%方向 に応じて:
- `left$l / `right$l ⇒ %射影が重合する長さ ~DIV %基準 の限界~boxの縦幅
- `up$l / `down$l ⇒ %射影が重合する長さ ~DIV %基準 の限界~boxの横幅
限界~boxの各~辺は、 軸に平行とする
◎ If the dir is left or right, projectedOverlap / height of the axis-aligned bounding box of reference ◎ Else if the dir is up or down, projectedOverlap / width of the axis-aligned bounding box of reference - %射影が重合する長さ
-
%方向 に応じて:
- `left$l / `right$l ⇒ [ %基準, %候補 ]の横方向への射影が縦~軸~上で重合する長さ
- `up$l / `down$l ⇒ [ %基準, %候補 ]の縦方向への射影が横~軸~上で重合する長さ
- %整列-重み
- 5
- %重合する面積の平方根
- %基準, %候補 が[ 重合するならば その面積の平方根 / 重合しないならば 0 ] ◎ The square root of area of overlap between the reference and the candidate, or 0 if they do not overlap.
注記: この一般~公式は、 いくつかの,良さげな代替から選取られた — 一連の `~UX~test事例@https://wicg.github.io/spatial-navigation/tests/ux/list.html$ にて、 最良な候補を選定するために利用されるとき,最も直感に合致するものに基づいて。 同様に, %整列-重み, %直交-重み の値も同じ~test事例に基づいて試験的に決定された。 結果の公式は、 いくぶん複雑ではあるが,良い答えを与えるように見受けられる。 改善や単純~化の示唆があれば寄せてほしい。 ◎ Note: This general formula was picked from several plausible alternatives, based on which one most often matches intuition when used to select the best candidate in a series of UX test cases. Similarly, the values of alignWeight and orthogonalWeight were also determined experimentally based on the same test cases. The resulting formula is somewhat complicated, but seems to give good answers. Suggestions for improvements or simplifications are welcome.
9. 宣言的な手段による空間的~naviの制御-法
9.1. 追加的な空間的~navi容器の作成-法: `spatial-navigation-contain^p ~prop
◎名 `spatial-navigation-contain@p ◎値 `auto^v | `contain$v ◎初 `auto^v ◎適 すべての要素 ◎継 されない ◎百 受容しない ◎算 指定されたとおり ◎順 文法に従う ◎ア 離散的 ◎表終- `auto^v
- 当の要素は`~scroll容器$である場合に限り,`空間的~navi容器$を確立する ◎ If the element is a scroll container then it establishes a spatial navigation container, otherwise it does not.
- `contain@v
- 当の要素は`空間的~navi容器$を確立する ◎ The element establishes a spatial navigation container
注記: 加えて、 `§ 要素の~group化@#grouping$に従い,`~navigable$(`辿可能な~navigable$に制限されない)の表示域も`空間的~navi容器$を確立する。 ◎ Note: In addition, as per § 8.2 Groupings of elements, the viewport of a browsing context (not limited to the top-level browsing context) also establishes a spatial navigation container.
次の例は、 単純~化された~TV番組表を示す。 それは、 番組を表現している要素たちが成す格子があり,その周りにいくつか~UI~buttonを備える。 ◎ The following example shows a simplified TV program schedule or calendar. It has a grid of elements representing TV shows or calendar entries and some UI buttons around it.
この事例では,格子の中はスカスカである。 なので、 利用者が "Foo" から下へ移動しようと試行した場合、 ~focusは "次週" へ移動することになる — それが下~方向において~~目的により近いので。 同じことは "Bar" から 下へ行くときも該当し、 ~focusは "前週" へ移動することになる。 ◎ In this case, the grid is quite sparse, so if the user tries to move down from "Foo", focus would be moved to "Next Week", as it is objectively closer in the down direction. The same is true for going down from "Bar": the focus would be moved to "Previous Week".
月 | 火 | 水 | 木 | 金 | 土 | 日 | |
---|---|---|---|---|---|---|---|
0 〜 6時 | `Foo@#$ | ||||||
6 〜 9時 | `Bar@#$ | ||||||
9 〜 12時 | `Bat@#$ | ||||||
12 〜 18時 | |||||||
18 〜 21時 | `Woo@#$ | ||||||
21 〜 24時 | `Baz@#$ |
<div> <button>前週</button> <table><tbody><tr><td><th>月<th>火<th>水<th>木<th>金<th>土<th>日 <tr><td>0 〜 6時<td><td><td><td><td><td><td><a href="#">Foo</a> <tr><td>6 〜 9時<td><a href="#">Bar</a><td><td><td><td><td><td> <tr><td>9 〜 12時<td><td><a href="#">Bat</a><td><td><td><td><td> <tr><td>12 〜 18時<td><td><td><td><td><td><td> <tr><td>18 〜 21時<td><td><td><td><td><td><td><a href="#">Woo</a> <tr><td>21 〜 24時<td><td><td><td><td><td><a href="#">Baz</a><td> </tbody></table> <button>次週</button> </div>
しかしながら,~table内の要素たちは互いが意味論的に関係するので、 作者は,[ 格子~内の~itemが~focusされるときの,格子の内側における動き ]に優先度を与えて,異なる~navi体験を供したいと求めることもあろう。 ◎ However, the author may want to provide a different navigation experience giving priority to movements inside the grid once you have focused one of its items because the elements in the table are semantically related to each other.
~stylesheetに `table { spatial-navigation-contain: contain; }^css を追加すれば、 そのような挙動になる — その結果、 ~focusは,[ "Foo" から下へは "次週" に代えて "Woo" / "Bar" から下へは "前週" に代えて "Bat" ]へ移動することになる。 ◎ Adding table { spatial-navigation-contain: contain; } to the stylesheet would result this behavior. ◎ After that, the focus would move down from "Foo" to "Woo" instead of "Next Week", and from "Bar" to "Bat" instead of "Previous Week".
~focusを~tableの外へ移動することも,依然としてアリになる。 例えば、 "Foo" から右へ行くことにより,~focusは "次週" へ移動することになる — 格子~内には、 "Foo" の右には何もないので。 ◎ It would still be possible to move the focus out of the table. For example, the focus would be move to "Next week" by going right from "Foo" since there is nothing in the grid that is to the right.
注記: `spatial-navigation-contain$p ~propは`~risk下$にある。 ◎ Note: the spatial-navigation-contain property is at-risk.
付録 A. ~scroll拡張
この節は、 ~CSSに対する少数の拡張を提案する。 それは,上流~仕様に統合されるベキであるが、 それまでは,ここに~hostされる。 ◎ This section proposes a few extensions to CSS that should be integrated in upstream specifications, but are hosted here until then.
この様な各種用語は、 `CSSOM-VIEW-1$r, `CSS-OVERFLOW-3$r, `CSS-SCROLL-SNAP-1$r にて与えられる~ベキである。 [`2322$issue] ◎ Terminology like this should be in [CSSOM-VIEW-1], [CSS-OVERFLOW-3], [CSS-SCROLL-SNAP-1]. [Issue #w3c/csswg-drafts#2322]
~AND↓ を満たす要素 %要素 は、 所与の方向 %方向 へ `手動で~scrollできる@ ( `can be manually scrolled^en )とされる: ◎ An element e can be manually scrolled in a given direction d if:
- %要素 が確立する`首要~box$ %~box は、 `~scroll容器$である ◎ The principal box established by e is a scroll container, and
-
%方向 に応じて,次が満たされる:
- `up^l / `down^l ⇒ %要素 の `overflow-y$p ~propの算出d値 ~NEQ `hidden$v ◎ if d is up or down, the computed value of the overflow-y property is not hidden, and
- `left^l / `right^l ⇒ %要素 の `overflow-x$p ~propの算出d値 ~NEQ `hidden$v ◎ if d is left or right, the computed value of the overflow-x property is not hidden, and
- %~box は %方向 において`~scroll境界$に来てはいない ◎ e is not at the scroll boundary in the direction d
- %~box は %方向 において最後の `mandatory$v `留め位置$に留められてはいない ◎ e is not snapped to the last mandatory snap point in direction d
`CSSOM-VIEW-1$r は、 おそらく[ 明示的な位置を伴わずに所与の方向へ~scrollを遂行する方法 ]を定義するベキである。 それまでは、 ここに自前の~algoを与える。 [`2323$issue] ◎ [CSSOM-VIEW-1] should probably define how to perform a scroll in a given direction without an explicit position. Until then, we roll our own. [Issue #w3c/csswg-drafts#2323]
`要素をある方向へ~scrollする@ ( `directionally scroll an element^en )ときは、 所与の ( %要素, %方向 ) に対し: ◎ To directionally scroll an element e in direction dir:
- %距離 ~LET ~UAにより定義される距離 ◎ Let d be a user agent defined distance.
- %x ~LET x 軸における, %要素 の現在の~scroll位置 ◎ Let x be e’s current scroll position on the x axis.
- %y ~LET y 軸における, %要素 の現在の~scroll位置 ◎ Let y be e’s current scroll position on the y axis.
- %位置 ~LET %方向 に応じて ⇒# `up^l ならば ( %x, %y ~MINUS %距離 ) / `down^l ならば ( %x, %y ~PLUS %距離 ) / `left^l ならば ( %x ~MINUS %距離, %y ) / `right^l ならば ( %x ~PLUS %距離, %y ) ◎ ↓
- `要素を~scrollする$( %要素, %位置 ) `CSSOM-VIEW-1$r ◎ Use the scroll an element algorithm from [CSSOM-VIEW-1] on e to • (x, y - d) if dir is up • (x, y + d) if dir is down • (x - d, y) if dir is left • (x + d, y) if dir is right
付録 B. ~privacyと~securityの考慮点
この仕様の貢献者たちは、 この仕様に関わる既知な~security~riskは,すべて必要十分に取組まれたものと予見している。 更なる詳細は、 下に供される。 ◎ The specification contributors believe that all known potential security risks associated with this specification have been adequately addressed. Further details are provided below.
TAG 【 `W3C Technical Architecture Group^en 】は、 各[ 編集者/ Working Group ]が~~策定する仕様により導入され得る~riskを評価し易くするための`自己-考査~質問票@~SECQ$を開発した。 その回答は、 以下に供される 【この訳では、~~影響があるものだけ挙げる(他の質問に対する回答は “いいえ” 等)】: ◎ The TAG has developed a self-review questionnaire to help editors and Working Groups evaluate the risks introduced by their specifications. Answers are provided below.
- この仕様は、 これまで~accessし得なかった他の~dataを生成元に公開するか? ◎ Does this specification expose any other data to an origin that it doesn’t currently have access to?
- ほぼ無い。 ◎ Mostly, no.
- 唯一の例外は、 ~focusが非同一-生成元~iframe内にある間に,作者が `window.navigate^c を利用する局面においてある: ~eventがまっく取得されないことは、 ~iframeの中に[ ~scroll可能/~focus可能 ]な何かが在ったことを意味することになる — それらが~eventを取得する唯一の事例は,~treeを遡って探索しても何も見出されなかったときに限られるので。 ◎ The one exception identified would be in the following scenario: if the author uses `window.navigate` while the focus is in a cross origin iframe, if they don’t get an event at all it means that either there was something scrollable or focusable within the iframe, as the only case where they’d get an event is when the search didn’t find anything at all goes up the tree.
- これは,そのように制限された情報なので、 本当の~security~riskを導入するとは見受けられないが、 作者が他では取得できなかった情報を取得できるとは言えよう。 ◎ This is so limited information that it does not seem it would introduces real a security risk, but it is as far as the editors can tell information that the author could not get could not get otherwise.
- この仕様は、 ~UAの~native~UIに対する何らかの制御を生成元に許容するか? ◎ Does this specification allow an origin some measure of control over a user agent’s native UI?
- ~UAの~UIの外観に対する制御は与えられないが、 ~UAが空間的~naviをどう遂行するかには,いくぶんの制御を与える — それは、 ~UIの一部を成すものと見なされ得る。 これは、 作者が自身の~pageにおける空間的~naviの挙動を誂えれるよう,意図的である。 利用者の[ ~focusを制御する/文書を~navigateする ]欲求に悪意的な作者が干渉するのを防止するため、 この上書きする仕組みは,非同一-生成元~iframe用には既定で不能化される。 `§ ~navi上書き 施策により制御される特能@#policy-feature$を見よ。 ◎ No control is given over the appearance of the user agent’s UI. Some control is given over how the user agent performs spatial navigation, which may be considered part of its user interface. This is intentional, to let the author tailor the behavior of spatial navigation to their pages. To prevent malicious the author to interfere with the users' desire to control focus and navigate the document, this overriding mechanism is disabled by default for cross-origin iframes. See § 7 The navigation-override policy-controlled feature.
- この仕様は、 既定の~security特性の降格を許容するか? ◎ Does this specification allow downgrading default security characteristics?
- 無関係な~securityの仕組みに対しては、 降格を許容しない。 ◎ It does not allow downgrading any unrelated security mechanism.
- [ 非同一-生成元~iframe内の空間的~naviの既定の挙動を上書きするために必要な~eventを許容すること ]を,作者が信用する `feature-policy$r を利用して~~任意選択することを作者に`許容する^em。 `§ ~navi上書き 施策により制御される特能@#policy-feature$を見よ。 ◎ It **does** allow the author to opt into allowing the events needed to override the default behavior of spatial navigation in cross origin iframes they trust using [feature-policy]. See § 7 The navigation-override policy-controlled feature.
謝辞
編集者は、 この仕様に~feedbackを寄せられ,貢献された次の方々に感謝したい: ◎ The editors of this specification would like to thank the following individuals for their feedback and contributions (in alphabetical order):
変更点
◎非規範的- `2019年 4 月 23日 最初の公な作業草案@~TR/2019/WD-css-nav-1-20190423/$ からの変更点 ◎ The following changes were made since the 23 April 2019 First Public Working Draft.
- `getSpatialNavigationContainer()$m を、 最も近い先祖の`空間的~navi容器$を返すよう,変更した。 ◎ Changed the result of getSpatialNavigationContainer() to return the nearest spatial navigation container ancestor
- `spatial-navigation-function$p を追加した。 ◎ Added spatial-navigation-function
- `探索~起点を更新する$段を追加した。 ◎ Added updating the search origin step
- `spatialNavigationSearch()$m の~IDLを, `SpatialNavigationSearchOptions$I から `dir^m 属性を分離するように変更した。 ◎ Changed the IDL of spatialNavigationSearch() as separating the dir attribute from SpatialNavigationSearchOptions
- 到達-不能になるのを修正するため、 探索~起点に全部的に重合している~focus可能な要素は,`空間的~navi容器$でなくとも候補になるようにした。 ◎ Made the focusable element fully overlapped with search origin which is not the spatial navigation container as a candidate for fixing the unreachability