Vize

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>

良い例は上記の設定でこのルールの診断が出ない例です。他のルールの診断は出る場合があります。

実装 · 全ルール