ProgressBarについて - React Ariaの実装読むぞ
こんにちは、フロントエンドエンジニアの mehm8128 です。
今日は ProgressBar について書いていきます。
使用例
ドキュメントからそのまま取ってきています。
function ProgressBar(props) {
let {
label,
showValueLabel = !!label,
value,
minValue = 0,
maxValue = 100,
} = props;
let { progressBarProps, labelProps } = useProgressBar(props);
// Calculate the width of the progress bar as a percentage
let percentage = (value - minValue) / (maxValue - minValue);
let barWidth = `${Math.round(percentage * 100)}%`;
return (
<div {...progressBarProps} style={{ width: 200 }}>
<div
style={{
display: "flex",
justifyContent: "space-between",
}}
>
{label && <span {...labelProps}>{label}</span>}
{showValueLabel && <span>{progressBarProps["aria-valuetext"]}</span>}
</div>
<div style={{ height: 10, background: "lightgray" }}>
<div
style={{
width: barWidth,
height: 10,
background: "orange",
}}
/>
</div>
</div>
);
}
本題
WAI-ARIA はこちらです。
aria-
属性
React Aria の実装では 4 つのaria-
属性がつけられています。
aria-valuemin
とaria-valuemax
は最小値と最大値、aria-valuenow
は現在どこまで進んでいるかを表す値です。また、aria-valuetext
はスクリーンリーダーに読み上げさせるテキストで、progressbar
role はこれが設定されていればaria-valuenow
の代わりにこれが読み上げられます。今回の hook では i18n 対応も行われているようです。
ただし、現在の進捗状況が不明(indeterminate)なときにはisIndeterminate
を渡すとaria-valuenow
とaria-valuetext
がundefined
になり、NVDA ではビジーインジケーター
と読み上げられます。
aria-
属性 2
useProgressBar
自体にはついていないですが説明したいaria-
属性がまだあります。
ProgressBar がページ内のどこかがローディング中であることを表している場合、そのローディング中の要素でaria-describedby
によって ProgressBar を参照し、さらにaria-busy
をtrue
にする必要があります。
aria-busy="true"
は、要素の更新中に live region の通知が行われるのを防ぐためのものらしいです。
the global
aria-busy
state indicates an element is being modified and that assistive technologies may want to wait until the changes are complete before informing the user about the update.
Cybozu Inside Out でも関連記事を見つけたので貼っておきます。
isPending
について
button のprogressbar は、実は 2 日目の記事でも登場していました。
まとめ
明日の担当は @mehm8128 さんで、Combobox についての記事です。お楽しみにー
Discussion