焦点

フォーカス (Web)

[54] Web では、利用者によって特に操作対象として選択された状態の要素その他のオブジェクトをフォーカス (focus) を持つといいます。

仕様書

定義

[50] 一般に GUI システムは制御子などのウィジェットのうちいずれかが「フォーカス」 を持つこととし、キーボード等の入力をそのウィジェットに対して送信します。 CUI対話的アプリケーションも同様の概念を持っているのが一般的です。 Web におけるフォーカスはこれらの仕組みを利用して、あるいは模倣して実装されることが想定しています。

[51] システム全体に複数のプロセスがあったり、その内の Webブラウザーの中でもタブが複数あったり、 メニューやボタンなど閲覧文脈以外の UI 要素が存在したりします。いずれにせよ、そうした最上位閲覧文脈より外側の部分の (Webページ側から感知し得ない) 範囲におけるフォーカスは「システムフォーカス」 と呼ばれています。

[52] 更にそれぞれの閲覧文脈の内部には色々な要素フォーム制御子等の要素よりも細かい操作単位が存在しています。 そうした閲覧文脈内のものがフォーカスを持つことができますが、何もフォーカスされていない状態もあり得ます。

[48] 最上位閲覧文脈システムフォーカスを有しているかとその最上位閲覧文脈内の要素フォーカスを持っているかは独立していなければなりません>>41 従って影に隠れているタブに表示されている文書であっても、いずれかの要素フォーカスを持っている可能性があります。

[53] 言い換えると Page Visibilityフォーカスの有無は独立しています。

[49] ある最上位閲覧文脈内には iframe などで埋め込まれた別の閲覧文脈が含まれていることがあります。 子閲覧文脈フォーカスされているときは、その閲覧文脈包含子もまたフォーカスされていなければなりません >>41。ですから iframe 要素の中に表示されている要素フォーカスを持っているなら、 iframe 要素もまたフォーカスを持つこととなります。

[47] フォーカス閲覧文脈Document ごとに個別に管理しても構いませんし、 最上位閲覧文脈ごとに一つだけとしても構いません。どうするかはプラットフォームの慣習に従うべきです>>41

キーイベントの処理

[80] フォーカスキーイベントの関係は、キーイベントを参照。

:focus 擬似クラス

[12] :focus 擬似クラスは、焦点を持っている要素に適用されます >>11

仕様書

意味

[13] :focusフォーカスを持っている要素に適用されます。 フォーカスを持っている要素は、鍵盤イベントマウスイベント、その他の入力を受け付けます。 >>11

[14] 文書言語実装はどの要素:focus が適用されるかを制限するかもしれません。 >>11

[64] 要素がフォーカスを持つ (element has the focus) とは、

... ことをいいます >>63

歴史

CSS2

[16] :focus>>26 で追加されました。

CSS UI

[17] 古い CSS UI の仕様は 'user-input: enabled'要素にだけ :focus が適用される、と改訂していましたが、この仕様は放棄されて現在に引き継がれていないようです。 >>25 の次の CR で削除されています。

[28] その後は単に選択子3を参照するだけになっています。

[23] Web Controls 1.0CSS UI を更に拡張してWebアプリケーションが状態を制御できるようにする構想を持っていました。

HTML Standard

[62] 2014年の HTML Standard におけるフォーカス全体の改訂の一環として :focus の定義も明確化されました。

歴史

焦点 (HTML4)

[1] HTML 文書では、要素は活性化してその仕事を行うために利用者から焦点を受取らなければなりません。例えば、利用者は a 要素で指定されたリンクをたどるためにリンクを活性化しなければなりません。同様に、利用者は文章を入力するためには textarea に焦点を与えなければなりません。

というのが HTML における焦点 (focus) です。 フォームの章で規定されており、フォーム制御子に関して特に重要な意味を持ちますが、 a 要素が例に挙げられている通り、フォーム特有の概念ではないようです。

[3] 要素に焦点を与える方法は幾つもあります HTML 4

  • 指示装置で要素を指定する。
  • 鍵盤である要素から次の要素に移動する。
    • 著者は、タブ順 (要素が焦点を受取る順) を指定できる (tabindex)。
    • 要素は、ひとたび選択されれば、何か他の打鍵で活性化できるかもしれない。
  • アクセス鍵 (accesskey) によって要素を選択する。
    • 鍵盤近道とか鍵盤アクセス子とか言うこともある。

