Vue.js でアクセシブルなコンポーネントをつくるために 草案
Vue Fes Japan 2019 発表ネタまとめ
Vue3 からはじめる Web アクセシビリティ 草案
1
アクセシビリティの重要性
あまりそこまで重点を置かない
WebサイトからWebアプリケーションへの変遷
周辺技術の進化によりフロントエンド開発に重点が置かれてきていること
Webそのものがもつ強みを活かす
WebAIM: The WebAIM Million - The 2022 report on the accessibility of the top 1,000,000 home pages
https://gyazo.com/21c5c938a4cb3ab125d680cb326e208c
Vue.jsは下位
2
誤ったアクセシビリティ対応について
基本として HTMLでのマークアップを心がける
No ARIA is better than Bad ARIA
悪いARIAよりARIA無しのが良い
fragment 処理を忘れない
<table>や<ul>などを親にもつ場合
WAI-ARIA
aria-label
基本的にはテキストで提供するようにする
オーバーラップされることを気をつける
タグによっては使用できない
aria-hidden
「完全に消す」ということを理解する
aria-live
値を誤ると都度通知されてしまう
aria-live="assertive"
ARIA Authoring Practices Guide | APG | WAI | W3Cを参考にする
ただし
The code in this example is not intended for production environments. Before using it for any purpose, read this to understand why.
を理解する
Volarによる指摘
型によりaria-* の値をサジェストしてくれる
3
汎用性のあるアクセシブルなコンポーネントを作る方法
既存のHTMLをWAI-ARIAで補強する、という考え方で使う
マークアップで使えるものはそのままつかう
既存のHTMLでは表現できないものはどうする?
WAI-ARIAで補強する
ルールを確認する
フォーカスマネジメント
VueUse
https://vueuse.org/core/useFocus/
https://vueuse.org/integrations/usefocustrap/
portal要素と組み合わせて使う
https://vueuse.org/core/useconfirmdialog/
TypeScriptでの型定義で強化する
code:example-heading-vue.html
<script setup lang="ts">
import { computed, defineProps } from 'vue';
type Props = {
headlineLevel: 1 | 2 | 3 | 4 | 5 | 6;
headlineText: string;
}
const props = defineProps<Props>();
const headlineTag = computed(() => h${props.headlineLevel});
const headingText = computed(() => props.headlineText);
</script>
<template>
<component :is="headlineTag">
{{ headingText }}
</component>
</template>
ID管理
パーツに置いては動的なUUID生成が良さそう
2022/5/21#6288cc11c2cd3f0000b3ab36
Can vue provide useId hook · Issue #5120 · vuejs/core · GitHub
Headless UIパターン
4
コンポーネントライブラリはアクセシブルであるか?
コンポーネントのアクセシビリティチェック・テストの方法
静的解析
eslint-plugin-vuejs-accessibility
ルールは検討する
alt-text
代替の内容が必要な際にalt、aria-labelなどがあるかのチェック
aria-props
定義されていないaria属性(タイポ含む)をチェック
aria-role
存在しないもの、abstractなroleの使用をチェック
aria-unsupported-elements
aria属性を使用できないタグで使用していないかチェック
no-redundant-roles
タグに重複したroleを付与していないかチェック
role-has-required-aria-props
roleの使用において必要になるaria属性があるかチェック
markuplint
vue-parser を使用する
スナップショットテストからレンダリング結果を得る
アクセシブルな名前
accessibility treeを見る
ユニットテスト
jest-axe
結合テスト
testing-libary
支援技術側のチェック
自動テストツール
Guidepup
web-test-runner-voiceover
VoiceOver.js
実際に試験してもらう
サニーバンク
5
より深みを知っていく
Accessible Vue – The Why and How of building inclusive apps in Vue.js
WCAGに沿ってアクセシブルにするガイドラインを知ろう!
MDNのHTMLにおける「アクセシビリティの考慮」を読め!!
HTML解体新書を読め!!!
WAI-ARIA勉強会見ろ!!!!