坂本研のゼミ室

react-axeでアクセシビリティの向上を目指す

はじめに

前回の記事で紹介させていただいたサイトのアクセシビリティをチェックしたら71点でした。

sketchy-kitchenのa11y

本記事では、下記の記事を参考にさせていただき、react-axeを用いてアクセシビリティの向上を目指します。

tech.mercari.com

本記事で記述しているのはこのWebサイトのトップページのみの修正箇所です。

やったこと

react-axeを導入

react-axeを参考記事と同様に導入します

  • react-axeと@types/react-axeをインストール
npm i react-axe
npm i @types/react-axe
  • 開発環境で結果を確認したいので dynamic import でライブラリをインポート

if (process.env.NODE_ENV !== 'production') {
  import('react-axe').then((axe) => {
    axe.default(React, ReactDOM, 1000)
    ReactDOM.render(<App />, document.getElementById('root'))
  })
} else {
  ReactDOM.render(
    <React.StrictMode>
      <App />
    </React.StrictMode>,
    document.getElementById('root')
  )
}

こうする事でコンソールに New aXe issuesというのが出力されています。

さらにリンクをクリックすると詳しい詳細を確認する事ができました。(日本語に対応していました)

あとは New aXe issuesの通りに修正していきます。

New aXe issues

以下に実際に出力されたものを記します。

critical: Buttons must have discernible text

ボタンには認識可能なテキストが存在しなければなりません

詳細はこちらから確認できます

ボタン要素にaria-label属性を追加しました。

<Button
    aria-label="キーワードで検索"
    size="large"
    variant="contained"
    color="default"
    className={classes.button}
    onClick={() => history.push('/search')}
>
    キーワードで探す
</Button>

serious: Elements must have sufficient color contrast

テキスト要素は背景に対して十分な色のコントラストがなければなりません

詳細はこちらから確認できます

ヘッダーの背景色と文字の色のコントラストをつけました。

moderate: Document must have one main landmark

ドキュメントにはmainランドマークが1つ含まれていなければなりません

詳細はこちらから確認できます

mainタグを記述していなかったのでmainタグを記述しました。

リンクには認識可能なテキストが存在しなければなりません

詳細はこちらから確認できます

リンク要素にaria-label属性を追加しました。

moderate: Page must contain a level-one heading

ページにはレベル1の見出しが含まれていなければなりません

詳細はこちらから確認できます

h2タグで記述していた部分をh1タグに修正しました。

moderate: All page content must be contained by landmarks

ページのすべてのコンテンツはlandmarkに含まれていなければなりません

詳細はこちらから確認できます

メインとなる部分のコンテンツをmainタグで囲んでいなかったので、mainタグの中に記述しました。

おわりに

トップページ以外も全て同じようにreact-axeの New aXe issuesに従い修正を行いました。

その結果アクセシビリティのスコアも100点にする事ができました。

f:id:TakaShinoda:20200531002400p:plain

修正後のソースコードはこちらにあります。

github.com

参考サイト

tech.mercari.com

github.com