仕様書にはちゃんと書いてありませんが、当然、 どのような方法が利用可能であるかや、具体的にどう操作するかは、 その UA や使用する環境その他に大きく左右されることになります。 特に、多くの利用者界面システムは元々焦点のような概念を持っていますから、 普通 UA はその概念の元で表示した HTML 文書を操作できるようにしています。

[4] HTML 4 仕様書は活性化 (activate) 焦点 (focus) についての概念が少々混乱しているように見受けられます。 焦点は 17.11 節で an element must receive focus from the user in order to become active and perform its tasks と定義されています。つまり、焦点を受取ると要素は活性になり、 定められた仕事を行います。

それでは焦点を受取ることと活性化が実際上同じなのかと思うと、 次の 17.11.1 節のタブ順序 (tabbing order) と矛盾します。 The tabbing order defines the order in which elements will receive focus when navigated by the user via the keyboard. ですから、タブ移動は焦点移動です。 しかし、 users must activate a link specified by the A element in order to follow the specified link ですから、焦点受領と活性化が同じことであるなら、 リンクにタブ移動すると他の頁に飛ばされてしまいます。そのような解釈は不適切でしょう。

また、 Note として、 The actual key sequence that causes tabbing navigation or element activation depends on the configuration of the user agent (e.g., the "tab" key is used for navigation and the "enter" key is used to activate a selected element). とあります。どうやら、タブ navigation要素活性化の2つの操作があるようです。 タブ順序の定義より、前者が焦点を受取ることと解するのが自然でしょう。 また、 tabbing navigation の結果要素は選択されるようです。 17.11 節にも、タブで要素を選択してから活性化するというようなことが同じような感じで書かれています。

ここまでで、どうやら少なくてもタブ移動に関しては、焦点の移動と活性化は別の操作であり、 焦点を受取る (選択する) と活性化できるらしいことが分かりました (最初の定義に少々疑問が残りますが)。では、更に読み進めて、 17.11.2 節 (accesskey) をみてみましょう。

Pressing an access key assigned to an element gives focus to the element. The action that occurs when an element receives focus depends on the element. For example, when a user activates a link defined by the A element, the user agent generally follows the link. When a user activates a radio button, the user agent changes the value of the radio button. When the user activates a text field, it allows input, etc.

アクセス鍵を押すと要素は焦点を受取ります。焦点を受取った際の挙動は要素依存です。 ここまで最初の2文は何ら問題ありません。ところが、次の For example 以降が、なぜか突然活性化の話題になっています。 ここに書かれえているラジオ・ボタンや文章入力の挙動は焦点を受取った時の挙動として実装しても問題はなさそうですが、 リンクを飛んでしまうのは困ります。

更に、次の段落では例を挙げつつ Typing the access key gives focus to the label which in turn gives it to the associated control. The user may then enter text into the INPUT area. と言っています。仕様書著者の脳内 UA では、 文章入力欄が焦点を受取ると既に利用者が入力可能な状態になっているようです。 また、その次の a 要素の例では、 Typing this access key takes the user to another document とされています。ここでも、アクセス鍵を打鍵しただけでリンクは活性化して飛んでいくようです。

というわけで、どうやら、焦点を受取る (要素を選択する) ことと活性化することは、同時に起こることもあれば別々に起こることもある、 とでもまとめるしかなさそうです。

[5] 実際の UA は、 a によるリンクや押しボタン制御子に関連付けられたアクセス鍵を打鍵した時に焦点を受取るだけのものもあれば、 活性化してしまうものもあります。そのような実装の違いも、 仕様書の分かりにくい記述のせいかもしれません。 (あるいは仕様書が混乱しているのは当時の実装のせいかもしれません。)

[6] 活性というのが既存の GUI システム類で焦点に近い意味でも使われているのも混乱の原因かも。

属性集合 %focus; (XHTML 1.0)

[7] XHTML 1.0 では焦点を得られる要素焦点に関する属性引数実体 %focus; で定義しています。

[9]

