Carousel
Severity | Serious |
---|---|
Accessibility Principle | Operable |
Affected users | Visual, Motor |
Success criterion | 2.3.3 |
When implementing a Carousel, it's essential to ensure that users can easily navigate through its items.
Expectations
Assistive Technology: Screen Reader
- When: The user focuses a Carousel component
- Then: The Screen Reader announces: [Component label] Adjustable/Slider, swipe up or down to adjust
- When: User swipes up
- Then: The previous item is focused
- When: User swipes down
- Then: The next item is focused
- When: User swipes up
- Then: The Screen Reader announces: [Component label] Adjustable/Slider, swipe up or down to adjust
VoiceOver | Talkback |
---|---|
[Component label], Adjustable, swipe up or down with one finger to adjust the value | [Component label], Slider, swipe up or swipe down to adjust |
When the Screen Reader is activated, navigation typically relies on specific gestures to interact with content:
- 1-finger swipe up: This gesture usually focuses on the next item
- 1-finger swipe down: This gesture focuses on the previous item
Example
To implement this navigation behavior in React Native when the Screen Reader is on, we need to:
- use the accessibility role adjustable
- set
accessibilityActions={[{ name: 'increment' }, { name: 'decrement' }]}
- handle onAccessibilityAction to change the index
<FlatList
ref={flatList}
data={data}
renderItem={renderItem}
accessible={true}
accessibilityLabel="Carousel"
accessibilityRole="adjustable"
accessibilityActions={[{ name: 'increment' }, { name: 'decrement' }]}
onAccessibilityAction={(event: AccessibilityActionEvent) => {
const value = event.nativeEvent.actionName === 'increment' ? 1 : -1;
const newIndex = carouselIndexForScreenReader.current + value;
carouselIndexForScreenReader.current = clamp(newIndex, 0, data.length - 1);
flatList.current?.scrollToIndex({
index: carouselIndexForScreenReader.current,
});
}}
/>