eslint-plugin-vuejs-accessibility入門

2024/02/18に公開

eslint-plugin-vuejs-accessibilityとは何か

eslint-plugin-vuejs-accessibilityは、Vue.jsのコンポーネントにおけるアクセシビリティの問題点を検出するためのESLintプラグインです。

https://github.com/vue-a11y/eslint-plugin-vuejs-accessibility

類似するものとしてeslint-plugin-jsx-a11yがあります。これはReactのJSXにおけるアクセシビリティの問題を検出するためのESLintプラグインです。今あるルールはこのプラグインから参考になっている部分がいくつかあります。

eslint-plugin-vue-a11yとの違い

元々は個人で開発していたeslint-plugin-vue-a11yというものがあります。

https://github.com/maranran/eslint-plugin-vue-a11y

こちらのeslint-plugin-vue-a11yは現在メンテナンスがされておりません。今回紹介するeslint-plugin-vuejs-accessibilityはvue-a11yというOrganizationsにて現在メンテナンスされているのでこちらを使うことをお勧めします。

インストール

それぞれのパッケージマネージャからインストールします。

npm

npm install --save-dev eslint-plugin-vuejs-accessibility

yarn

yarn add --dev eslint-plugin-vuejs-accessibility

pnpm

pnpm add -D eslint-plugin-vuejs-accessibility

設定

ESLintの設定から以下のように追加します。

{
  plugins: [
    'vuejs-accessibility'
  ],
}

適応したいルールを個別で設定できます。

{
  rules: {
    'vuejs-accessibility/label-has-for': 'error',
    // ...
  }
}

個別指定ではなく、extendsより推奨となっているルールをまとめて使うこともできます。

{
  extends: [
    'plugin:vuejs-accessibility/recommended'
  ],
}

推奨となっているルールはRule Overviewより確認できます。

ルールについての説明

それぞれのルールについて簡単に説明します。

alt-text

代替テキストを必要とするすべての要素に必要な属性が設定されていることを確認します。

alt-text | eslint-plugin-vuejs-a11y

anchor-has-content

<a>要素がコンテンツを持っていることを確認します。

anchor-has-content | eslint-plugin-vuejs-a11y

aria-props

存在する正しいARIA属性で設定されていることを確認します。

aria-props | eslint-plugin-vuejs-a11y

aria-role

存在する正しい role 属性で設定されていることを確認します。

aria-role | eslint-plugin-vuejs-a11y

aria-unsupported-elements

ARIA属性をサポートされていない要素にARIA属性が設定されていないことを確認します。

aria-unsupported-elements | eslint-plugin-vuejs-a11y

click-events-have-key-events

@clickイベントを指定する要素は、同様に @keyup@keydown@keypressのいずれかのイベントを指定されていることを確認します。

click-events-have-key-events | eslint-plugin-vuejs-a11y

form-control-has-label

フォーム要素が対応する <label> 要素をもつ、あるいは aria-label 属性か aria-labelledby 属性が設定されていることを確認します。

form-control-has-label | eslint-plugin-vuejs-a11y

heading-has-content

見出し(<h1><h6>)要素がコンテンツを持っていることを確認します。

heading-has-content | eslint-plugin-vuejs-a11y

iframe-has-title

<iframe>要素に title 属性が設定されていることを確認します。

iframe-has-title | eslint-plugin-vuejs-a11y

interactive-supports-focus

インタラクティブな要素がフォーカス可能であることを確認します。

interactive-supports-focus | eslint-plugin-vuejs-a11y

label-has-for

フォーム要素が <label> 要素内でネストされており、<label>要素の for 属性にフォーム要素のID値が設定されていることを確認します。

label-has-for | eslint-plugin-vuejs-a11y

media-has-caption

メディア要素が字幕データを挿入できる <track> 要素を持っていることを確認します。muted属性が設定されている場合は除外されます。

media-has-caption | eslint-plugin-vuejs-a11y

mouse-events-have-key-events

いずれかのマウスイベント(@mouseenter@mouseover@mouseout@mouseleave@hover)を持つ要素には、同様に @focus@blurのいずれかのイベントを指定しているかを確認します。

mouse-events-have-key-events | eslint-plugin-vuejs-a11y

no-access-key

accesskey属性を設定した要素がないことを確認します。

no-access-key | eslint-plugin-vuejs-a11y

no-aria-hidden-on-focusable

aria-hidden="true"がフォーカス可能な要素やその要素の親に指定されていないことを確認します。

no-aria-hidden-on-focusable | eslint-plugin-vuejs-a11y

no-autofocus

autofocus属性を設定した要素がないことを確認します。

no-autofocus | eslint-plugin-vuejs-a11y

no-distracting-elements

<blink><marquee> などの気の散る要素がないことを確認します。

no-distracting-elements | eslint-plugin-vuejs-a11y

no-onchange

@changeイベントを指定した場合は同様に @blur イベントも指定するか、@blurイベントだけの指定になっているかを確認します。

no-onchange | eslint-plugin-vuejs-a11y

no-redundant-roles

デフォルトで role 属性をもつ要素に対して、更に role 属性を設定して冗長になっていないかを確認します。

no-redundant-roles | eslint-plugin-vuejs-a11y

no-role-presentation-on-focusable

role="presentation"がフォーカス可能な要素やその要素の親に指定されていないことを確認します。

no-role-presentation-on-focusable | eslint-plugin-vuejs-a11y

no-static-element-interactions

インタラクティブな role を持たない要素(divspan など)にインタラクティブな操作を指定していないことを確認します。

no-static-element-interactions | eslint-plugin-vuejs-a11y

role-has-required-aria-props

ある role 属性に対して必要なARIA属性がすべて設定されていることを確認します。

role-has-required-aria-props | eslint-plugin-vuejs-a11y

tabindex-no-positive

tabindex属性で正の値(1以上)が設定されていないことを確認します。

tabindex-no-positive | eslint-plugin-vuejs-a11y

活用事例

eslint-plugin-vuejs-accessibilityを実際に活用している事例を紹介します。

https://note.jp/n/ne87cb90e1039

https://product.st.inc/entry/2022/12/24/143311

GitHubで編集を提案
Vue・Nuxt 情報が集まる広場 / Plaza for Vue・Nuxt.

Discussion