Vize

アクセシビリティの基本

このルール群では、画像の代替テキスト、リンクの内容、ARIA 属性、キーボード操作、フォームのラベルなど、 Vue テンプレートの基本的なアクセシビリティ情報を確認します。 画像やリンク、入力欄をコンポーネントに追加するときは、ここから確認してください。

たとえば、入力欄を追加する前にフォーム部品のラベルを開き、 悪い例と良い例を比較します。掲載された Vite+ の設定でルールを有効にし、vp run lint を実行してください。 アクセシビリティの全ルールでは、関連するルールも確認できます。

このページに、各ルールの目的・前提・設定と、省略のない悪い例・良い例をまとめています。変更箇所は行の色で示します。コードをコピーすると、ソースコード全体を取得できます。各例に現在の対応範囲も明記しています。

ルール 例 目的
a11y/alt-text 悪い · 良い 画像などのメディアに代替テキストを用意します。
a11y/anchor-has-content 悪い · 良い リンクに支援技術で読める内容を用意します。
a11y/anchor-is-valid 悪い · 良い リンクの href に有効な移動先を指定します。
a11y/aria-props 悪い · 良い 存在しない ARIA 属性を検出します。
a11y/aria-role 悪い · 良い 抽象ロールを除く、有効な ARIA role を指定します。
a11y/aria-unsupported-elements 悪い · 良い ARIA 属性を使用できない要素への指定を検出します。
a11y/click-events-have-key-events 悪い · 良い クリックで操作する要素にキーボード操作も用意します。
a11y/form-control-has-label 悪い · 良い フォーム部品に関連付けられたラベルを用意します。

全ルール · ルールのオプション · ESLint 移行対応表 · プロジェクトの検査 · 子への属性の継承

a11y/alt-text

画像などのメディアに代替テキストを用意します。

悪い例 · 良い例

既定の重大度: 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": {
        "a11y/alt-text": "warn"
      }
    },
  },
});
vp run lint

悪い

画像の送信ボタンには URL しかなく、操作を説明する alt がありません。

<template>
  <input type="image" src="/submit.png" />
</template>

良い

alt="Submit search" を追加し、検索を送信する操作を説明する名前を支援技術に伝えます。

<template>
  <input type="image" src="/submit.png" alt="Submit search" />
</template>

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

実装 · 全ルール

a11y/anchor-has-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": {
        "a11y/anchor-has-content": "warn"
      }
    },
  },
});
vp run lint

悪い

/settings へのリンクが空で、移動先を説明する内容がありません。

<template>
  <a href="/settings"></a>
</template>

良い

同じリンクに Settings の文字を入れ、移動先を示します。

<template>
  <a href="/settings">Settings</a>
</template>

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

実装 · 全ルール

a11y/anchor-is-valid

リンクの href に有効な移動先を指定します。

悪い例 · 良い例

既定の重大度: 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": {
        "a11y/anchor-is-valid": "warn"
      }
    },
  },
});
vp run lint

悪い

一つ目は操作に # を使い、二つ目は JavaScript URL を使っています。どちらも通常の移動先を持つリンクではありません。

<template>
  <a href="#" @click="openPanel">Open panel</a>
  <a href="JaVaScRiPt:void(0)">Run action</a>
</template>

良い

openPanel は button で実行し、リンクには実際の移動先 /docs/javascript-urls を指定します。

<template>
  <button type="button" @click="openPanel">Open panel</button>
  <a href="/docs/javascript-urls">JavaScript URL guide</a>
</template>

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

実装 · 全ルール

a11y/aria-props

存在しない ARIA 属性を検出します。

悪い例 · 良い例

既定の重大度: error
プリセット: 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": {
        "a11y/aria-props": "error"
      }
    },
  },
});
vp run lint

悪い

aria-lable は綴りが誤っており、有効な ARIA 属性ではありません。

<template>
  <button aria-lable="Save changes">Save</button>
</template>

良い

正しい aria-label に変更してボタンの名前を指定します。

<template>
  <button aria-label="Save changes">Save</button>
</template>

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

実装 · 全ルール

a11y/aria-role

抽象ロールを除く、有効な ARIA role を指定します。

悪い例 · 良い例

既定の重大度: error
プリセット: 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": {
        "a11y/aria-role": "error"
      }
    },
  },
});
vp run lint

悪い

datepicker は有効な ARIA ロールではありません。

<template>
  <section role="datepicker">...</section>
</template>

良い

有効な ARIA ロールである dialog を使い、日付を選択する領域の名前も指定します。

<template>
  <section role="dialog" aria-label="Choose a date">...</section>
</template>

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

実装 · 全ルール

a11y/aria-unsupported-elements

ARIA 属性を使用できない要素への指定を検出します。

悪い例 · 良い例

既定の重大度: error
プリセット: 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": {
        "a11y/aria-unsupported-elements": "error"
      }
    },
  },
});
vp run lint

悪い

ARIA 属性を使えない meta に aria-hidden を指定しています。

<template>
  <meta charset="utf-8" aria-hidden="true" />
</template>

良い

ARIA 属性だけを取り除き、文字コードの宣言は維持します。

<template>
  <meta charset="utf-8" />
</template>

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

実装 · 全ルール

a11y/click-events-have-key-events

クリックで操作する要素にキーボード操作も用意します。

悪い例 · 良い例

既定の重大度: warning
プリセット: happy-path, nuxt, ecosystem, opinionated
自動修正: なし。修正内容を確認してください
適用範囲: Vue SFC のテンプレートと各ブロック。ルールに必要な script の文脈も例に含めています。
オプション: ルール固有のオプションはありません。重大度とプリセットは設定できます。

対話的な役割を持たない通常要素が対象です。button や対話的な ARIA role を持つ要素はこの検出の対象外です。

設定(Vite+)

import { defineConfig } from "@vizejs/vite-plugin/vite-plus";

export default defineConfig({
  vue: {
    linter: {
      "preset": "incremental",
      "rules": {
        "a11y/click-events-have-key-events": "warn"
      }
    },
  },
});
vp run lint

悪い

通常の div にクリックハンドラーだけを指定し、キーボード操作に対応していません。

<template>
<div @click="activate">Activate</div>
</template>

良い

同じ activate を button に指定し、標準のキーボード操作を使います。

<template>
<button @click="activate">Activate</button>
</template>

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

実装 · 全ルール

a11y/form-control-has-label

フォーム部品に関連付けられたラベルを用意します。

悪い例 · 良い例

既定の重大度: 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": {
        "a11y/form-control-has-label": "warn"
      }
    },
  },
});
vp run lint

悪い

検索欄に入力内容を説明する label がありません。

<template>
  <input type="search" />
</template>

良い

入力欄を label で囲み、Search の文字と関連付けます。

<template>
  <label>
    Search
    <input type="search" />
  </label>
</template>

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

実装 · 全ルール