以前にSafariのtabキーでのフォーカス移動についての記事やCSSの:focus-withinを使ってみる記事で触れましたが、Safariでのフォーカスの動作が他のブラウザと異なるようだったので、いくつかサンプルを用意して挙動を試してみます。
サンプルコード
まずは以前:focus-withinを使ってみるでも試した、:focus-withinを使用した場合を試してみます。
<form> <div class="form-item"> 連絡 <input type="checkbox" name="contact[]" value="電話" id="tel"> <label for="tel">電話</label> <input type="checkbox" name="contact[]" value="メール" id="mail"> <label for="mail">メール</label> </div> <div class="form-item"> 時間帯 <input type="radio" name="hour" value="8:00〜12:00" id="hour-1"> <label for="hour-1">8:00〜12:00</label> <input type="radio" name="hour" value="12:00〜16:00" id="hour-2"> <label for="hour-2">12:00〜16:00</label> <input type="radio" name="hour" value="16:00〜20:00" id="hour-3"> <label for="hour-3">16:00〜20:00</label> <input type="radio" name="hour" value="20:00〜24:00" id="hour-4"> <label for="hour-4">20:00〜24:00</label> </div> </form>
チェックボックスやラジオボタンにフォーカスが当たった際に、祖先要素の.form-itemに背景色がつくようにします。
.form-item:focus-within { background: skyblue; }
Safariで確認したところ、キーボード操作では意図した通り背景色がつきますが、クリックで選択した場合には背景色がつきませんでした。
:focus-withinのデモページ
次に:focusを使って、隣接するlabelに背景色がつくようにしてみます。
input[type="checkbox"]:focus + label { background: skyblue; } input[type="radio"]:focus + label { background: skyblue; }
この場合も先ほどと同様で、Safariだとキーボード操作では背景色がつきますが、クリックの場合は背景色がつきませんでした。
:focusのデモページ
次はJavaScriptでチェックボックスやラジオボタンにフォーカスを当てられるかを試してみます。
<form> <div class="form-item"> 連絡 <input type="checkbox" name="contact[]" value="電話" id="tel"> <label for="tel">電話</label> <input type="checkbox" name="contact[]" value="メール" id="mail"> <label for="mail">メール</label> <button id="checkbox-focus" type="button">電話にフォーカスを当てる</button> </div> <div class="form-item"> 時間帯 <input type="radio" name="hour" value="8:00〜12:00" id="hour-1"> <label for="hour-1">8:00〜12:00</label> <input type="radio" name="hour" value="12:00〜16:00" id="hour-2"> <label for="hour-2">12:00〜16:00</label> <input type="radio" name="hour" value="16:00〜20:00" id="hour-3"> <label for="hour-3">16:00〜20:00</label> <input type="radio" name="hour" value="20:00〜24:00" id="hour-4"> <label for="hour-4">20:00〜24:00</label> <button id="radio-focus" type="button">8:00〜12:00にフォーカスを当てる</button> </div> </form>
ボタンクリックで先頭のチェックボックス・ラジオボタンにフォーカスが当たるように設定します。
document.querySelector('#checkbox-focus').addEventListener('click', function() { document.querySelector('input[type="checkbox"]').focus(); }); document.querySelector('#radio-focus').addEventListener('click', function() { document.querySelector('input[type="radio"]').focus(); });
この場合はクリックでもキーボード操作でもフォーカスを当てることができました。
focus()のデモページ
最後にフォーカスのイベントが発生するかどうかを試してみます。
チェックボックスやラジオボタンにフォーカスのイベントが発生した際に、その要素のvalueをconsoleに表示するようにします。
const checks = document.querySelectorAll('input'); for (let i = 0; i < checks.length; i++) { checks[i].addEventListener('focus', output_val); } function output_val() { console.log(this.value); }
Safariのキーボード操作では背景色がつきますが、クリックで選択した場合には背景色がつきませんでした。
focusイベントのデモページ
上記で試したデモと調べた範囲での結論としては、Safariではクリック(マウス操作)ではチェックボックスやラジオボタンにフォーカスできず、キーボード操作の場合のみフォーカスが発生するようです。
そのため、マウス操作だと:focusなどのCSSの設定やフォーカスイベントは発生しませんが、focus() でフォーカスを当てること自体はできるようなので、クリックしたチェックボックスやラジオボタンに対してJavaScriptを使ってフォーカスを当てる、といった実装自体はできるかもしれないです。
コメントが承認されるまで時間がかかります。