:focus-visible
Baseline
åºãå©ç¨å¯è½
ãã®æ©è½ã¯åºãå®è£ ããã¦ãããå¤ãã®ãã¼ã¸ã§ã³ã®ç«¯æ«ããã©ã¦ã¶ã¼ã§åä½ãã¾ãã2022å¹´3æä»¥éããã¹ã¦ã®ãã©ã¦ã¶ã¼ã§å©ç¨å¯è½ã§ãã
:focus-visible æ¬ä¼¼ã¯ã©ã¹ã¯ãè¦ç´ ã :focus æ¬ä¼¼ã¯ã©ã¹ã«ä¸è´ãã¦ããæã§ãã¦ã¼ã¶ã¼ã¨ã¼ã¸ã§ã³ããè¦ç´ ã«ãã©ã¼ã«ã¹ãæç¤ºããã¹ãã§ããã¨æ¨æ¸¬çã«å¤æããå ´åã«é©ç¨ããã¾ããï¼å¤ãã®ãã©ã¦ã¶ã¼ã§ã¯ãã®å ´åãæ¢å®ã§ããã©ã¼ã«ã¹ãªã³ã°ãã表示ãã¾ããï¼
試ãã¦ã¿ã¾ããã
label {
display: block;
margin-top: 1em;
}
input:focus-visible {
outline: 2px solid crimson;
border-radius: 3px;
}
select:focus-visible {
border: 2px dashed crimson;
border-radius: 3px;
outline: none;
}
<form>
<p>ã©ã®é¢¨å³ããæ³¨æããã¾ããï¼</p>
<label>æ°å: <input name="firstName" type="text" /></label>
<label
>風å³:
<select name="flavor">
<option>ããããã¼</option>
<option>ç·è¶</option>
<option>ã ã¼ã¹ãã©ãã¯</option>
<option>ãã³ãããã</option>
</select>
</label>
</form>
ãã®ã»ã¬ã¯ã¿ã¼ã¯ãã¦ã¼ã¶ã¼ã®å ¥åæ¹æ³ï¼ãã¦ã¹ãªã®ããã¼ãã¼ããªã®ãï¼ã«ãã£ã¦ç°ãªããã©ã¼ã«ã¹è¡¨ç¤ºãæä¾ãããå ´åã«ä¾¿å©ã§ãã
æ§æ
:focus-visible {
/* ... */
}
:focus 㨠:focus-visible
ãã¨ãã¨ãã¦ã¼ã¶ã¼ã¨ã¼ã¸ã§ã³ã CSS 㯠:focus æ¬ä¼¼ã¯ã©ã¹ã®ã¿ã«åºã¥ãã¦ãã©ã¼ã«ã¹ã¹ã¿ã¤ã«ãè¨å®ãããã©ã¼ã«ã¹ãããè¦ç´ ã®ã»ã¨ãã©ããã©ã¼ã«ã¹ãªã³ã°ã®è¼ªéç·ã§ã¹ã¿ã¤ã«è¨å®ãã¦ãã¾ãããããã«ããããã¹ã¦ã®ãªã³ã¯ããã¿ã³ãå«ããã¹ã¦ã®è¦ç´ ãããã©ã¼ã«ã¹ãããã¨ãã«ãã©ã¼ã«ã¹ãªã³ã°ãé©ç¨ããããã¨ã«ãªããå¤ãã®äººãéãã¨æãã¾ãããè¦ãç®ãæªãã®ã§ãä¸é¨ã®ä½è
ã¯ã¦ã¼ã¶ã¼ã¨ã¼ã¸ã§ã³ãã®è¼ªéç·ã®ãã©ã¼ã«ã¹ã¹ã¿ã¤ã«ãé¤å»ãã¾ããããã©ã¼ã«ã¹ã¹ã¿ã¤ã«ã®å¤æ´ã¯ã¦ã¼ã¶ããªãã£ãä½ä¸ããããã©ã¼ã«ã¹ã¹ã¿ã¤ã«ãé¤å»ãããã¨ãç®ã®è¦ããã¦ã¼ã¶ã¼ã«ã¨ã£ã¦ãã¼ãã¼ãããã²ã¼ã·ã§ã³ãå©ç¨ã§ããªããªãã¾ãã
ãã©ã¦ã¶ã¼ã¯ããã©ã¼ã«ã¹ãããã¨ãã«åè¦ç´ ã®å¨å²ã«ï¼ããã©ã¼ã«ã¹ãªã³ã°ããæç»ãããªã©ãã¦ï¼ãã©ã¼ã«ã¹ãç®ã«è¦ããå½¢ã§ç¤ºããªããªãã¾ããããã®ä»£ããã«ãã¦ã¼ã¶ã¼ã«ã¨ã£ã¦æãæçãªå ´åã«ã®ã¿ãã©ã¼ã«ã¹ã¤ã³ã¸ã±ã¼ã¿ã¼ãæä¾ããããã«ãæ§ã ãªçºè¦çææ³ã使ç¨ãã¦ãã¾ããä¾ãã°ããã¤ã³ãã£ã³ã°ããã¤ã¹ã使ç¨ãã¦ãã¿ã³ãã¯ãªãã¯ãããå ´åãä¸è¬çã«ãã©ã¼ã«ã¹ã¯è¦è¦çãªè¡¨ç¤ºããã¾ããããã¦ã¼ã¶ã¼å ¥åãå¿ è¦ãªããã¹ãããã¯ã¹ã«ãã©ã¼ã«ã¹ãããå ´åããã©ã¼ã«ã¹ã表示ããã¾ããã¦ã¼ã¶ã¼ããã¼ãã¼ãã使ã£ã¦ãã¼ã¸ãæä½ãã¦ããã¨ãããã¹ã¯ãªããã使ã£ã¦ãã©ã¼ã«ã¹ã管çãã¦ããã¨ãã«ã¯ã常ã«ãã©ã¼ã«ã¹ã¹ã¿ã¤ã«ãè¦æ±ããã¾ãããã¦ã¼ã¶ã¼ãã©ãã«ãã©ã¼ã«ã¹ãç½®ãã¦ããããç¥ã£ã¦ããã¨ããä¾ãã°ãã¦ã¹ãæãªã©ã®ãã¤ã³ãã£ã³ã°ããã¤ã¹ã使ç¨ãã¦è¦ç´ ã«ç©ççã«ãã©ã¼ã«ã¹ãè¨å®ããã¨ãã«ã¯ããã®è¦ç´ ãã¦ã¼ã¶ã¼ã®æ³¨æãå¼ãç¶ããå¿ è¦ããªãéãããã©ã¼ã«ã¹ã¹ã¿ã¤ã«ã¯è¦æ±ããã¾ããã
focus æ¬ä¼¼ã¯ã©ã¹ã¯ã常ã«ç¾å¨ãã©ã¼ã«ã¹ããã¦ããè¦ç´ ã«ä¸è´ãã¾ãã focus-visible æ¬ä¼¼ã¯ã©ã¹ããã©ã¼ã«ã¹ãããè¦ç´ ã«ä¸è´ãã¾ãããã¦ã¼ã¶ã¼ãç¾å¨ã©ãã«ãã©ã¼ã«ã¹ãããã®ããç¥ãå¿
è¦ãããå ´åã«ã®ã¿ä¸è´ãã¾ãã focus-visible æ¬ä¼¼ã¯ã©ã¹ã¯ãå¿
è¦ãªã¨ãã«ãã©ã¼ã«ã¹ãããè¦ç´ ã«ä¸è´ããã®ã§ãï¼:focus æ¬ä¼¼ã¯ã©ã¹ã®ä»£ããã«ï¼:focus-visible ã使ç¨ãããã¨ã§ããã©ã¼ã«ã¹ã¤ã³ã¸ã±ã¼ã¿ãç¾ããã¿ã¤ãã³ã°ã夿´ãããã¨ãªãããã©ã¼ã«ã¹ã¤ã³ã¸ã±ã¼ã¿ã®å¤è¦³ã夿´ãããã¨ãã§ãã¾ãã
:focus æ¬ä¼¼ã¯ã©ã¹ã使ç¨ããã¨ã常ã«ç¾å¨ãã©ã¼ã«ã¹ããã¦ããè¦ç´ ã対象ã¨ãã¾ãããã®æå³ã¯ãã¦ã¼ã¶ã¼ããã¤ã³ãã£ã³ã°ããã¤ã¹ã使ç¨ããã¨ããã©ã¼ã«ã¹ãããè¦ç´ ã®å¨å²ã«ç®ã«è¦ãããã©ã¼ã«ã¹ãªã³ã°ãç¾ãããã¨ãæå³ãã¾ãã focus-visible æ¬ä¼¼ã¯ã©ã¹ã¯ãã¦ã¼ã¶ã¼ã¨ã¼ã¸ã§ã³ãã®é¸æçãªãã©ã¼ã«ã¹è¡¨ç¤ºã®åä½ãå°éãã¤ã¤ããã©ã¼ã«ã¹è¡¨ç¤ºã®ã«ã¹ã¿ãã¤ãºãå¯è½ã«ãã¾ãã
ã¢ã¯ã»ã·ããªãã£
>å¼±è¦
è¦è¦çãªãã©ã¼ã«ã¹ã¤ã³ã¸ã±ã¼ã¿ã¼ããå¼±è¦ã®äººã ãããè¦ããããã«ç¢ºèªãã¦ãã ãããããã¯å¤å ãæããå ´æï¼å¤ªé½ã®ä¸ã®å±å¤ãªã©ï¼ã§ç»é¢ã使ç¨ãããã¹ã¦ã®äººã«ãå©çã«ãªãã¾ãã WCAG 2.1 SC 1.4.11 Non-Text Contrast ã¯ãè¦è¦çãªãã©ã¼ã«ã¹ã¤ã³ã¸ã±ã¼ã¿ã¼ãå°ãªãã¨ã 3:1 ã«ãããã¨ãè¦æ±ãã¦ãã¾ãã
- ã¢ã¯ã»ã·ãã«ãªè¦è¦çãã©ã¼ã«ã¹ã¤ã³ã¸ã±ã¼ã¿ã¼: Give Your Site Some Focus! Tips for Designing Useful and Usable Focus Indicators
èªç¥éç¢
è¤æ°ã®å ¥åå½¢å¼ãæ··å¨ããã¦ããå ´åããã©ã¼ã«ã¹ã¤ã³ã¸ã±ã¼ã¿ã¼ã表示ããããæ¶ãããããçç±ã¯æããã§ã¯ãªãããããã¾ãããèªç¥æ©è½ã«ä¸å®ã®ããã¦ã¼ã¶ã¼ããæè¡çãªç¥èãä¹ããã¦ã¼ã¶ã¼ã«ã¨ã£ã¦ã対話çè¦ç´ ã®åä½ãä¸è²«ãã¦ããªãã¨ãæ··ä¹±ãæãå¯è½æ§ãããã¾ãã
ä¾
>:focus 㨠:focus-visible ã®æ¯è¼
ãã®ä¾ã§ã¯ 3 çµã®ã³ã³ããã¼ã«ã表示ãã¦ãã¾ããããããã®ãã¢ã¯ text å
¥åã¨ãã¿ã³ã§æ§æããã¦ãã¾ãã
- æåã®ãã¢ã¯ããã©ã¼ã«ã¹ç¶æ ã®ã«ã¹ã¿ã ã¹ã¿ã¤ã«ã追å ããã æ¢å®ã®å ´åã示ãã¦ãã¾ãã
- 2 ã¤ç®ã®ãã¢ã¯
:focusæ¬ä¼¼ã¯ã©ã¹ã使ç¨ãã¦ã¹ã¿ã¤ã«ã追å ãã¾ãã - 3 ã¤ç®ã®ãã¢ã¯ã
:focus-visibleæ¬ä¼¼ã¯ã©ã¹ã使ç¨ãã¦ã¹ã¿ã¤ã«ã追å ãã¾ãã
<input value="æ¢å®ã®ã¹ã¿ã¤ã«" /><br />
<button>æ¢å®ã®ã¹ã¿ã¤ã«</button><br />
<input class="focus-only" type="text" value=":focus" /><br />
<button class="focus-only">:focus</button><br />
<input class="focus-visible-only" type="text" value=":focus-visible" /><br />
<button class="focus-visible-only">:focus-visible</button>
input,
button {
margin: 10px;
}
.focus-only:focus {
outline: 2px solid black;
}
.focus-visible-only:focus-visible {
outline: 4px dashed darkorange;
}
åè¦ç´ ãé çªã«ã¯ãªãã¯ãã¦ããã¨ããã©ã¼ã«ã¹ãªã³ã°ã®ã¹ã¿ã¤ã«è¨å®ã« :focus ã使ç¨ããå ´åãã¦ã¼ã¶ã¼ããã¿ã³ãã¯ãªãã¯ãã㨠UA ããã©ã¼ã«ã¹ãªã³ã°ãæç»ãããã¨ããããã¾ãããããããã©ã¼ã«ã¹ãªã³ã°ã®ã¹ã¿ã¤ã«è¨å®ã« :focus-visible ãç¨ããå ´åã¯ãæ¢å®å¤ã¨åæ§ã«ã¦ã¼ã¶ã¼ããã¿ã³ãã¯ãªãã¯ãã¦ã UA ã¯ãã©ã¼ã«ã¹ãªã³ã°ãæç»ãã¾ããã
åè¦ç´ ãã¿ãã§è¦ã¦ããã¨ãæ¢å®ã:focusã:focus-visibleã® 3 ã¤ã®ã±ã¼ã¹ãã¹ã¦ã§ãã¦ã¼ã¶ã¼ããã¼ãã¼ãã§ãã¿ã³ã«ç§»åããã¨ã UA ã¯ãã¿ã³ã®å¨ãã«ãã©ã¼ã«ã¹ãªã³ã°ãæç»ãããã¨ããããã¾ãã
ããã¯ã :focus-visible ã«ãã£ã¦ããã¶ã¤ãã¼ããã©ã¼ã«ã¹ãªã³ã°ããã¤ç¤ºãã¹ãããæ±ºå®ããéã«ããã©ã¦ã¶ã¼ã®ãã¸ãã¯ã«å¾ããã¨ãã§ãããã¨ã示ãã¦ãã¾ãã
:focus ã®ä»£æ¿ã®é©ç¨
ããã³ã¼ãã :focus-visible ã«å¯¾å¿ãã¦ããªãå¤ããã©ã¦ã¶ã¼ã§åä½ãããå¿
è¦ãããå ´åã¯ã :focus-visible ã®å¯¾å¿ã @supports ã§èª¿ã¹ãåããã©ã¼ã«ã¹ã¹ã¿ã¤ã«è¨å®ã :focus ã«ã¼ã«ã®ä¸ã§ç¹°ãè¿ãã¦ãã ããããªãã :focus ã«ä½ãæå®ããªãã¦ããå¤ããã©ã¦ã¶ã¼ã§ã¯åã«ãã¤ãã£ãã®è¼ªéç·ã表示ããã¾ãã
<button class="button with-fallback" type="button">代æ¿ã®ãããã¿ã³</button>
<button class="button without-fallback" type="button">
代æ¿ã®ãªããã¿ã³
</button>
.button {
margin: 10px;
border: 2px solid darkgray;
border-radius: 4px;
}
.button:focus-visible {
/* :focus-visible ã«å¯¾å¿ãã¦ããå ´åããã©ã¼ã«ã¹ãæç» */
outline: 3px solid deepskyblue;
outline-offset: 3px;
}
@supports not selector(:focus-visible) {
.button.with-fallback:focus {
/* :focus-visible ã«å¯¾å¿ãã¦ããªããã©ã¦ã¶ã¼åãã®ä»£æ¿ */
outline: 3px solid deepskyblue;
outline-offset: 3px;
}
}
仿§æ¸
| 仿§æ¸ |
|---|
| Selectors Level 4 > # the-focus-visible-pseudo > |