属性名属性値既定値説明状態出典
accesskey%Character;W3C 勧告[XHTML 1.0]
onblur%Script;焦点喪失時W3C 勧告[XHTML 1.0]
onfocus%Script;焦点受領時W3C 勧告[XHTML 1.0]
tabindex%Number;タブ付け順序W3C 勧告[XHTML 1.0]

メモ

[10] Web Applications 1.0 r5911 Define when the platform-specific focusing behavior happens relative to focus events, etc. ( ( 版)) http://html5.org/tools/web-apps-tracker?from=5910&to=5911

[27] Web Applications 1.0 r6876 Clarify what is focused in the iframe's owner document when an iframe's child document is focused. ( ( 版)) http://html5.org/tools/web-apps-tracker?from=6875&to=6876

[30] Web Applications 1.0 r7458 Make UA-provided focusable controls that are part of other elements be focusable. ( ( 版)) http://html5.org/tools/web-apps-tracker?from=7457&to=7458

[31] Web Applications 1.0 r7459 Allow even more flexibility in deciding what's focusable. ( ( 版)) http://html5.org/tools/web-apps-tracker?from=7458&to=7459

[32] Web Applications 1.0 r7498 Another attempt at defining tabindex, :disabled, what can be focused, etc. ( ( 版)) http://html5.org/tools/web-apps-tracker?from=7497&to=7498

[33] WICD Core 1.0 ( ( 版)) http://www.w3.org/TR/WICD/#focus-handling

[34] WICD Mobile 1.0 ( ( 版)) http://www.w3.org/TR/WICDMobile/#focus-navigation-model

[35] [whatwg] Should scrollbars move focus? ( ( 版)) http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2012-December/038478.html

[36] XBL 2.0 ( ( 版)) http://dev.w3.org/2006/xbl2/Overview.html#the-focus-domfocusin-blur-and-domfocusou

[37] Web Applications 1.0 r8323 Make the fragment identifier handling rules match browsers better ( ( 版)) http://html5.org/tools/web-apps-tracker?from=8322&to=8323

[38] IRC logs: freenode / #whatwg / 20131209 ( ( 版)) http://krijnhoetmer.nl/irc-logs/whatwg/20131209#l-812

[39] Bug 23475 – <dialog>: Clarify how <dialog> elements can be given "window focus" ( ( 版)) https://www.w3.org/Bugs/Public/show_bug.cgi?id=23475

[40] Web Applications 1.0 r8338 Make <dialog> autofocus the first focusable control if there isn't one with autofocus=.]] ( ( 版)) http://html5.org/tools/web-apps-tracker?from=8337&to=8338

[55] IRC logs: freenode / #whatwg / 20140115 ( ( 版)) http://krijnhoetmer.nl/irc-logs/whatwg/20140115

[56] Bug 23475 – <dialog>: Clarify how <dialog> elements can be given "window focus" ( ( 版)) https://www.w3.org/Bugs/Public/show_bug.cgi?id=23475

[57] Accessible Rich Internet Applications (WAI-ARIA) 1.0 ( ( 版)) http://www.w3.org/WAI/PF/aria/complete#host_general_focus

[58] XML Binding Language (XBL) 2.0 ( ( 版)) http://www.w3.org/TR/2007/CR-xbl-20070316/#the-focus

[59] IRC logs: freenode / #whatwg / 20140219 ( ( 版)) http://krijnhoetmer.nl/irc-logs/whatwg/20140219

[60] Web Applications 1.0 r8478 Revamp how focus is defined, to actually handle things we've ignored before, like viewports and scrollable regions ( ( 版)) http://html5.org/tools/web-apps-tracker?from=8477&to=8478

[68] Techniques for WCAG 2.0 ( ( 版)) http://www.w3.org/TR/2014/NOTE-WCAG20-TECHS-20140311/complete.html#G107

[69] Notifications API Standard ( ( 版)) http://notifications.spec.whatwg.org/#activating-a-notification

[70] Web Applications 1.0 r8621 Spec relatedTarget for focus and blur ( ( 版)) http://html5.org/tools/web-apps-tracker?from=8620&to=8621

[71] Clarify window.focus() note somewhat. · 357b2aa · whatwg/notifications ( ( 版)) https://github.com/whatwg/notifications/commit/357b2aa00f9a328f8e545264296834f672922e01

