Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

44
@ LEONIEWATSON HTTP://LJWATSON.CO.UK @LEONIEWATSON HTTP://LJWATSON.CO.UK ACCESSIBLE CUSTOM INTERFACES Léonie Watson WITH HTML5, JAVASCRIPT & ARIA

Transcript of Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

Page 1: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK@LEONIEWATSON HTTP://LJWATSON.CO.UK

ACCESSIBLE CUSTOM

INTERFACESLéonie Watson

WITH HTML5 , JAVASCRIPT & ARIA

Page 2: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

CODE LIKE YOU GIVE A DAMN!

Page 3: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

ACCESSIBILITY MECHANICS

Page 4: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

DOM TREE

Page 5: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

ACCESSIBILITY TREE

Page 6: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

ROLE

<input type="checkbox" id="drink" checked><label for="drink">Tequila</label>

Page 7: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

STATE

<input type="checkbox" id="drink" checked><label for="drink">Tequila</label>

Page 8: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

PROPERTIES

<input type="checkbox" id="drink" checked><label for="drink">Tequila</label>

Page 9: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

ACCESSIBILITY APIS

MSAA/UIAutmoation Windows

IAccessible2 Windows Linux

AT-SPI Linux

NSAccessibility OSX

UIAccessibility iOS

Accessibility Framework Android

Page 10: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

ACCESSIBILITY STACK

ASS I S T IVE TECHNOLOGY

BROWSER

OPERAT ING SY S TEM

ACCES S IB I L I TY AP I

Page 11: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

JAVASCRIPT

Page 12: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

ARIA

Page 13: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

HTML DISCLOSURE WIDGET

Page 14: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

SKELETON HTML

<span id="button">Tequila <span id="icon"></span></span><div id="content">Makes me happy...</div>

Page 15: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

USING A MOUSE

Page 16: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

USING A SCREEN READER

Page 17: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

ADD BUTTON ROLE

<span id="button" role="button”>Tequila <span id="icon"></span></span>

Page 18: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

ADD TABINDEX

<span id="button" role="button" tabindex="0”>Tequila <span id="icon"></span></span>

Page 19: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

ADD ARIA-EXPANDED

<span id="button" role="button" tabindex="0" aria-expanded="false”>Tequila <span id="icon"></span></span>

Page 20: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

ADD ARIA-CONTROLS

<span id="button" role="button" tabindex="0" aria-expanded="false" aria-controls="content">Tequila <span id="icon"></span></span>

<div id="content">Makes me happy...</div>

Page 21: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

ADD ARIA-HIDDEN

<span id="button" role="button" tabindex="0" aria-expanded="false" aria-controls="content">Tequila <span id="icon" aria-hidden="true"></span></span>

<div id="content" aria-hidden="true">Makes me happy</div>

Page 22: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

ADD EVENT LISTENERS

document.getElementById("button").addEventListener("click", toggleDisclosure);document.getElementById("button").addEventListener("keydown", toggleDisclosure);

Page 23: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

ADD KEYBOARD INTERACTION

function toggleDisclosure(event){

var type = event.type;

if (type === "keydown" && (event.keyCode !== 13 && event.keyCode !== 32)){

return true}event.preventDefault();

}

Page 24: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

ADD FUNCTIONALITY

function toggleDisclosure(event){

var button = document.getElementById("button");var content = document.getElementById("content");

if(content.getAttribute("aria-hidden") == "true"){

content.setAttribute("aria-hidden", "false");button.setAttribute("aria-expanded", "true");

}

else{content.setAttribute("aria-hidden", "true");button.setAttribute("aria-expanded", "false");}

}

Page 25: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

ADD FOCUS VISUALS

[role="button"]:hover, [role="button"]:focus {background-color: #333;color: #fff;text-shadow: 0 -1px 0 #444;box-shadow: 0 1px 0 #666;

}

Page 26: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

ADD STATE VISUALS

[role="button"][aria-expanded="false"] .icon:after {content: ' ›';

}

[role="button"][aria-expanded="true"] .icon:after {content: ' ×';

}

Page 27: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

ADD FUNCTIONALITY VISUALS

div[aria-hidden="true”] {display: none;

}

div[aria-hidden="false”] {display: block;border: 1px #000 solid;padding: 1em;background: #555;color: #FFF;

}

Page 28: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

USING A SCREEN READER

Page 29: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

SVG BUTTON

Page 30: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

BASIC SVG

<svg version="1.1" width="300" height="200">

<title id="title">Green rectangle</title>

<rect width="75" height="50" rx="20" ry="20" fill="#90ee90" stroke="#228b22” />

</svg>

Page 31: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

ADD ARIA-LABELLEDBY

<svg version="1.1" width="300" height="200" aria-labelledby="title">

<title id="title">Green rectangle</title>

<rect width="75" height="50" rx="20" ry="20" fill="#90ee90" stroke="#228b22” />

</svg>

Page 32: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

ADD ARIA-DESCRIBEDBY

<svg version="1.1" width="300" height="200" aria-labelledby="title" aria-describedby="desc">

<title id="title">Green rectangle</title>

<desc id="desc">A light green rectangle with rounded corners and a dark green border</desc>

<rect width="75" height="50" rx="20" ry="20" fill="#90ee90" stroke="#228b22” />

</svg>

Page 33: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

ADD IMG ROLE

<svg version="1.1" width="300" height="200" aria-labelledby="title" aria-describedby="desc" role="img">

<title id="title">Green rectangle</title>

<desc id="desc">A light green rectangle with rounded corners and a dark green border.</desc>

<rect width="75" height="50" rx="20" ry="20" fill="#90ee90" stroke="#228b22” />

</svg>

Page 34: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

ADD BUTTON ROLE

<svg version="1.1" width="300" height="200" aria-labelledby="title" aria-describedby="desc“ role=“button" >

<title id="title">Green rectangle</title>

<desc id="desc">A light green rectangle with rounded corners and a dark green border.</desc>

<a xlink:href="http://tink.uk/" tabindex="0" role="link>

<rect width="75" height="50" rx="20" ry="20" fill="#90ee90" stroke="#228b22” />

<text x="35" y="30" font-size="1em" text-anchor="middle" fill="#000000">Tink's website</text>

</a>

Page 35: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

CUSTOM DISCLOSURE ELEMENT

Page 36: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

REGISTERING A CUSTOM TAG

var elem = document.registerElement('tequila-button');document.body.appendChild(new elem());

Page 37: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

INSTANTIATING A CUSTOM TAG

<tequila-button>Drink me</tequila-button>

Page 38: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

ADD A ROLE

proto.createdCallback = function() {this.setAttribute('role', 'button');}

Page 39: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

ADD EVENT LISTENERS

proto.createdCallback = function() {this.setAttribute('role', 'button');this.addEventListener("click", toggleDisclosure);this.addEventListener("keydown", toggleDisclosure);}

Page 40: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

SOUNDING FAMILIAR?

Page 41: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

REGISTERING A TYPE EXTENSION

var elem = document.registerElement('tequila-button', {

prototype: Object.create(HTMLButtonElement.prototype),extends: 'button'

});

Page 42: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

INSTANTIATING A TYPE EXTENSION

<button is="tequila-button">Drink me</button>

Page 43: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK

CODE LIKE YOU GIVE A DAMN!

Name

Role

State

Properties

Focus

Page 44: Accessible custom interfaces with ARIA, HTML5 & JavaScript (2015)

@LEONIEWATSON HTTP://LJWATSON.CO.UK@LEONIEWATSON HTTP://LJWATSON.CO.UK

Léonie Watson @leoniewatson