- Webインターフェースでは、
の代わりに を使うことが、アクセシビリティと機能の両面で正しい選択
- `` は スクリーンリーダーにインタラクティブ要素として認識されず、キーボードフォーカスや
Enter、Spacebar 入力にも反応しない
[role="button"] や [tabindex="0"] 属性を追加しても、フォーカス順序の乱れやキーボードイベント処理の問題が残る
- こうした問題を解決するために 複数のイベントリスナーや条件分岐を追加することは不要な複雑さを招く
- `` は アクセシビリティ、フォーカス、キーボード入力処理機能を標準で提供するため、シンプルで標準的な解決策である
間違ったアプローチ: `` でボタンを作る
- React や HTMX の利用者の間では、`` の形で モーダルを開くなどのインタラクションを実装する例が多い
- この方式の問題点
- スクリーンリーダーがその要素を インタラクティブ要素として認識しない
- キーボードで フォーカス移動できない
click イベントしか動作せず、Enter や Spacebar 入力には反応しない
アクセシビリティを「修正」しようとする試みの限界
`` が提供する標準機能
- `` 要素は次を 自動的にサポートする
- 暗黙の役割 (
[role="button"])
- 自動的にフォーカス可能
- フォーカス状態で
Enter と Spacebar 入力時に click イベントを発火
- 同じ動作を
で実装するには **複数の属性やスクリプトが必要**だが、 ならたった1行で解決できる
Open Modal
結論: シンプルさが最善
- `` は アクセシビリティ標準を満たしつつコード量を減らす最もシンプルな方法
- 不要なイベント処理や属性追加なしに 標準の HTML 要素を使うことが、保守性と効率の面で有利
- 「怠け者の開発者ほど正しい要素を使え」というメッセージとして、
不要な複雑さを避け、標準機能を活用する開発習慣の重要性を強調している
7件のコメント
とても良い文章ですね。本文の要旨は「
htmlタグを意味のある形で使おう」に要約できると思います。div(またはその他の)タグでクリックイベントを提供するのであれば、昔tableタグでレイアウトを組んでいた時代と、まったく変わっていないと思います。もちろん
aria-*属性を入れれば明確にはなるかもしれませんが、そんな苦労をするくらいなら、むしろ適切なタグを使うべきですwwww懐かしいですね(笑)
ボタンを使ってください
background, border, outline, appearance, -webkit-appearance, cursor
上書きしなければならないデフォルトのスタイルシートが多すぎます……
だからCSS Resetがあるんですよ。
うちの国の官公庁サイトは `` をよく使っていたけど…
Hacker Newsの意見
私の不満のひとつは、Webサイトが
onclickハンドラ でナビゲーションを実装していること 単に `` タグを使えば、新しいタブで開く、アクセシビリティ機器との統合、右クリックメニューなど、すべてが自動でうまく動く ナビゲーションなら、JavaScriptスープではなくリンクを使うべきonClickになっていた 実質リンクである要素まで全部クリックハンドラで処理していて、理解できないほとんどのボタンには
type="button"を明示すべき デフォルト値はsubmitなので、フォーム内にあると自動的に送信される おそらく一部の開発者はこれを知らず、それで `` を使っているのだと思うに相当し、とは異なるを使えば `type="submit"` 問題は避けられるは最初から空なので、必要な機能だけ追加でき、後から修正もしやすい 一方 `` は、デフォルト動作を理解するためにドキュメントを見る必要がある 結局は 明示的な制御 vs 組み込み機能 の選択ということだ「その目的のために作られた HTML要素をそのまま使おう」という方向に記事を広げてほしい 多くのSPA開発者はHTML要素の意味をよく知らず、毎回車輪の再発明をしている
最近は、クリックできる領域を探して画面をあちこち押す世代が生まれている 10年前に誰かが リンクのドラッグ をテキスト選択より優先させたせいで、今ではテキスト選択がほとんど不可能になっている これを直すにはブラウザをforkしないといけないかもしれない
Chromeのデフォルトスタイルシートに
button {align-items: flex-start}があって、flexboxのサイズ不具合 で長いことハマった それでも、できる限り正しいHTML要素を使おうとしているが、小さなサイドプロジェクトでは `` のほうが楽なときもあるappearance: noneプロパティは、ボタンスタイルの初期化に便利 私は.unbuttonifyクラスを作って、ボタンのように動くが別の見た目にしているできるだけ要素を 本来の意図に沿って使う べき
ボタンについては不満が2つある ひとつは、どうせ スタイルを当て直さなければならない こと もうひとつは、ボタンを入れ子にできないという警告だ これは現実にはかなりよく遭遇する
LLMはこうした 誤ったパターン をよく生成する ブラウザの標準機能を無視して複雑に実装することが多い 私はClaudeに、こういうコードを単純化しろとよく指示している TypeScriptでもエラー処理のやり方を妙にしてしまう傾向がある
私はできるだけ ボタンをデフォルトで使う ただし、実際にはリンクのように振る舞うべき場合は `` タグを使う
なぜ `` を使おうという意見が出るのか不思議だった