 HTMLの注意が必要な構造と違反一覧表
HTMLの注意が必要な構造と違反一覧表
現在、「HTML Living Standard」が標準とのこと。
あったら助かるかなと思い、自分用にメモ。
AIにまとめてもらいました。
| 要素 | 注意が必要な使用例 | 注意が必要な理由 | 推奨される代替方法(改善案) | 
|---|---|---|---|
| <a> | <a><p>リンク</p></a> | <p>は段落要素で、インライン要素の中に入れるのは、今のHTMLでは仕様違反ではないが、使い方によってはSafariなどで挙動がおかしくなることがある | <span>や<div>に置き換える →<a><span>リンク</span></a> | 
▼コメントいただいた記事。わかりやすいので載せます
| 要素 | NGな使用例 | 違反の理由 | 推奨される代替方法(改善案) | 
|---|---|---|---|
| <ul>/<ol> | <ul><div>Item</div></ul> | ul/olの直下にはli要素のみ許可されている | <ul><li>Item</li></ul> | 
| <table> | <table><div>テキスト</div></table> | tableの中はtr/td/thなどの表構造の要素のみが入れられる | 表の構造に合わせて <tr><td>テキスト</td></tr>にする | 
| <p> | <p><div>テキスト</div></p> | <p>は自動で閉じられる性質があり、ブロック要素(divなど)を入れると構造が崩れる | divを外に出す →<div><p>テキスト</p></div> | 
| <label> | <label><div>項目</div></label> | labelの中にdivやpなどブロック要素を直接入れるのは非推奨 | labelの中にspanを使う orlabelをfor属性で外に出す | 
| <button> | <button><div>送信</div></button> | button内にブロック要素(divなど)を入れるとブラウザによっては誤作動 | spanやstrongなどのインライン要素を使う | 
| <form> | <form><form>...</form></form> | <form>の入れ子は仕様違反。サーバーに正しくデータが送信されない | フォームを分ける or JavaScriptなどで疑似的に対応する | 
| <section>/<article> | 無意味にネストして使う → <section><section>...</section></section> | 過剰な入れ子で意味構造が不明確に。SEOやアクセシビリティに影響 | 意味ごとに sectionやdivを使い分ける | 
| <img> | <img><p>説明</p> | <img>は空要素(自己終了タグ)なので中に要素を入れるのは不可 | figcaptionを使う:<figure><img><figcaption>説明</figcaption></figure> | 
 ちょっとした覚え方ヒント
ちょっとした覚え方ヒント
- ブロック要素をインライン要素の中に入れない(特に<a>・<button>・<label>)
- リスト・テーブル・フォームなど、構造が決まっている要素はルール厳守
- 「自己終了タグ」は中に子要素を持てない(例:<img>, <input>)
🔧 補足:iOS Safariと「見えてるのに反応しない」系の罠
Safari/iOSは以下のような場合にタップイベントが効かなくなる・反応が遅れることがあります。
| 状態 | 起こりやすい問題 | 
|---|---|
| opacity: 0 | 表示された直後はタップが効かない | 
| transform付き要素 | タップ対象レイヤーがズレることがある | 
| display: none→ 表示 | タップ可能状態になるまでにラグがある | 
| アニメーション途中 | タップが無効または反応が遅れる | 
解決策:touchstart,ontouchstartを追加してみる!
