Websites and apps are perceivable, operable and understandable for everbody, even if:
About 15% of the world's population lives with some form of disability.
19% is over the age of 65 in 2021.
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
"I have trouble focusing. I'm very sensitive to sensory stimuli, and I often forget 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.
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 can learn more.
When characters are mumbling, or speaking with a different 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 sleeping.
Crunching chips/crisps.
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:
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.<<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>
Of:
<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="dialog"
versus <dialog>
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.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>
<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>
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" />
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" />
<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 results in a dynamic update on the same page.
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
summary/details
The aria-expanded
technique can be used if new info appears immediately after the button.
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