Websites and apps are perceivable, operable,and understandable, even if:
About 15% of the world's population lives with some form of disability.
19% is over the age of 67 in 2024.
Directive (EU) 2016/2102 of the european parliament and of the council of 26 October 2016 on the accessibility of the websites and mobile applications of public sector bodies
Nina has ADHD
Nina has trouble focusing. She's very sensitive to sensory stimuli, and often forgets things.
Expected vs. Unexpected
Jerry has difficulties telling red and green apart.
Source: We are colorblind
Information about arrivals and departures
The same information with color and text
Pie chart - inaccessible to Jerry
Use more than just colour to convey information.
Kadisha has cataract
Kadisha can't read all of the numbers in this table.
Provide sufficient contrast between the text and the background colour.
Build responsive websites.
Most CAPTCHA's are inaccessible: provide accessible alternatives.
Jim can't use a mouse.He uses a headstick and a keyboard, instead.
Try to reach the following pages by using the tab key.
Try to expand the main menu without using the mouse.
"It took me too long to fill in the form, and it disappeared. Now I'm back in the queue. I'll probably miss out on those concert tickets."
Give users enough time to complete their actions.
Repetitive Stress Injury causes Caroline wrist- and shoulder pain. She uses voice recognition software in order to rest her arm and avoid any further injury.
Caroline can't click on an icon unless she knows its name.
David uses a screenreader and a braille display.
Tom can read simple texts with everyday words.
In the Netherlands, 75% of the texts on public websites correspond to reading level C1, but most of the population has a reading level well below that.
Quality jobs ensure economic independence, foster personal achievement, and offer the best protection against poverty... The commission will improve knowledge of the employment situation of women and men with disabilities, identify challenges, and propose remedies. It will pay particular attention to young people with disabilities in their transition from education to employment. It will address intra-job mobility on the open labour market and in sheltered workshops, through information exchange and mutual learning. It will also address the issue of self employment and quality jobs, including aspects such as working conditions and career advancement ...
Jobs are important because they protect people from being poor and make sure that people have their own independence.
The European Union plans to:
Source Easy to read version of European disability strategy (PDF)
Uncaptioned videos are useless to Hilde.
English isn't my native language. With captions, it's easier to understand and I remember more of the words I'm trying to learn.
When characters are mumbling, or speaking with an unfamiliar accent.
There are many people in one room, all using different screens (competing noise).
I'm watching tv with the volume down because my baby is asleep.
Loud, crunchy snacks.
Focus points according to specific themes
All functionalities that can be achieved by using a mouse must work when using a keyboard as well.
When tabbing through a website, can you see the focus outline at all times? (- / +)
Don't remove it:
a:focus { outline: none }
Enhance it:
a:focus { color: #fff; background: #00F; }
Are all links, form fields, and buttons accessible by tab key?
a href
or button
To make an element reachable with the tab key: use tabindex="0"
When using div
or span
.
Make sure the focus doesn't get trapped within an element or compoment, e.g. form or a list
When you add shortcuts:
header
and footer
nav
for menu and submenumain
for main contentarticle
only for sections that can be read independently (don't overdo)Accessible Rich Internet Applications
The accessibility tree
<button>Search</button>
Accessibility tree:
Accessibility tree:
Change information in the accessibility tree.
role
-attribute defines the role of a component in the accessibility tree.div
s and those have no role in accessibility tree.role="tabpanel"
completes the accessibility tree.<div id="tabpanel2" role="tabpanel">
role
attribute overwrites it.<<div id="main_nav">
<ul role="navigation">
ul
element gives the component implicitly the role 'list' role="navigation"
changes this role to 'navigation'<div id="main_nav" role="navigation">
<ul>
Or:
<nav id="main_nav">
<ul>
role
attribute<div role="button">
Search
</div>
role
attributerole="presentation"
role="application"
role="navigation"
versus <nav>
role="button"
versus <button>
role="checkbox"
versus <input type="checkbox">
tablist, tab, tabpanel
progressbar
spinbutton
News
Becomes this in accessibility tree:
News
But still looks like a heading.
role="dialog"
role="document"
inside an application allows default behaviour again in that container.role
attribute can add missing information to the accessibility treerole="presentation"
deletes the semantic role.Modify existing states or properties in accessibility tree:
aria-hidden="true"
removes element from accessibility treearia-hidden="true"
remains visible on the screen, but becomes inaccessible to assistive technology
Don't overwrite existing name:
<a href="w3.org"
aria-label="World Wide Web Consortium">
W3C
</a>
<a role="tab" id="tablist1">Monday</a>
<a role="tab" id="tablist2">Tuesday</a>
<div id="tabpanel1" role="tabpanel" aria-labelledby="tablist1"></div>
<div id="tabpanel2" role="tabpanel" aria-labelledby="tablist2"></div>
<button aria-label="Search button">
<a href="facebook.com" aria-label="Link to Facebook"></a>
<nav aria-label="Main navigation">
<main aria-label="Main content">
<button aria-label="Search">
<a href="facebook.com" aria-label="Facebook"></a>
<nav> of <nav aria-label="Main">
<main>
<div aria-hidden="true">
This text is visible on the screen but you don't hear it with a screenreader.
</div>
<a href="#" aria-hidden="true">
This link does not work for asssistive technology users.
</a>
<label for="email">e-mail</label>
<input type="text" name="email" id="email" aria-describedby="error17">
<p class="error" id="error17">The email address is not valid</p>
When focus reaches the edit field with the tab key:
E-mail address, edit field, The email address is not valid.
<ul role="list">
<div class="h2" role="heading" aria-level="2">
<div role="checkbox" aria-checked="true">
<article role="presentation">
<iframe name="google_ads" aria-hidden="true">
<a href="https://twitter.com">
<span class="twitter_icon" aria-label="Follow us on Twitter"></span>
</a>
<label for="tel">Phone number:</label>
<input type="text id="tel" aria-labelledby="nota" />
<p id="nota">Please do not include spaces, dashes or periods</p>
Don't use colour alone to convey information
body {
filter : grayscale(100%);
}
Colour Contrast Analyser
Use different shades of the same colour instead of different colours.

Describe the image briefly

Repeat the literal image text in alt text


Avoid images of text
Link goal > image description


Brief alt text and equal alternative
a.twitter:after {
content:url('icon_twitter.png');
}
When they contain information: provide hidden content
Twitter
a.twitter:after {
content:url('icon_twitter.png');
}
.visuallyhidden {
border: 0;
clip: rect(0 0 0 0);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
width: 1px;
}
aria-hidden="true"
Bulletproof:
<img src="logo.svg" alt="logo AnySurfer" />
Theory, but not always supported
<svg>
<title>brief description</title>
<description>extended description</description>
...
</svg>
ARIA: moderate support
<svg role="img" aria-labelledby="title">
 <title id="title">AnySurfer logo</title>
 ...
</svg>
SVG within a link: add invisible content
<a href="index.html">
 <span class="visuallyhidden">AnySurfer home page</span>
<svg role="presentation" focusable="false">
...
 </svg>
</a>
Or add ARIA-label, e.g. for a button:
<button type="button" aria-label="AnySurfer home page">
 <svg role="presentation" focusable="false">
 ...
 </svg>
 </button>
Don't create content that can cause epileptic seizures.
Add a warning for users
Examples:
(WARNING: links can trigger seizures)
When animation on a webpage starts automatically and plays for longer than 5 seconds:
Important for people with focus issues and sensory sensitivities.
When an audio fragment starts and plays for more than 3 seconds:
When a cookie banner overlaps with content:
Allow both landscape and portrait mode
Example: a mobile device mounted on a wheelchair cannot be tilted.
At a width of 320 CSS pixels:
320 CSS pixels is equivalent to a starting viewport width of 1280 CSS pixels wide at 400% zoom.
No loss of content or functionality when adjusting style properties:
<meta content="width=device-width;initial-scale=1.0;
maximum-scale=1.0; user-scalable=1;" name="viewport" />
<meta name="viewport" content="user-scalable=no" />
Legend = label for all fields in the same fieldset
<label for="name">Last name</label>
<input autocomplete="family-name" type="text" id="name" name="name" />
<label for="country">Country</label>
<input autocomplete="country" type="text" id="country" name="country" />
<html lang="nl">
<html lang="fr">
<html lang="de">
<html lang="en">
<div lang="en">
<a lang="en" href="#">Download the leaflet in English</a>
<span lang="en">
WCAG is a W3C standard and requires correct HTML usage.
Down-event
Don't attach the action to the down-event of a key stroke, only to the up-event.
More than one way is available to locate a webpage within a set of webpages except where the webpage is the result of, or a step in, a process.
Navigational mechanisms that are repeated on multiple webpages within a set of webpages occur in the same relative order each time they are repeated, unless a change is initiated by the user.
Components that have the same functionality within a set of webpages are identified consistently.
You have to register...
Register
A user's action triggers a dynamic update within the same page.
summary/details
aria-expanded
aria-expanded
attribute to the trigger (link or button).<button class="main-menu-toggle" aria-expanded="false">
Menu</button>
Expanded FAQ question:
<a data-toggle="collapse" href="#collapse01">
Question 1</a>
<div id="collapse01" class="panel-collapse"
aria-expanded="true">
aria-expanded
is present with correct value when the page loads.aria-expanded
indicates statusdisplay:none
The aria-expanded
technique can be used if new info appears immediately after the button.
tabindex="-1"
to the element you want the focus to move to.aria-live="off"
: section is (temporarily) not a live region.marked as live region prior to the update
.aria-live="polite"
must be present when the page loads. Later, you will inject the error message into that container.If no authoring practice exists for the widget you're building:
Invisible text before search field:
As soon as you have entered 5 characters in the search box, search results will appear under the heading "Publications found".
Provide an "invisible" heading at the top of filter options and one at the top of the results section.
Monitoring multiple dynamic updates on a screen, remains a challenge for users who have no overview over the screen (e.g. a webinar).
Call us on this number.
This graph shows the evolution of the number of patients admitted to hospital last week.
The number of patients that were admitted to hospital went down from 100 on Monday to 50 on Sunday.
Provide an alternative gesture based on single clicks for complex gestures, such as:
aria-expanded
to indicate stateDo certain components reoccur in each of your projects? Avoid double work: make them accessible.
Having to correct accessibility at the end of your project will cost you extra effort and time (=money), and will lead to frustrations.
AnySurfer
info@anysurfer.be
02 210 61 49
Twitter : @anysurfer_nl