JavaScript is the one language that works on all web enabled devices! JavaScript is everywhere and essential for making modern websites and apps accessible. Modern screen readers have excellent support for WAI-ARIA. Learn to use the W3C's WAI-ARIA spec to create modern HTML & JavaScript web applications. See how ARIA enhancements work in different combinations of the newest browsers and screen readers.
http://pauljadam.com/moderna11y
Accessibility Evangelist at Deque Systems, Inc.
WCAG 2.0 Checklist that links to each understanding success criterion
Press the Left/Right Arrow Keys or Page Up/Down to navigate through slides, the Home key takes you home to the table of contents. Adjust text size in the Info dialog. Share this presentation on Twitter & Facebook.
This slideshow has been developed with jQuery Mobile to create a universally accessible presentation that will work on any accessibility enabled device. PowerPoint & PDF formats are not universally accessible.
The modern accessible web can be used by browsers and screen readers that support WAI-ARIA.
Can I use... WAI-ARIA Accessibility features
How to use NVDA and Firefox to test your web pages for accessibility
Surf's Up! - Surfing the Internet with JAWS and MAGic
VoiceOver & JAWS make guesses on unlabelled form inputs to try and help their users. NVDA does not guess which makes it a great testing tool!
Accessible Rich Internet Applications (WAI-ARIA) 1.0
Semantics is the science of meaning; in this case, used to assign roles, states, and properties that apply to user interface and content elements as a human would understand.
dynamic content and advanced user interface controls developed with Ajax, HTML, JavaScript
Using WAI-ARIA in HTML - Practical guide for developers on how to add accessibility information to HTML elements using the Accessible Rich Internet Applications specification.
ARIA Role, State, and Property Quick Reference
Definitions of States and Properties (all aria-* attributes)
WAI-ARIA 1.0 Authoring Practices - An author's guide to understanding and implementing Accessible Rich Internet Application.
A WAI-ARIA role is set on an element using a role attribute.
<li role="menuitem">Open file…</li>
the values of properties (such as aria-labelledby) are often less likely to change throughout the application life-cycle than the values of states (such as aria-checked) which may change frequently due to user interaction
<li role="menuitemcheckbox" aria-checked="true">Sort by Last Modified</li>
[aria-invalid=true] {border : 2px solid red;}
The name of a user interface element. The value of the accessible name may be derived from a visible (e.g., the visible text on a button) or invisible (e.g., the text alternative that describes an icon) property of the user interface element.
A simple use for the accessible name property may be illustrated by an "OK" button. The text "OK" is the accessible name. When the button receives focus, assistive technologies may concatenate the platform's role description with the accessible name. For example, a screen reader may speak "push-button OK" or "OK button". The order of concatenation and specifics of the role description (e.g. "button", "push-button", "clickable button") are determined by platform accessibility APIs or assistive technologies.
A type of region on a page to which the user may want quick access. Content in such a region is different from that of other regions on the page and relevant to a specific user purpose, such as navigating, searching, perusing the primary content, etc.
Live regions are perceivable regions of a web page that are typically updated as a result of an external event when user focus may be elsewhere.
Examples of live regions include a chat log, stock ticker, or a sport scoring section that updates periodically to reflect game statistics.
aria-live, aria-relevant, aria-atomic, and aria-busy
Discrete user interface object with which the user can interact. Widgets range from simple objects that have one value or operation (e.g., check boxes and menu items), to complex objects that contain many managed sub-objects (e.g., trees and grids).
The following roles act as standalone user interface widgets or as part of larger, composite widgets.
The following roles act as composite user interface widgets. These roles typically act as containers that manage other, contained widgets.
The following roles describe structures that organize content in a page. Document structures are not usually interactive.
The following roles are regions of the page intended as navigational landmarks.
The following global states and properties are supported by all roles and by all base markup elements.
This section contains attributes specific to common user interface elements found on GUI systems or in rich internet applications which receive user input and process user actions. These attributes are used to support the widget roles .
Widget attributes might be mapped by a user agent to platform accessibility API states, for access by assistive technologies, or they might be accessed directly from the DOM. User agents MUST provide a way for assistive technologies to be notified when states change, either through DOM attribute change events or platform accessibility API events.
This section contains attributes specific to live regions in rich internet applications. These attributes may be applied to any element. The purpose of these attributes is to indicate that content changes may occur without the element having focus, and to provide assistive technologies with information on how to process those content updates. Some roles specify a default value for the aria-live attribute specific to that role. An example of a live region is a ticker section that lists updating stock quotes.
This section lists attributes which indicate information about drag-and-drop interface elements, such as draggable elements and their drop targets. Drop target information will be rendered visually by the author and provided to assistive technologies through an alternate modality.
For more information about using drag-and-drop, see Drag-and-Drop Support in the WAI-ARIA Authoring Practices ([ARIA-PRACTICES]).
This section lists attributes that indicate relationships or associations between elements which cannot be readily determined from the document structure.
Rich internet applications are complex to author. To save time, it is often faster to use existing widget libraries that implement WAI-ARIA and that have already gone through:
Some publicly available UI component libraries have already implemented WAI-ARIA. Authors can reuse such libraries to start developing accessible rich internet applications.
Make your JavaScript device independent to be accessible.
a:hover { background-color: #d85a1a; color: #ffffff; }
a:hover, a:active, a:focus { background-color: #d85a1a; color: #ffffff; }
In CSS :hover only works with a mouse, use :focus anytime you use :hover to show keyboard focus
<a href>, <button>, <input> are focusable by default and natively keyboard accessible. You should build your custom JavaScript controls out of these elements so you don't have to manually add keyboard access.
NEVER USE tabindex=1+ (Always let the source code order dictate the focus & reading order)
tabindex=”0” to make HTML elements keyboard focusable
tabindex=”-1” to make elements focusable with JS sending the focus to that element using focus()
Set HTML attribute tabIndex to 0 to place DOM elements in default tab orderelement.tabIndex = 0
Set tabIndex = -1 to remove elements from tab order but still receive keyboard focus programmatically. element.focus();
Languages with JAWS and MAGic on the Internet - Works on iOS
<span lang="en-US">US English Text</span>
VoiceOver Automatic Language Detection Demonstration - YouTube Video
Control CSS3 Speech Verbosity - Works on iOS
Use table headers <th> with scope attributes to provide a unique column and row header identifier for each data cell.
<th scope="col">Column Header</th>
For complex data tables with two or more row or column headers the headers attribute is necessary on each data cell <td> with space seperated values pointing to the IDs of all its row and column headers.
<td headers="id1 id2 id3">Complex Data Table Cell</td>
Use a table caption with a heading element inside the caption. Summary not necessary on data tables, use the caption and easy to understand tables instead.
<caption><h2>Table Caption</h2></caption>
Layout Tables should never have data table attributes like summary, scope, headers. Don't use layout tables if CSS can do the job. WAI-ARIA role=presentation can suppress table cell semantics on a layout table and keep NVDA from announcing too much unnecessary info.
a { outline: none; } DON'T DO IT!
eric meyer css reset may have already removed your focus style (outline:0) by default
Use CSS to enhance the visibility of user interface elements that are focused. jQuery Mobile's default focus indicator on UI buttons was too hard to see so I had to apply a custom outline with CSS.
.ui-focus, .ui-btn:focus {
outline: 4px solid #93BEE4;
}
Safari HTML5 Audio and Video Guide
<audio controls> <source src="song.ogg" type="audio/ogg" /> <source src="song.mp3" type="audio/mpeg" /> Your browser does not support the audio element. </audio>
<video width="320" height="240" autoplay controls> <source src="movie.ogg" type="video/ogg" /> <source src="movie.mp4" type="video/mp4" /> <source src="movie.webm" type="video/webm" /> Your browser does not support the video tag. </video>
<video src="video.ogv" controls> <object data="flvplayer.swf" type="application/x-shockwave-flash"> <param value="flvplayer.swf" name="movie"/> </object> </video>
Instructions for creating videos with closed captions & closed audio descriptions track.
Mobile Safari & VoiceOver for iOS have a bug where the <audio> and <video> elements are placed at the bottom of the focus order and you cannot give them a unique identifier.
Accessible Audio Descriptions for HTML5 Video
Multimedia Accessibility FAQ - W3C's internal multimedia accessibility policy
WebAIM Web Captioning Overview
NCAM and Apple Publish "Creating Accessible iTunes U Content" (iTunes Videos) (PDF Guide)
NASA Podcasts all have Text Transcripts for each audio or video podcast!
University of Washington DO-IT Video Transcript Example
Video SEO Series: 7 Key Benefits of Web Video Transcripts & Captions
Webcast Closed Captioning Samples (Working Windows Media Player Example)
WebVTT: The Web Video Text Tracks Format
Video navigation using WebVTT Chapters
IE10 Video Captioning Internet Explorer 10 <video> is now accessible with TTML and WebVTT <track> captioning support.
Open source always wins over closed source.
Open source JS libraries like jQuery are evolving with more accessibility and WAI-ARIA support with each iteration.
YOU can contribute back to open-source projects to improve their accessibility for you and others.
Some closed-source libaries like Sencha's frameworks don't even have any semantic HTML elements and instead are built out of a bunch of <div>s.
How do you make screen reader users aware of newly added content? Most dialogs are inserted into the bottom of the HTML source code/DOM so if you don't send focus to the dialogs a screen reader user will not hear the newly inserted content.
New HTML content like dialogs should be inserted into the DOM directly after the element that activated it. Focus should be sent to and trapped inside the new dialog. The ESC key should close the dialog. Make sure the X (close) button is keyboard accessible and has a text alternative. When the dialog closes, focus should return to the element that activated it.
Making an accessible dialog box
A big problem with modal dialogs, e.g. a photo lightbox with a grayed out background, is that focus is not trapped inside the active dialog but instead stuck underneath the dialog inside the grayed out content.
role=dialog
role=alertdialog
Make Dynamic Alerts And Dialogs Accessible
The Incredible Accessible Modal Window
Accessible jQuery-ui Dialog Widget
Need to have a method to pause or stop distracting content like an auto-sliding carousel.
Many times the images have text embedded inside them which cannot be increased and often there is no full text alternative that matches the image text.
YUI Library Examples: Carousel Control: Using the Carousel ARIA Plugin
Example 34 - Tab Panel - OpenAjax Alliance Accessibility Examples (PROBLEM WITH role=application in NVDA/Firefox) - problem is when you TAB away from the tab and focus on the first heading, NVDA will not read the heading, however, if you remove role=application this problem goes away. Good example of how role=application is DANGEROUS!
Don’t enforce timing in pages, or
If a site has a timeout limit make sure the user is alerted to the timeout accessibly and they can extend the time before being booted out the system
Can also give user control over timeouts, length, use
Old fashioned JavaScript alert()'s work well to get the users attention even if they've left the browser window.
Modal dialogs may not get the users attention of they're working in another app.
Required for iframes
<a class="gbqla" href="/webhp?hl=en&tab=ww" onclick="gbar.logger.il(39)" title="Go to Google Home"></a>
There's nothing really "wrong" with using the title attribute, but don't duplicate the link text in the title attribute. The title should provide additional, useful information if used.
Titles will not work in mobile devices for sighted users, however, they will work with VoiceOver. On OS X VoiceOver reads the title attribute with an adjustable delay that is a bit long by default or the user can press VO+SHIFT+H to manually read it but they will not know of its presence unless they wait for the delay and hear it or manually activate it. VO calls it the Help Tag. On VO iOS the help tag (title) is spoken much faster than on OS X with no ability to manually activate it.
The thing that everyone forgets about title attributes is that for Low Vision, mouse users who are zoomed in at extremely high levels the title attribute appears as a tool tip when they mouseover the HTML elements with a title. So a large graphic or UI element may be cut off from view but the title would appear and explain what they're looking at.
The best accessibility criticism with title is that it does not work with the keyboard only or mobile devices. The browser developers could fix this though!
jQuery UI title tooltip plugin so title works on focus?
Don't use Sencha Touch (closed-source)
Place Label Above Input
By placing the label directly above the input you improve the experience for mobile and screen magnification users. When focus is in the input the label will no longer be cut off like in the below example of the Gmail sign up form where the label is placed to the left but cut off when viewed on an iPhone.
WebAIM Screen Reader Survey #4 Mobile Findings
Session ID
WEB-076
Date & Time
Friday, March 1, 2013 - 3:10 PM PST
Location
Manchester C - Deque, 2nd Floor
Dreamweaver CS6 also includes code completion for WAI-ARIA now!
address browser independence for gestures and others user interactions
For example, if a user wants to scroll down a page, they might use their finger on a touch screen, or click a scroll bar with a mouse, or use a scroll wheel, or press Page Down on a keyboard, or say "scroll down" with a voice command. All those different user actions can be translated into a simple IndieUI scroll event. (Specifically, scrollrequest(x/y), as shown in the illustration.)
This presentation and slideshow template is always evolving, most ALT text should be added and correct. Please contact me if there are any issues.
Press the Left/Right Arrow Keys or Page Up/Down to navigate through slides, the Home key takes you home to the table of contents. If you're using a screen reader you may need to use the pass through key first then hit arrow keys. Page up/down works with screen readers enabled without the need for a pass through key.
JAWS Pass Key Through, INSERT+3
NVDA NVDA+f2: pass Next Key Through