HTML ルール
このページに、各ルールの目的・前提・設定と、省略のない悪い例・良い例をまとめています。変更箇所は行の色で示します。コードをコピーすると、ソースコード全体を取得できます。各例に現在の対応範囲も明記しています。
| ルール | 例 | 目的 |
|---|---|---|
html/deprecated-attr |
悪い · 良い | 非推奨の HTML 属性を検出します。 |
html/deprecated-element |
悪い · 良い | 非推奨の HTML 要素を検出します。 |
html/id-duplication |
悪い · 良い | 同じテンプレート内の ID 重複を検出します。 |
html/no-consecutive-br |
悪い · 良い | 連続する br 要素による余白指定を検出します。 |
html/no-dupe-style-properties |
悪い · 良い | 静的 style 属性内のプロパティ重複を検出します。 |
html/no-duplicate-class |
悪い · 良い | 静的 class 属性内のクラス名重複を検出します。 |
html/no-duplicate-dt |
悪い · 良い | dl 内の dt の名前重複を検出します。 |
html/no-empty-palpable-content |
悪い · 良い | 可視コンテンツを期待する要素が空の場合に検出します。 |
html/require-datetime |
悪い · 良い | time 要素に機械可読の datetime を指定します。 |
全ルール · ルールのオプション · ESLint 移行対応表 · プロジェクトの検査 · 子への属性の継承
html/deprecated-attr
非推奨の HTML 属性を検出します。
既定の重大度: warning
プリセット: happy-path, nuxt, ecosystem, opinionated
自動修正: なし。修正内容を確認してください
適用範囲: Vue SFC のテンプレートと各ブロック。ルールに必要な script の文脈も例に含めています。
オプション: ルール固有のオプションはありません。重大度とプリセットは設定できます。
設定(Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"html/deprecated-attr": "warn"
}
},
},
});
vp run lint
悪い
文字の配置を指定するために、非推奨の align 属性を p 要素に使っています。
<template>
<p align="center">Notice</p>
</template>
良い
クラスと text-align: center で、配置を CSS に移します。
<template><p class="notice">Notice</p></template>
<style scoped>.notice { text-align: center; }</style>
良い例は上記の設定でこのルールの診断が出ない例です。他のルールの診断は出る場合があります。
html/deprecated-element
非推奨の HTML 要素を検出します。
既定の重大度: warning
プリセット: happy-path, nuxt, ecosystem, opinionated
自動修正: なし。修正内容を確認してください
適用範囲: Vue SFC のテンプレートと各ブロック。ルールに必要な script の文脈も例に含めています。
オプション: ルール固有のオプションはありません。重大度とプリセットは設定できます。
設定(Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"html/deprecated-element": "warn"
}
},
},
});
vp run lint
悪い
中央揃えのために、非推奨の center 要素を使っています。
<template>
<center>Profile</center>
</template>
良い
内容は残し、section とスタイル用のクラスに置き換えます。
<template>
<section class="profile">Profile</section>
</template>
良い例は上記の設定でこのルールの診断が出ない例です。他のルールの診断は出る場合があります。
html/id-duplication
同じテンプレート内の ID 重複を検出します。
既定の重大度: error
プリセット: essential, happy-path, nuxt, ecosystem, opinionated
自動修正: なし。修正内容を確認してください
適用範囲: Vue SFC のテンプレートと各ブロック。ルールに必要な script の文脈も例に含めています。
オプション: ルール固有のオプションはありません。重大度とプリセットは設定できます。
設定(Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"html/id-duplication": "error"
}
},
},
});
vp run lint
悪い
入力欄と説明の p が同じ id="email" を使っているため、label の参照先が一意に定まりません。
<template>
<label for="email">Email</label>
<input id="email" />
<p id="email">Required</p>
</template>
良い
入力欄は email、説明は email-help に分け、aria-describedby で説明を参照します。
<template>
<label for="email">Email</label>
<input id="email" aria-describedby="email-help" />
<p id="email-help">Required</p>
</template>
良い例は上記の設定でこのルールの診断が出ない例です。他のルールの診断は出る場合があります。
html/no-consecutive-br
連続する br 要素による余白指定を検出します。
既定の重大度: warning
プリセット: happy-path, nuxt, ecosystem, opinionated
自動修正: なし。修正内容を確認してください
適用範囲: Vue SFC のテンプレートと各ブロック。ルールに必要な script の文脈も例に含めています。
オプション: ルール固有のオプションはありません。重大度とプリセットは設定できます。
設定(Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"html/no-consecutive-br": "warn"
}
},
},
});
vp run lint
悪い
一つの p の中に br を二つ続けて入れ、ブロック間の余白を作っています。
<template>
<p>First line<br /><br />Second block</p>
</template>
良い
内容を別の p に分け、連続した br を使いません。
<template>
<p>First line</p>
<p>Second block</p>
</template>
良い例は上記の設定でこのルールの診断が出ない例です。他のルールの診断は出る場合があります。
html/no-dupe-style-properties
静的 style 属性内のプロパティ重複を検出します。
既定の重大度: warning
プリセット: nuxt, opinionated
自動修正: なし。修正内容を確認してください
適用範囲: Vue SFC のテンプレートと各ブロック。ルールに必要な script の文脈も例に含めています。
オプション: ルール固有のオプションはありません。重大度とプリセットは設定できます。
設定(Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"html/no-dupe-style-properties": "warn"
}
},
},
});
vp run lint
悪い
静的な style の中で同じプロパティを重複させています。margin と MARGIN も同じプロパティとして扱われます。
<template>
<div style="color: red; color: blue">text</div>
<div style="margin: 0; MARGIN: 1px">text</div>
</template>
良い
静的な style 属性には color と background をそれぞれ一度だけ指定し、同じプロパティの重複を避けます。動的な style バインディングはこの静的属性の検査の対象外です。
<template>
<div style="color: red; background: blue">text</div>
<div :style="{ color: a, color: b }">text</div>
</template>
良い例は上記の設定でこのルールの診断が出ない例です。他のルールの診断は出る場合があります。
html/no-duplicate-class
静的 class 属性内のクラス名重複を検出します。
既定の重大度: warning
プリセット: happy-path, nuxt, ecosystem, opinionated
自動修正: なし。修正内容を確認してください
適用範囲: Vue SFC のテンプレートと各ブロック。ルールに必要な script の文脈も例に含めています。
オプション: ルール固有のオプションはありません。重大度とプリセットは設定できます。
設定(Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"html/no-duplicate-class": "warn"
}
},
},
});
vp run lint
悪い
静的な class の中に btn が二回あります。
<template>
<div class="btn btn primary">click</div>
</template>
良い
btn は一回だけ残し、別の primary と合わせて指定します。
<template>
<div class="btn primary">click</div>
</template>
良い例は上記の設定でこのルールの診断が出ない例です。他のルールの診断は出る場合があります。
html/no-duplicate-dt
dl 内の dt の名前重複を検出します。
既定の重大度: warning
プリセット: happy-path, nuxt, ecosystem, opinionated
自動修正: なし。修正内容を確認してください
適用範囲: Vue SFC のテンプレートと各ブロック。ルールに必要な script の文脈も例に含めています。
オプション: ルール固有のオプションはありません。重大度とプリセットは設定できます。
設定(Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"html/no-duplicate-dt": "warn"
}
},
},
});
vp run lint
悪い
同じ dl に API の用語を二回指定しています。
<template>
<dl>
<dt>API</dt>
<dd>Public interface</dd>
<dt>API</dt>
<dd>Internal service</dd>
</dl>
</template>
良い
API の dt を一つにし、その後に二つの dd を並べます。
<template>
<dl>
<dt>API</dt>
<dd>Public interface</dd>
<dd>Internal service</dd>
</dl>
</template>
良い例は上記の設定でこのルールの診断が出ない例です。他のルールの診断は出る場合があります。
html/no-empty-palpable-content
可視コンテンツを期待する要素が空の場合に検出します。
既定の重大度: warning
プリセット: happy-path, nuxt, ecosystem, opinionated
自動修正: なし。修正内容を確認してください
適用範囲: Vue SFC のテンプレートと各ブロック。ルールに必要な script の文脈も例に含めています。
オプション: 型付きオプションと既定値を参照してください。
設定(Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"html/no-empty-palpable-content": "warn"
}
},
},
});
vp run lint
悪い
p、li、td がいずれも空で、意味のある内容がありません。
<template>
<p></p>
<li></li>
<td></td>
</template>
良い
p は文字、li は補間で内容を入れ、空の td には aria-label で名前を指定します。
<template>
<p>Overview</p>
<li>{{ item.label }}</li>
<td aria-label="No value"></td>
</template>
良い例は上記の設定でこのルールの診断が出ない例です。他のルールの診断は出る場合があります。
html/require-datetime
time 要素に機械可読の datetime を指定します。
既定の重大度: warning
プリセット: happy-path, nuxt, ecosystem, opinionated
自動修正: なし。修正内容を確認してください
適用範囲: Vue SFC のテンプレートと各ブロック。ルールに必要な script の文脈も例に含めています。
オプション: ルール固有のオプションはありません。重大度とプリセットは設定できます。
設定(Vite+)
import { defineConfig } from "@vizejs/vite-plugin/vite-plus";
export default defineConfig({
vue: {
linter: {
"preset": "incremental",
"rules": {
"html/require-datetime": "warn"
}
},
},
});
vp run lint
悪い
time 要素には表示用の日付だけがあり、機械可読の datetime 属性がありません。
<template>
<time>May 13, 2026</time>
</template>
良い
表示した日付に対応する機械可読の日付を、datetime="2026-05-13" として指定します。
<template>
<time datetime="2026-05-13">May 13, 2026</time>
</template>
良い例は上記の設定でこのルールの診断が出ない例です。他のルールの診断は出る場合があります。