[72] Web Applications 1.0 r8810 Try to match browsers better around focus. ( ( 版)) https://html5.org/r/8810

[73] Bug 24720 – <dialog>: New <dialog>- and focus-related APIs ( ( 版)) https://www.w3.org/Bugs/Public/show_bug.cgi?id=24720

[74] Web Applications 1.0 r8845 Define how focus sequential navigation works in slightly more detail; make navigating to an unfocusable control lead to the viewport being refocused. ( ( 版)) https://html5.org/r/8845

[75] <a> - HTML (HyperText Markup Language) | MDN ( ( 版)) https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#Clicking_and_focus

[76] csswg: changeset 14820:2539f118cb22 ( ( 版)) https://dvcs.w3.org/hg/csswg/rev/2539f118cb221178eeeb0e27c377e78b2feeb650

[77] Better Focus Navigation for Shadow DOM - Google ドキュメント ( ( 版)) https://docs.google.com/document/d/1k93Ez6yNSyWQDtGjdJJqTBPmljk9l2WS3JTe5OHHB50/edit#

[78] Tabindex Focus Navigation Explainer - Google ドキュメント ( 版) https://docs.google.com/document/d/1k93Ez6yNSyWQDtGjdJJqTBPmljk9l2WS3JTe5OHHB50/edit#heading=h.qjtlohzbc5ms

[79] Re: Making ARIA and native HTML play better together (Maciej Stachowiak 著, 版) https://lists.w3.org/Archives/Public/public-webapps/2015AprJun/0626.html

<input type=button> is not keyboard-focusable on Safari for Mac but it is mouse-focusable. Likewise in Safari on iOS (both if you connect a physical keyboard, and if you use the onscreen focus-cycle arrows in navigation view).

[42] IRC logs: freenode / #whatwg / 20150728 ( 版) http://krijnhoetmer.nl/irc-logs/whatwg/20150728

# [12:59] <annevk> MikeSmith: in some browsers anyway you can get blur events fired when a focused element is removed from the tree

# [12:59] <annevk> MikeSmith: same for focusout and there should be some trick for getting that with focusin/focus

[43] Replace Focus section with a reference to HTML's focus processing model. · w3c/svgwg@6997e03 ( 版) https://github.com/w3c/svgwg/commit/6997e031b59eaf4ca39a3d645dbdb1dfc6dbc47c

[44] Don't repeat events defined in other specs. · w3c/svgwg@ba6ff23 ( 版) https://github.com/w3c/svgwg/commit/ba6ff23e1e90914465633294eebc091f6065e0d6

[45] Fix #559: require focus movement on scrolling to a fragment ID · whatwg/html@414bee7 ( 版) https://github.com/whatwg/html/commit/414bee7380eef0aa4487c44e2008eef6dcfb9ee4

[46] Fix #744: clarify control groups and control group owner objects · whatwg/html@9194856 ( 版) https://github.com/whatwg/html/commit/9194856d7b5a91aa910640e5686048317924e7aa

[81] Don't unset the sequential focus navigation starting point · whatwg/html@b466ad7 ( 版) https://github.com/whatwg/html/commit/b466ad7ce49676873ddade4c473b7c983803bfd4

[82] Editorial: synchronize with the DOM Standard · whatwg/html@21c6ec7 ( 版) https://github.com/whatwg/html/commit/21c6ec77594eb89b836d4872222f5916910967fd

[83] Editorial: clarify change events on unfocusing · whatwg/html@86f7aa6 ( 版) https://github.com/whatwg/html/commit/86f7aa620dbcbc837e217ae36be99808fc7eb34a

[84] Be more precise about nested and discarded browsing contexts (domenic著, ) https://github.com/whatwg/html/commit/39118df640ad4a3f03f164fb5ffe0a56316297be

[85] Stop overriding UIEvent's detail attribute (annevk著, ) https://github.com/whatwg/html/commit/bd3239b5b38a157a61cb570df5c80ad1dbc2b9d4

[86] Clarify and add some examples around focus (domenic著, ) https://github.com/whatwg/html/commit/deb83668390151a2cf242c24dd9d68509860e77a

[87] Add note on Shadow DOM behavior about dialog focusing steps. by TakayoshiKochi · Pull Request #2394 · whatwg/html () https://github.com/whatwg/html/pull/2394

