Skip to content

Instantly share code, notes, and snippets.

@yamanoku
Last active July 31, 2021 04:56
Show Gist options
  • Save yamanoku/669dea8c19fdb400d78c4bcf03b794d6 to your computer and use it in GitHub Desktop.
Save yamanoku/669dea8c19fdb400d78c4bcf03b794d6 to your computer and use it in GitHub Desktop.

アクセシビリティ

使い慣れたウェブアクセシビリティ API をプラットフォームに依存しない形で提供。

React Native for Web におけるアクセシビリティは、複数の独立した Web API をまとまったシステムとして統合しています。支援技術(VoiceOver、TalkBack といったスクリーンリーダーなど)は、ウェブアプリの構造、目的、対話性について、HTML 要素、属性、および ARIA in HTML から有用な情報を得ます。

アクセシビリティ Props API

React Native for Web には、アクセシブルなアプリを作るための API が含まれています。Web で最も一般的でサポートされているアクセシビリティ機能が、プラットフォームに依存しない accessibility* props として公開されています。

accessibilityActiveDescendant: ?string

aria-activedescendant に相当。

accessibilityAtomic: ?boolean

aria-atomic に相当。

accessibilityAutoComplete: ?string

aria-autocomplete に相当。

accessibilityBusy: ?boolean

aria-busy に相当。

accessibilityChecked: ?(boolean | "mixed")

aria-checked に相当。

accessibilityColumnCount: ?number

aria-colcount に相当。

accessibilityColumnIndex: ?number

aria-colindex に相当。

accessibilityColumnSpan: ?number

aria-colspan に相当。

accessibilityControls: ?(string | Array)

aria-controls に相当。

accessibilityCurrent: ?(boolean | "page" | "step" | "location" | "date" | time")

aria-current に相当。

accessibilityDescribedBy: ?(string | Array)

aria-describedby に相当。

accessibilityDetails: ?string

aria-details に相当。

accessibilityDisabled: ?boolean

aria-disabled に相当。

accessibilityErrorMessage: ?string

aria-errormessage に相当。

accessibilityExpanded: ?boolean

aria-expanded に相当。

accessibilityFlowTo: ?(string | Array)

aria-flowto に相当。

accessibilityHasPopup: ?string

aria-haspopup に相当。

accessibilityHidden: ?boolean

aria-hidden に相当。

accessibilityInvalid: ?boolean

aria-invalid に相当。

accessibilityKeyShortcuts: ?Array

aria-keyshortcuts に相当。

accessibilityLabel: ?string

aria-label に相当。

accessibilityLabelledBy: ?(string | Array)

aria-labelledby に相当。

accessibilityLevel: ?number

aria-level に相当。

accessibilityLiveRegion: ?("assertive" | "off" | "polite")

aria-live に相当。

accessibilityModal: ?boolean

aria-modal に相当。

accessibilityMultiline: ?boolean

aria-multiline に相当。

accessibilityMultiSelectable: ?boolean

aria-multiselectable に相当。

accessibilityOrientation: ?("horizontal" | "vertical")

aria-orientation に相当。

accessibilityOwns: ?(string | Array)

aria-owns に相当。

accessibilityPlaceholder: ?string

aria-placeholder に相当。

accessibilityPosInSet: ?number

aria-posinset に相当。

accessibilityPressed: ?boolean

aria-pressed に相当。

accessibilityReadOnly: ?boolean

aria-readonly に相当。

accessibilityRequired: ?boolean

aria-required に相当。

accessibilityRole: ?boolean

role に相当。

accessibilityRoleDescription: ?string

aria-roledescription に相当。

accessibilityRowCount: ?number

aria-rowcount に相当。

accessibilityRowIndex: ?number

aria-rowindex に相当。

accessibilityRowSpan: ?number

aria-rowspan に相当。

accessibilitySelected: ?boolean

aria-selected に相当。

accessibilitySetSize: ?number

aria-setsize に相当。

accessibilitySort: ?("ascending" | "descending" | "none" | "other")

aria-sort に相当。

accessibilityValueMax: ?number

aria-valuemax に相当。

accessibilityValueMin: ?number

aria-valuemin に相当。

accessibilityValueNow: ?number

aria-valuenow に相当。

accessibilityValueText: ?string

aria-valuetext に相当。


Accessibility パターン

Links

TextView コンポーネントは、リンクとしてレンダリングすることができます。href prop が設定されている場合、要素を presentation として変更することなく、要素は <a> タグとしてレンダリングします。

<Text href="/" />
// <a href="/" ></a>

hrefAttrs prop はリンク関連の属性を設定します。

const hrefAttrs = { download: true, rel: "nofollow", target: "blank" };

<Text
  href="/document.pdf"
  hrefAttrs={hrefAttrs}
/>
// <a download href="/document.pdf" rel="nofollow" target="_blank"></a>

キーボードフォーカス

focusable prop は、コンポーネントがユーザーフォーカス可能で、キーボードタブフローとして表示されるかどうかを決定します。この prop は、React Native for Android/iOS で見られる accessible prop の代わりに使用する必要がありますが、React Native for Web/Windows/macOS では実装されていません。

<View focusable={true} />
// <div tabindex="0"></div>

<Text focusable={false} href="/" />
// <a href="/" tabindex="-1"></a>

ご存知ですか? UIManager.focus(viewRef.current) により、任意の要素(キーボードタブフローにない要素を含む)をプログラムコードによってフォーカスできるようになります。

アクセシブル HTML

React Native for Web コンポーネントは、aria-* 属性と同等の accessibility* prop によってのみセマンティクスを表現します。例えば、accessibilityRole は HTML の role 属性に、accessibilityLabelaria-label に相当します (React Native の accessibility props との追加互換性も含まれています)。

<View
  accessibilityLabel="..."
  accessibilityPressed={false}
  accessibilityRole="menuitem"
  nativeID="abc"
/>
/*
<div
  aria-label="..."
  aria-pressed="false"
  id="abc"
  role="menuitem"
/>
*/

セマンティクス HTML

accessibilityRole の値は、必要に応じて類似した HTML 要素を推論するために使用されます。これは、セマンティクスとアクセシビリティ情報をエンコードするため、十分にサポートされたネイティブのメカニズムに依存するために使われます。

<View accessibilityRole="article">
  <Text accessibilityRole="paragraph">これは記事です</Text>
</View>
/*
<article>
  <div role="paragraph">これは記事です</div>
</article>
*/

TextView の両方がブロックレベルの子をサポートしているため、"paragraph" role は <p>タグにマッピングされません。なぜなら、要素内にブロックレベルの子を含めることは HTML 適合エラーになるからです。

"heading" role が accessibilityLevel と組み合わされた場合、同等の HTML 見出し要素がレンダリングされます。それ以外の場合は、<h1> としてレンダリングされます。

<Text accessibilityRole="heading" /> /* <h1> */
<Text accessibilityRole="heading" accessibilityLevel={2} /> /* <h2> */

注意点: 時間が経過した後やユーザが操作した後に accessibilityRole の値を変更することは避けてください。一般的にアクセシビリティ API は、role が変更された場合に支援技術に通知する手段を提供していません。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment