Safari 17.4 が input type=checkbox の switch 属性に対応したので簡単に試してみる

Safari 17.4 が input type=checkbox の switch 属性に対応したのでテスト用のページを作って、実際にどのように表示されるのかを確認してみました。

先日、WebKit の開発者向け Blog で、input type=checkboxswitch 属性、つまり <input type=checkbox switch> みたいな記述に、Safari 17.4 で対応しますよという記事が公開されました。

で、実際に 3 月 5 日付けで Safari 17.4 が正式にリリースされましたので、実際にどんな感じになるのかを確認してみました。

確認ページ

GitHub 上に簡単な確認用のページを下記に作ったので、Safari 17.4 が入っている環境でアクセスすると、実際の表示がどんな感じになるのか確認できます。

非標準の ::thumb::track 疑似要素を使用するともっと色々と見た目をいじれるみたいですが、面倒くさいので今回は無視して、基本的な switch 属性の指定のみとしています。

その他、appearance: none; しておいて CSS で見た目をコントロールしたり、:checked 疑似クラスを使って 「On 状態」 のスタイルを指定したりできる点は、従来のinput type=checkbox と同様です。

Safari 17.4 ではない環境向けに下記にスクリーンショットを。

switch 属性を指定しただけ

下記は、input type=checkboxswitch を指定して、Safari 17.4 で表示した例です。これだけでトグルスイッチの見た目になってますね。

input type=checkbox に switch 属性を指定して、Safari 17.4 で表示した例

CSS で accent-color を指定した例

下記は、accent-color プロパティを使用して、アクセントカラーを適用した例です。サイトのテーマカラーに合わせたトグルスイッチにしたい、なんて時には CSS で簡単に調整できます。

input type=checkbox switch に accent-color プロパティを適用した例

input[type="checkbox"][switch] {
  accent-color: #dc2626;
}

指定する色によってはコントラスト比などの関係で見づらくなる場合もありますから注意しましょう。

従来の実装例

switch 属性をサポートしない環境向けに、見た目上 (あくまで見た目上です)、iOS などでよく見るデザインのトグルスイッチを実装したい場合、例えば下記のような実装方法が考えられます。

<label>
  <span class="switch">
    <input type="checkbox" checked>
  </span>
  Toggle switch
</label>

HTML は上記のような感じにしておいて、CSS で下記のようにすれば、見た目は近い感じになると思います。

.switch {
  position: relative;
  display: inline-flex;
  height: 2rem;
  width: 3.5rem;
  align-items: center;
  border-radius: 9999px;
}

.switch:focus-within {
  outline-style: solid;
  outline-width: 2px;
  outline-offset: 2px;
  outline-color: #2563eb;
}

.switch input[type="checkbox"] {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border-width: 0;
}

.switch:has(input[type="checkbox"]) {
  --bg-opacity: 1;
  background-color: rgb(152 152 157 / var(--bg-opacity));
}

.switch:has(input[type="checkbox"]:checked) {
  --bg-opacity: 1;
  background-color: rgb(52 199 89 / var(--bg-opacity));
}

.switch::before {
  content: "";
  position: absolute;
  left: .25rem;
  height: 1.75rem;
  width: 1.75rem;
  border-radius: 9999px;
  --bg-opacity: 1;
  background-color: rgb(255 255 255 / var(--bg-opacity));
  --shadow: 0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a;
  box-shadow: var(--shadow);
  transition-property: transform;
  transition-timing-function: cubic-bezier(.4,0,.2,1);
  transition-duration: .3s;
}

.switch:has(input[type="checkbox"]:checked)::before {
  --translate-x: 1.25rem;
  transform: translate(var(--translate-x), 0);
}

実際には、この実装だと見た目はトグルスイッチですが、意味的にはチェックボックスですから、より明確にスイッチ (On / Off という状態を伝えたい) であることを表すのであれば、role="switch"aria-checked 属性を組み合わせるなどして実装する必要はあると思います。

Safari 17.4 は、<input type=checkbox switch> を、role="switch" として扱うとのことですので、実装側としては楽でよいなと思いました。

現状では、HTML Standard 仕様に反映されるのか、もしくは反映されるとしていつ頃になるのか、などについては全くわかりませんし、特定の環境のみでのサポートなので積極的に使用するような状況ではないと思いますが、個人的にはこういうトグルスイッチの UI が必要な状況も多いと思いますので、標準化されると色々と楽になるなとは思います。


関連エントリー

記事をここまで御覧頂きありがとうございます。
この記事が気に入ったらサポートしてみませんか?