[88] Add mitigation strategy for skimming attacks when focus is lost. (#213) (tobie著, ) https://github.com/w3c/sensors/commit/d6f537f740ee964f9bbb8a5d3a0fd661a69ea205

[89] Use the has focus steps algorithm. (#225) (tobie著, ) https://github.com/w3c/sensors/commit/ff03ece7d9abdfb0e2d83ed906a24ccd667b19fa

[90] Calling focus() on non-focusable HTMLElement should log a warning to the console · Issue #2772 · whatwg/html () https://github.com/whatwg/html/issues/2772

[91] 155566 - Calling focus() on non-focusable HTMLElement should log a warning to the console - chromium - Monorail () https://bugs.chromium.org/p/chromium/issues/detail?id=155566

[92] [selectors] Fix definition of :focus (frivoal著, ) https://github.com/w3c/csswg-drafts/commit/b8dd5b9e8196b210f50e2bf0d72cfaf2b519a45f

[93] [selectors] propagation of the :focus pseudo · Issue #1240 · w3c/csswg-drafts () https://github.com/w3c/csswg-drafts/issues/1240

[94] Mark focus events composed (annevk著, ) https://github.com/whatwg/html/commit/84d96dfd816f5e6f229df0558ce10af26482bfc5

[95] Make focus events composed · Issue #3511 · whatwg/html () https://github.com/whatwg/html/issues/3511

[96] Mark focus events composed by annevk · Pull Request #3512 · whatwg/html () https://github.com/whatwg/html/pull/3512

[97] Queue a task to run all the autofocusing steps (domenic著, ) https://github.com/whatwg/html/commit/185190cac859144cfcd78248b906f3adae1f0594

[98] Autofocus has weird racy behavior · Issue #3467 · whatwg/html () https://github.com/whatwg/html/issues/3467

[99] Queue a task to run all the autofocusing steps by domenic · Pull Request #3488 · whatwg/html () https://github.com/whatwg/html/pull/3488

[100] New in Chrome 64  |  Web  |  Google Developers () https://developers.google.com/web/updates/2018/01/nic64

[101] Remove the concept of "dialog group" (TakayoshiKochi著, ) https://github.com/whatwg/html/commit/a4bb3465c86896b95b7d66c1e9047e8a313c7212

[102] Remove the concept of "dialog group" by TakayoshiKochi · Pull Request #3566 · whatwg/html () https://github.com/whatwg/html/pull/3566

[103] Add HTMLOrSVGElement interface mixin (annevk著, ) https://github.com/whatwg/html/commit/81e82437a7ef1ee37d4ce2b5a982bc297d5b58b1

[104] Move dataset from HTMLElement to a mixin shared with SVGElement · Issue #3471 · whatwg/html () https://github.com/whatwg/html/issues/3471

[105] Add HTMLOrSVGElement interface mixin by annevk · Pull Request #3543 · whatwg/html () https://github.com/whatwg/html/pull/3543

[106] Add HTMLOrSVGElement mixn (dstorey著, ) https://github.com/w3c/svgwg/commit/bf070f6e46face7169561d4ea7dae45b93210dfb

[107] Remove "control group" concept from the focus model (TakayoshiKochi著, ) https://github.com/whatwg/html/commit/90a60b2a0dc740b8b0093b07ca0a41e70ba8d83a

[108] Should <dialog> actually create a "control group" for focus? · Issue #2171 · whatwg/html () https://github.com/whatwg/html/issues/2171

[109] Remove "control group" concept from HTML by TakayoshiKochi · Pull Request #3647 · whatwg/html () https://github.com/whatwg/html/pull/3647

[110] Remove sentences about documents with no focusable area (TakayoshiKochi著, ) https://github.com/whatwg/html/commit/b2ff9c7292daefc034c5adca1c32727b1fac28ff

[111] Probably-wrong focus requirement · Issue #3675 · whatwg/html () https://github.com/whatwg/html/issues/3675

[112] Remove sentences about document with no focusable area by TakayoshiKochi · Pull Request #3798 · whatwg/html () https://github.com/whatwg/html/pull/3798

[113] focus() on a non-focusable legend delegates focus in WebKit/Chromium · Issue #3950 · whatwg/html () https://github.com/whatwg/html/issues/3950