<AccessibleCSSinJS />
Maya Shavin
Senior Software Engineer
In this talk
- ✨ A quick recap of accessibility
- 😰 Challenges & Solutions
- ✅ Tools
- 🚀 Developing an accessible mindset
What is accessibility?
See
🦻
Hear
Understand
⌨️
Use/Navigation
See
🦻
Hear
Understand
⌨️
Use/Navigation
Standards
Web Content Accessibility Guidelines
Perceivable
Operable
Understandable
Robust
WCAG 2.1
A
AA
AAA
- Web content
- Assist Technologies (WAI-ARIA)
- Web technology (Flash, video, audio)
- Visually impaired
- Cognitive disorders
Accessibility is HARD
Accessibility in React is HARD
Accessibility in React is COMPLEX
But NOT hard!
Accessibility is COMPLEX
Accessibility in components
With or without CSS-in-JS
Semantic HTML Tags
Focus management
Screen Reader support (WAI-ARIA etc)
Dynamic Content
Accessibility in components
Magnification support (200%, 400%)
Using Sematic HTML Tags
Landmarks/Regions
& Headings
table
h1-h7
article
header
footer
nav
dialog
button
a
input
JS
CSS
Parse CSS
Inject to Stylesheet
stylesheet.insertRule
Browser
HTML Paint
load
download
✅ Keep the heading order structure (h1 - h7)
✅ Use CSS order to re-arrange the appearance
Focus management
- Order of focus?
- Auto-focus ?
- Keyboard navigation flow ?
- Think logical
- Use refs, DOM API (.focus())
- Use tabIndex, order
Screen Reader support (WAI-ARIA)
<button
aria-label="Place an order"
>
Order
</button>
<button
aria-label="Place order button"
>
Order
</div>
✅
Place an order, button
❌
Place order button, button
aria-label vs aria-labelledby
<dialog role="dialog" aria-label="Sample Modal">
<header>
<h2 id="header-title">
Sample Modal
</h2>
</header>
<main>
<p id="description">
This is the content
</p>
</main>
<footer>
<button aria-label="close dialog">
Close
</button>
</footer>
</dialog>
<dialog role="dialog" aria-labelledby="header-title">
<header>
<h2 id="header-title">
Sample Modal
</h2>
</header>
<main>
<p id="description">
This is the content
</p>
</main>
<footer>
<button aria-label="close dialog">
Close
</button>
</footer>
</dialog>
<Badge>
Item Two
<BadgeIcon
aria-label="Badge count 6"
role="status"
>
6
</BadgeIcon>
</Badge>
Item two, badge count 6
✍️ Visible and understandable label
✅ Clear ARIA role when needed
👷♂️ Interactive value (aria-disabled, aria-selected, etc)
🗒️ Concise description as hints (don't use title)
Working with screen reader
3 out of 5 tasks completed
Add to list, button
Dynamic content with aria-live & aria-atomic
<Badge className="v-badge theme--dark">
Item Two
<BadgeIcon
aria-atomic="true"
aria-live="polite"
aria-label="Badge count 6"
role="status"
>
6
</BadgeIcon>
</Badge>
100% accessible in combination with lazy loading component
Magnification support
200% - 400% Zoom
Text readability
Contrast/Color
Layout consistency
===
Responsiveness
Use media query & JS calculation
Color combination 🎨
Tools
Think Accessibility FIRST
And split the CSS code
Building an accessible component
What is component's type?
Focus & navigation behavior
Component internal flow and external flow
Component stylings
Interactivity
Take action 📢
- ✅ Be intuitive & organized
- ✅ Apply WAI-ARIA approriately
- ✅ Image Alt & description whenever needed!
- ✅ Pay attention to color combination!
- ✅ Test accessibility with Axe, Accessibility Insights or Lighthouse
- ✅ Manual testing with Screen reader and Screen magnifier
Thank you
@mayashavin
mayashavin.com
Accessible CSS in JS?
By Maya Shavin
Accessible CSS in JS?
- 515