SlideShare a Scribd company logo
Creating a simple, accessible
on/off
switch
Intro
This presentation is based on a
simple GitHub Repo and page
available here:
Checkbox and radio button
switch:
https://russmaxdesign.github.io/switch-checkbox/

Github:
https://github.com/russmaxdesign/switch-
checkbox
During this presentation, I’m going
to ask you some questions - which
you can answer in the chat window.
I'll be giving away three SitePoint
Premium annual memberships as
prizes to the best/quickest
answers.
That gives you unrestricted access
to over $20,000 worth of SitePoint
books and courses!

https://www.sitepoint.com/
premium/
I want to start with a couple of
accessibility-related questions.
And yes, these are incredibly easy,
“prize-winnable” questions.
Question 1:
What is the easiest and most
effective way of identifying common
accessibility problems in your site/
app?
Answer
Unplug the mouse

The easiest and most effective way
to check your site is using
keyboard-only.
A large number of users rely on
key-strokes (TAB, ARROW, ENTER,
SPACE) or the equivalent of these
keystrokes in order to navigate and
interact with sites/apps.
If you cannot navigate or interact
with your site/app using keystrokes
only, then your site is potentially
inaccessible to a large number of
users.
Question 2:
Why is this one of the most evil CSS
rules you could ever write?

*:focus  {  outline:  none;  }
Answer
Because this rule make it hard, if not
impossible, for keyboard-only users
to see which element is in focus
and therefore very hard to navigate
and interact with your site/app.
Time to explore how to style a
simple radio button or checkbox!
Custom radios
& checkboxes
Web designers and developers have
always struggled with how to
customise radio buttons and
checkboxes.
Creating a Simple, Accessible On/Off Switch
The main issue is that radio buttons
and checkboxes are notoriously
hard to style - especially across
multiple browsers and devices.
In the past, some developers
resorted to JavaScript-based
solutions to solve this problem.
In some cases this involved using
JavaScript to remove the original
radio or checkbox element making
the end result inaccessible for a
wide range of assistive
technologies.
A solution
It is possible to style these elements
without having to use JavaScript.
And more importantly, we can make
the end result accessible.
Let’s take a simple example of an
on/off switch that can be applied to
either radio or checkbox elements:
unchecked
checked
The solution I’m about to demo, has
five key accessibility features.
Well… many of these are not really
features, they are just default
behaviours that should not be
overridden.
Feature 1:
We will use the appropriate
semantic elements - input and label
elements. We will explicitly
associate these elements using
matching “for" and "id" values.
Feature 2:
The label content can be used to
describe the purpose of each switch
for screen readers. This content is
hidden off-screen.
Feature 3:
We will make the two different
states (“on” and “off”) clearly
distinguishable using a tick icon for
the “on” state. This will aid colour-
blind users and some types of
cognitive-impaired users.
(Keeping in mind that we should
never use “color alone” to signal
important information.)
unchecked
checked
Feature 4:
Because we are using native
elements, the default keyboard
behaviour will still be available.
(Users can select a radio button or
checkbox using the SPACE bar).
Feature 5:
We will make the focus and hover
states clearly visible. The focus
state is especially important for
keyboard only users.
checked
checked hover
checked focus
The markup
<div  class="switch">  
    <input  
        class="switch__control"  
        type="radio"  
        name="example01"  
        id="example01">  
    <label  class="switch__label"  for="example01">  
        <span  class="switch__content">Label  content</span>  
    </label>  
</div>
input
label
<div  class="switch">  
    <input  
        class="switch__control"  
        type="radio"  
        name="example01"  
        id="example01">  
    <label  class="switch__label"  for="example01">  
        <span  class="switch__content">Label  content</span>  
    </label>  
</div>
radio
<div  class="switch">  
    <input  
        class="switch__control"  
        type="checkbox"  
        name="example01"  
        id="example01">  
    <label  class="switch__label"  for="example01">  
        <span  class="switch__content">Label  content</span>  
    </label>  
</div>
checkbox
<div  class="switch">  
    <input  
        class="switch__control"  
        type="radio"  
        name="example01"  
        id="example01">  
    <label  class="switch__label"  for="example01">  
        <span  class="switch__content">Label  content</span>  
    </label>  
</div>
id
for
The class
names
We will use BEM-like class names
as these allow us to see the
relationship between the parent
element, descendant elements and
modifiers.
/*  parent  module  */  
.switch  {  }  
/*  parent  modifiers  */  
.switch-­‐-­‐xl  {  }  
.switch-­‐-­‐lg  {  }  
.switch-­‐-­‐md  {  }  
.switch-­‐-­‐sm  {  }  
.switch-­‐-­‐xs  {  }
/*  parent  module  */  
.switch  {  }  
/*  descendants  of  parent  module  */  
.switch__control  {  }  
.switch__label  {  }  
.switch__content  {  }
How does it
work
We can use the parent container
(“switch”) to create the overall
dimensions of the switch.
Parent Container

“switch”
The radio button or checkbox
control (“switch__control”) is then
positioned on top of the parent. It
will be given the same dimensions
as the parent.
Control

“switch__control”
The label (“switch__label”) is placed
on top of the radio button and also
given the same dimensions as the
parent. We are hiding the control
under the label.
We will then style the background
of the label to look like a switch -
including adding rounded corners
and our background icon.
Label

“switch__label”
And finally, the label content
(“switch__content”) is hidden off
screen so that it is available for
screen readers, but does not clutter
the visual appearance of the switch.
Adding states
Checkbox and radio button
elements can be manually changed
by users - from unchecked to
checked etc.
These elements can also be given
predefined boolean “checked” and
“disabled” attributes.
<!-­‐-­‐  no  additional  attributes  -­‐-­‐>  
<input  type="checkbox">  
<!-­‐-­‐  boolean  checked  attribue  -­‐-­‐>  
<input  type="checkbox"  checked>  
<!-­‐-­‐  boolean  disabled  attribute  -­‐-­‐>  
<input  type="checkbox"  disabled>
However, for this solution, most of
the styling is applied to the label
element, rather than the input.
Unfortunately, the label element has
no checked, unchecked or
disabled state of its own.
We can get around this using
adjacent sibling selectors, which
target any label element that is
adjacent to (comes directly after) the
input.
/*  unchecked  input  */  
.switch__control  +  label  {  }  
/*  checked  input  */  
.switch__control:checked  +  label  {  }  
/*  disabled  input  */  
.switch__control[disabled]  +  label  {  }
unchecked
checked
disabled
We also want to style the :focus
and :hover states of the switch,
which can also be done using
adjacent-sibling selectors.
/*  unchecked  input  */  
.switch__control:hover  +  label  {  }  
.switch__control:focus  +  label  {  }  
/*  checked  input  */  
.switch__control:checked:hover  +  label  {  }  
.switch__control:checked:focus  +  label  {  }
unchecked hover
unchecked focus
unchecked
checked
checked hover
checked focus
disabled
SASS variables
Time for our final “prize-winnable”
question (and yes, this one is also
super-easy to answer)…
Question 3:
Why would we want to be able to
control all of the dimensions of our
switch using one master SASS
variable?
Answer
Because this makes it easier to
maintain and to scale as needed.
We can define this one master
variable by dividing our switch into
scalable units.
12x
6x 4x
1x
So, we have four different
variables for the dimensions:

- switch width

- switch height

- toggle width/height

- gutter (space) around the toggle
$switch-­‐width:      3em;  
$switch-­‐height:    ($switch-­‐width  /  2);          /*  1.5em  */  
$toggle-­‐width:      ($switch-­‐width  /  3);            /*  1em  */  
$toggle-­‐gutter:    ($switch-­‐width  /  12);        /*  .25em  */
Now it becomes easy to create a
range of size variations, just by
resetting the font-size.
$switch-­‐xl:    1.6em;  
$switch-­‐lg:    1.4em;  
$switch-­‐md:    1.2em;  
$switch-­‐sm:    1em;  
$switch-­‐xs:    .8em;
We can also set some quick
variables for each of the
background-colors used in
different states.
$color-­‐toggle:                      #fff;  
$color-­‐unchecked-­‐static:  #aaa;  
$color-­‐unchecked-­‐hover:    #777;  
$color-­‐checked-­‐static:      #00a000;  
$color-­‐checked-­‐hover:        #006e00;  
$color-­‐disabled:                  #ddd;
Transitions
I’m generally not a fan of transitions
or animations unless they are being
used to help “tell the story” of a UI
component - help users understand
what is happening.
Transitions should not draw
attention to themselves. Ideally they
should be simple and subtle.
For the checkbox, we could do a
very simple transition to animate
the switch from unchecked to
checked - to help users understand
what has happened.
We can do this by transitioning the
“left” property as it changes from
unchecked to checked.
Creating a Simple, Accessible On/Off Switch
.switch__label:after  {  
left:  $toggle-­‐gutter;  
transition:  left  .04s;  
}  
.switch__control:checked  +  label:after  {  
    left:  $switch-­‐height  +  $toggle-­‐gutter;  
}
We can also softly animate the
background-color to avoid a jarring
change.
.switch__label  {  
background:  $color-­‐unchecked-­‐static;  
transition:  background  .2s;  
}  
.switch__control:hover  +  label,  
.switch__control:focus  +  label  {  
    background:  $color-­‐unchecked-­‐hover;  
}  
Demos
Checkbox and radio button
switch:
https://russmaxdesign.github.io/switch-checkbox/

Github:
https://github.com/russmaxdesign/switch-
checkbox
A simple, accessible language
switcher module:
https://russmaxdesign.github.io/language-
switcher/

Github:
https://github.com/russmaxdesign/language-
switcher
Upvote - downvote module:
https://russmaxdesign.github.io/upvote-downvote/

Github:
https://github.com/russmaxdesign/upvote-
downvote
Russ Weakley
Max Design
Site: maxdesign.com.au
Twitter: twitter.com/russmaxdesign
Slideshare: slideshare.net/maxdesign
Linkedin: linkedin.com/in/russweakley

More Related Content

What's hot (6)

PPTX
Guia para la conexión entre excel y mysql
Demian Robalino
 
PDF
7 Fatal Pitch Deck Mistakes Scaring Away Investors - Don't Be A Little Pitch
Bryce North
 
PPTX
BDD testing with cucumber
Daniel Kummer
 
PDF
BDD in Action - Automated Web Testing with WebDriver and Serenity
John Ferguson Smart Limited
 
PDF
What is WebElement in Selenium | Web Elements & Element Locators | Edureka
Edureka!
 
PPTX
Automation Testing by Selenium Web Driver
Cuelogic Technologies Pvt. Ltd.
 
Guia para la conexión entre excel y mysql
Demian Robalino
 
7 Fatal Pitch Deck Mistakes Scaring Away Investors - Don't Be A Little Pitch
Bryce North
 
BDD testing with cucumber
Daniel Kummer
 
BDD in Action - Automated Web Testing with WebDriver and Serenity
John Ferguson Smart Limited
 
What is WebElement in Selenium | Web Elements & Element Locators | Edureka
Edureka!
 
Automation Testing by Selenium Web Driver
Cuelogic Technologies Pvt. Ltd.
 

Viewers also liked (20)

PDF
CSS - OOCSS, SMACSS and more
Russ Weakley
 
PDF
Accessible custom radio buttons and checkboxes
Russ Weakley
 
PPTX
Scalable and Modular CSS FTW!
FITC
 
PPTX
처음부터 다시 배우는 HTML5 & CSS3 강의자료 9일차
Michael Yang
 
PPTX
처음부터 다시 배우는 HTML5 & CSS3 강의자료 12일차
Michael Yang
 
PDF
It's just a Web server - a plea for simplicity
Bertrand Delacretaz
 
PPTX
처음부터 다시 배우는 HTML5 & CSS3 강의자료 6일차
Michael Yang
 
PPTX
처음부터 다시 배우는 HTML5 & CSS3 강의자료 11일차
Michael Yang
 
PPTX
처음부터 다시 배우는 HTML5 & CSS3 강의자료 5일차
Michael Yang
 
PPTX
처음부터 다시 배우는 HTML5 & CSS3 강의자료 8일차
Michael Yang
 
PPTX
처음부터 다시 배우는 HTML5 & CSS3 강의자료 10일차
Michael Yang
 
PDF
CSS line-height
Toby Yun
 
PPTX
처음부터 다시 배우는 HTML5 & CSS3 강의자료 7일차
Michael Yang
 
PPTX
처음부터 다시 배우는 HTML5 & CSS3 강의자료 4일차
Michael Yang
 
PPTX
처음부터 다시 배우는 HTML5 & CSS3 강의자료3일차
Michael Yang
 
PDF
CSS Reset
Toby Yun
 
PPTX
처음부터 다시 배우는 HTML5 & CSS3 1일차
Michael Yang
 
PDF
ENRM 1001 newsletter, Group 9
Sţèfäñ Rămröøpsìñgh
 
PPTX
Router Information Protocol
raysoumik
 
PDF
CSS: a rapidly changing world
Russ Weakley
 
CSS - OOCSS, SMACSS and more
Russ Weakley
 
Accessible custom radio buttons and checkboxes
Russ Weakley
 
Scalable and Modular CSS FTW!
FITC
 
처음부터 다시 배우는 HTML5 & CSS3 강의자료 9일차
Michael Yang
 
처음부터 다시 배우는 HTML5 & CSS3 강의자료 12일차
Michael Yang
 
It's just a Web server - a plea for simplicity
Bertrand Delacretaz
 
처음부터 다시 배우는 HTML5 & CSS3 강의자료 6일차
Michael Yang
 
처음부터 다시 배우는 HTML5 & CSS3 강의자료 11일차
Michael Yang
 
처음부터 다시 배우는 HTML5 & CSS3 강의자료 5일차
Michael Yang
 
처음부터 다시 배우는 HTML5 & CSS3 강의자료 8일차
Michael Yang
 
처음부터 다시 배우는 HTML5 & CSS3 강의자료 10일차
Michael Yang
 
CSS line-height
Toby Yun
 
처음부터 다시 배우는 HTML5 & CSS3 강의자료 7일차
Michael Yang
 
처음부터 다시 배우는 HTML5 & CSS3 강의자료 4일차
Michael Yang
 
처음부터 다시 배우는 HTML5 & CSS3 강의자료3일차
Michael Yang
 
CSS Reset
Toby Yun
 
처음부터 다시 배우는 HTML5 & CSS3 1일차
Michael Yang
 
ENRM 1001 newsletter, Group 9
Sţèfäñ Rămröøpsìñgh
 
Router Information Protocol
raysoumik
 
CSS: a rapidly changing world
Russ Weakley
 
Ad

Similar to Creating a Simple, Accessible On/Off Switch (20)

PDF
CSS Disable Button - How to Disable Buttons Using CSS - Blogs
RonDosh
 
PDF
Accessibility in Design systems - the pain and glory
Russ Weakley
 
PDF
How to build accessible UI components
Russ Weakley
 
PDF
Using jQuery to Extend CSS
Chris Coyier
 
PPTX
Design Like a Pro: Building Mobile-Responsive HMIs in Ignition Perspective
Inductive Automation
 
PDF
a11yTO - Web Accessibility for Developers
Monika Piotrowicz
 
PDF
Accessibility - A feature you can build
Monika Piotrowicz
 
PPTX
A Primer on Web Accessibility for Teams
Mikey Ilagan
 
PDF
Clickable DIVs and other icebergs
Ben Buchanan
 
PDF
Accessibility patterns testable requirements during early design
Aidan Tierney
 
PDF
Dynamic User Assistance in MadCap Flare - MadWorld 2019, Scott DeLoach, Click...
Scott DeLoach
 
PDF
Javascript for Beginners 2022
flutterhub
 
PPTX
How you can start building accessible websites today (... and why!)
nrasul
 
KEY
The Inclusive Web: hands-on with HTML5 and jQuery
colinbdclark
 
PPTX
Module 2-web-a11y-steve lee
Steve Lee
 
KEY
Accessible UIs with jQuery and Infusion
colinbdclark
 
PDF
Leveling up your JavaScipt - DrupalJam 2017
Christian Heilmann
 
PPT
Html,Css and Javascript Forms using different tags
JeirahTigas
 
PDF
Developing Mobile Apps, Lecture 5
fpatton
 
PDF
Accessibility & Compatibility
Jared Smith
 
CSS Disable Button - How to Disable Buttons Using CSS - Blogs
RonDosh
 
Accessibility in Design systems - the pain and glory
Russ Weakley
 
How to build accessible UI components
Russ Weakley
 
Using jQuery to Extend CSS
Chris Coyier
 
Design Like a Pro: Building Mobile-Responsive HMIs in Ignition Perspective
Inductive Automation
 
a11yTO - Web Accessibility for Developers
Monika Piotrowicz
 
Accessibility - A feature you can build
Monika Piotrowicz
 
A Primer on Web Accessibility for Teams
Mikey Ilagan
 
Clickable DIVs and other icebergs
Ben Buchanan
 
Accessibility patterns testable requirements during early design
Aidan Tierney
 
Dynamic User Assistance in MadCap Flare - MadWorld 2019, Scott DeLoach, Click...
Scott DeLoach
 
Javascript for Beginners 2022
flutterhub
 
How you can start building accessible websites today (... and why!)
nrasul
 
The Inclusive Web: hands-on with HTML5 and jQuery
colinbdclark
 
Module 2-web-a11y-steve lee
Steve Lee
 
Accessible UIs with jQuery and Infusion
colinbdclark
 
Leveling up your JavaScipt - DrupalJam 2017
Christian Heilmann
 
Html,Css and Javascript Forms using different tags
JeirahTigas
 
Developing Mobile Apps, Lecture 5
fpatton
 
Accessibility & Compatibility
Jared Smith
 
Ad

More from Russ Weakley (20)

PDF
Accessible chat windows
Russ Weakley
 
PDF
Accessible names & descriptions
Russ Weakley
 
PDF
A deep dive into accessible names
Russ Weakley
 
PDF
What are accessible names and why should you care?
Russ Weakley
 
PDF
What is WCAG 2 and why should we care?
Russ Weakley
 
PDF
Accessible states in Design Systems
Russ Weakley
 
PDF
Creating accessible modals and autocompletes
Russ Weakley
 
PDF
Building an accessible progressive loader
Russ Weakley
 
PDF
Accessible Inline errors messages
Russ Weakley
 
PDF
Accessible Form Hints and Errors
Russ Weakley
 
PDF
What is accessibility?
Russ Weakley
 
PDF
Accessibility in Pattern Libraries
Russ Weakley
 
PDF
Accessibility in pattern libraries
Russ Weakley
 
PDF
Building an accessible auto-complete - #ID24
Russ Weakley
 
PDF
Building an accessible auto-complete
Russ Weakley
 
PDF
Creating Acessible floating labels
Russ Weakley
 
PDF
Creating an Accessible button dropdown
Russ Weakley
 
PDF
Deep Dive into Line-Height
Russ Weakley
 
PDF
Building Accessible Web Components
Russ Weakley
 
PDF
Building accessible web components without tears
Russ Weakley
 
Accessible chat windows
Russ Weakley
 
Accessible names & descriptions
Russ Weakley
 
A deep dive into accessible names
Russ Weakley
 
What are accessible names and why should you care?
Russ Weakley
 
What is WCAG 2 and why should we care?
Russ Weakley
 
Accessible states in Design Systems
Russ Weakley
 
Creating accessible modals and autocompletes
Russ Weakley
 
Building an accessible progressive loader
Russ Weakley
 
Accessible Inline errors messages
Russ Weakley
 
Accessible Form Hints and Errors
Russ Weakley
 
What is accessibility?
Russ Weakley
 
Accessibility in Pattern Libraries
Russ Weakley
 
Accessibility in pattern libraries
Russ Weakley
 
Building an accessible auto-complete - #ID24
Russ Weakley
 
Building an accessible auto-complete
Russ Weakley
 
Creating Acessible floating labels
Russ Weakley
 
Creating an Accessible button dropdown
Russ Weakley
 
Deep Dive into Line-Height
Russ Weakley
 
Building Accessible Web Components
Russ Weakley
 
Building accessible web components without tears
Russ Weakley
 

Recently uploaded (20)

PPTX
How to Create a Customer From Website in Odoo 18.pptx
Celine George
 
PPTX
Difference between write and update in odoo 18
Celine George
 
PPTX
Controller Request and Response in Odoo18
Celine George
 
PDF
Is Assignment Help Legal in Australia_.pdf
thomas19williams83
 
PPTX
DIGITAL CITIZENSHIP TOPIC TLE 8 MATATAG CURRICULUM
ROBERTAUGUSTINEFRANC
 
PDF
AI-assisted IP-Design lecture from the MIPLM 2025
MIPLM
 
PPTX
care of patient with elimination needs.pptx
Rekhanjali Gupta
 
PPTX
SD_GMRC5_Session 6AB_Dulog Pedagohikal at Pagtataya (1).pptx
NickeyArguelles
 
PDF
Lean IP - Lecture by Dr Oliver Baldus at the MIPLM 2025
MIPLM
 
PPTX
CATEGORIES OF NURSING PERSONNEL: HOSPITAL & COLLEGE
PRADEEP ABOTHU
 
PDF
STATEMENT-BY-THE-HON.-MINISTER-FOR-HEALTH-ON-THE-COVID-19-OUTBREAK-AT-UG_revi...
nservice241
 
PPTX
Identifying elements in the story. Arrange the events in the story
geraldineamahido2
 
PPTX
EDUCATIONAL MEDIA/ TEACHING AUDIO VISUAL AIDS
Sonali Gupta
 
PDF
Android Programming - Basics of Mobile App, App tools and Android Basics
Kavitha P.V
 
PDF
Introduction presentation of the patentbutler tool
MIPLM
 
PPTX
Post Dated Cheque(PDC) Management in Odoo 18
Celine George
 
PDF
Council of Chalcedon Re-Examined
Smiling Lungs
 
PPTX
PLANNING FOR EMERGENCY AND DISASTER MANAGEMENT ppt.pptx
PRADEEP ABOTHU
 
PPTX
Introduction to Biochemistry & Cellular Foundations.pptx
marvinnbustamante1
 
PPTX
Building Powerful Agentic AI with Google ADK, MCP, RAG, and Ollama.pptx
Tamanna36
 
How to Create a Customer From Website in Odoo 18.pptx
Celine George
 
Difference between write and update in odoo 18
Celine George
 
Controller Request and Response in Odoo18
Celine George
 
Is Assignment Help Legal in Australia_.pdf
thomas19williams83
 
DIGITAL CITIZENSHIP TOPIC TLE 8 MATATAG CURRICULUM
ROBERTAUGUSTINEFRANC
 
AI-assisted IP-Design lecture from the MIPLM 2025
MIPLM
 
care of patient with elimination needs.pptx
Rekhanjali Gupta
 
SD_GMRC5_Session 6AB_Dulog Pedagohikal at Pagtataya (1).pptx
NickeyArguelles
 
Lean IP - Lecture by Dr Oliver Baldus at the MIPLM 2025
MIPLM
 
CATEGORIES OF NURSING PERSONNEL: HOSPITAL & COLLEGE
PRADEEP ABOTHU
 
STATEMENT-BY-THE-HON.-MINISTER-FOR-HEALTH-ON-THE-COVID-19-OUTBREAK-AT-UG_revi...
nservice241
 
Identifying elements in the story. Arrange the events in the story
geraldineamahido2
 
EDUCATIONAL MEDIA/ TEACHING AUDIO VISUAL AIDS
Sonali Gupta
 
Android Programming - Basics of Mobile App, App tools and Android Basics
Kavitha P.V
 
Introduction presentation of the patentbutler tool
MIPLM
 
Post Dated Cheque(PDC) Management in Odoo 18
Celine George
 
Council of Chalcedon Re-Examined
Smiling Lungs
 
PLANNING FOR EMERGENCY AND DISASTER MANAGEMENT ppt.pptx
PRADEEP ABOTHU
 
Introduction to Biochemistry & Cellular Foundations.pptx
marvinnbustamante1
 
Building Powerful Agentic AI with Google ADK, MCP, RAG, and Ollama.pptx
Tamanna36
 

Creating a Simple, Accessible On/Off Switch

  • 1. Creating a simple, accessible on/off switch
  • 3. This presentation is based on a simple GitHub Repo and page available here:
  • 4. Checkbox and radio button switch: https://russmaxdesign.github.io/switch-checkbox/ Github: https://github.com/russmaxdesign/switch- checkbox
  • 5. During this presentation, I’m going to ask you some questions - which you can answer in the chat window.
  • 6. I'll be giving away three SitePoint Premium annual memberships as prizes to the best/quickest answers.
  • 7. That gives you unrestricted access to over $20,000 worth of SitePoint books and courses! https://www.sitepoint.com/ premium/
  • 8. I want to start with a couple of accessibility-related questions.
  • 9. And yes, these are incredibly easy, “prize-winnable” questions.
  • 10. Question 1: What is the easiest and most effective way of identifying common accessibility problems in your site/ app?
  • 12. Unplug the mouse The easiest and most effective way to check your site is using keyboard-only.
  • 13. A large number of users rely on key-strokes (TAB, ARROW, ENTER, SPACE) or the equivalent of these keystrokes in order to navigate and interact with sites/apps.
  • 14. If you cannot navigate or interact with your site/app using keystrokes only, then your site is potentially inaccessible to a large number of users.
  • 15. Question 2: Why is this one of the most evil CSS rules you could ever write? *:focus  {  outline:  none;  }
  • 17. Because this rule make it hard, if not impossible, for keyboard-only users to see which element is in focus and therefore very hard to navigate and interact with your site/app.
  • 18. Time to explore how to style a simple radio button or checkbox!
  • 20. Web designers and developers have always struggled with how to customise radio buttons and checkboxes.
  • 22. The main issue is that radio buttons and checkboxes are notoriously hard to style - especially across multiple browsers and devices.
  • 23. In the past, some developers resorted to JavaScript-based solutions to solve this problem.
  • 24. In some cases this involved using JavaScript to remove the original radio or checkbox element making the end result inaccessible for a wide range of assistive technologies.
  • 26. It is possible to style these elements without having to use JavaScript. And more importantly, we can make the end result accessible.
  • 27. Let’s take a simple example of an on/off switch that can be applied to either radio or checkbox elements:
  • 29. The solution I’m about to demo, has five key accessibility features.
  • 30. Well… many of these are not really features, they are just default behaviours that should not be overridden.
  • 31. Feature 1: We will use the appropriate semantic elements - input and label elements. We will explicitly associate these elements using matching “for" and "id" values.
  • 32. Feature 2: The label content can be used to describe the purpose of each switch for screen readers. This content is hidden off-screen.
  • 33. Feature 3: We will make the two different states (“on” and “off”) clearly distinguishable using a tick icon for the “on” state. This will aid colour- blind users and some types of cognitive-impaired users.
  • 34. (Keeping in mind that we should never use “color alone” to signal important information.)
  • 36. Feature 4: Because we are using native elements, the default keyboard behaviour will still be available. (Users can select a radio button or checkbox using the SPACE bar).
  • 37. Feature 5: We will make the focus and hover states clearly visible. The focus state is especially important for keyboard only users.
  • 40. <div  class="switch">      <input          class="switch__control"          type="radio"          name="example01"          id="example01">      <label  class="switch__label"  for="example01">          <span  class="switch__content">Label  content</span>      </label>   </div> input label
  • 41. <div  class="switch">      <input          class="switch__control"          type="radio"          name="example01"          id="example01">      <label  class="switch__label"  for="example01">          <span  class="switch__content">Label  content</span>      </label>   </div> radio
  • 42. <div  class="switch">      <input          class="switch__control"          type="checkbox"          name="example01"          id="example01">      <label  class="switch__label"  for="example01">          <span  class="switch__content">Label  content</span>      </label>   </div> checkbox
  • 43. <div  class="switch">      <input          class="switch__control"          type="radio"          name="example01"          id="example01">      <label  class="switch__label"  for="example01">          <span  class="switch__content">Label  content</span>      </label>   </div> id for
  • 45. We will use BEM-like class names as these allow us to see the relationship between the parent element, descendant elements and modifiers.
  • 46. /*  parent  module  */   .switch  {  }   /*  parent  modifiers  */   .switch-­‐-­‐xl  {  }   .switch-­‐-­‐lg  {  }   .switch-­‐-­‐md  {  }   .switch-­‐-­‐sm  {  }   .switch-­‐-­‐xs  {  }
  • 47. /*  parent  module  */   .switch  {  }   /*  descendants  of  parent  module  */   .switch__control  {  }   .switch__label  {  }   .switch__content  {  }
  • 49. We can use the parent container (“switch”) to create the overall dimensions of the switch.
  • 51. The radio button or checkbox control (“switch__control”) is then positioned on top of the parent. It will be given the same dimensions as the parent.
  • 53. The label (“switch__label”) is placed on top of the radio button and also given the same dimensions as the parent. We are hiding the control under the label.
  • 54. We will then style the background of the label to look like a switch - including adding rounded corners and our background icon.
  • 56. And finally, the label content (“switch__content”) is hidden off screen so that it is available for screen readers, but does not clutter the visual appearance of the switch.
  • 58. Checkbox and radio button elements can be manually changed by users - from unchecked to checked etc.
  • 59. These elements can also be given predefined boolean “checked” and “disabled” attributes.
  • 60. <!-­‐-­‐  no  additional  attributes  -­‐-­‐>   <input  type="checkbox">   <!-­‐-­‐  boolean  checked  attribue  -­‐-­‐>   <input  type="checkbox"  checked>   <!-­‐-­‐  boolean  disabled  attribute  -­‐-­‐>   <input  type="checkbox"  disabled>
  • 61. However, for this solution, most of the styling is applied to the label element, rather than the input.
  • 62. Unfortunately, the label element has no checked, unchecked or disabled state of its own.
  • 63. We can get around this using adjacent sibling selectors, which target any label element that is adjacent to (comes directly after) the input.
  • 64. /*  unchecked  input  */   .switch__control  +  label  {  }   /*  checked  input  */   .switch__control:checked  +  label  {  }   /*  disabled  input  */   .switch__control[disabled]  +  label  {  }
  • 66. We also want to style the :focus and :hover states of the switch, which can also be done using adjacent-sibling selectors.
  • 67. /*  unchecked  input  */   .switch__control:hover  +  label  {  }   .switch__control:focus  +  label  {  }   /*  checked  input  */   .switch__control:checked:hover  +  label  {  }   .switch__control:checked:focus  +  label  {  }
  • 70. Time for our final “prize-winnable” question (and yes, this one is also super-easy to answer)…
  • 71. Question 3: Why would we want to be able to control all of the dimensions of our switch using one master SASS variable?
  • 73. Because this makes it easier to maintain and to scale as needed.
  • 74. We can define this one master variable by dividing our switch into scalable units.
  • 76. So, we have four different variables for the dimensions: - switch width - switch height - toggle width/height - gutter (space) around the toggle
  • 77. $switch-­‐width:      3em;   $switch-­‐height:    ($switch-­‐width  /  2);          /*  1.5em  */   $toggle-­‐width:      ($switch-­‐width  /  3);            /*  1em  */   $toggle-­‐gutter:    ($switch-­‐width  /  12);        /*  .25em  */
  • 78. Now it becomes easy to create a range of size variations, just by resetting the font-size.
  • 79. $switch-­‐xl:    1.6em;   $switch-­‐lg:    1.4em;   $switch-­‐md:    1.2em;   $switch-­‐sm:    1em;   $switch-­‐xs:    .8em;
  • 80. We can also set some quick variables for each of the background-colors used in different states.
  • 81. $color-­‐toggle:                      #fff;   $color-­‐unchecked-­‐static:  #aaa;   $color-­‐unchecked-­‐hover:    #777;   $color-­‐checked-­‐static:      #00a000;   $color-­‐checked-­‐hover:        #006e00;   $color-­‐disabled:                  #ddd;
  • 83. I’m generally not a fan of transitions or animations unless they are being used to help “tell the story” of a UI component - help users understand what is happening.
  • 84. Transitions should not draw attention to themselves. Ideally they should be simple and subtle.
  • 85. For the checkbox, we could do a very simple transition to animate the switch from unchecked to checked - to help users understand what has happened.
  • 86. We can do this by transitioning the “left” property as it changes from unchecked to checked.
  • 88. .switch__label:after  {   left:  $toggle-­‐gutter;   transition:  left  .04s;   }   .switch__control:checked  +  label:after  {      left:  $switch-­‐height  +  $toggle-­‐gutter;   }
  • 89. We can also softly animate the background-color to avoid a jarring change.
  • 90. .switch__label  {   background:  $color-­‐unchecked-­‐static;   transition:  background  .2s;   }   .switch__control:hover  +  label,   .switch__control:focus  +  label  {      background:  $color-­‐unchecked-­‐hover;   }  
  • 91. Demos
  • 92. Checkbox and radio button switch: https://russmaxdesign.github.io/switch-checkbox/ Github: https://github.com/russmaxdesign/switch- checkbox
  • 93. A simple, accessible language switcher module: https://russmaxdesign.github.io/language- switcher/ Github: https://github.com/russmaxdesign/language- switcher
  • 94. Upvote - downvote module: https://russmaxdesign.github.io/upvote-downvote/ Github: https://github.com/russmaxdesign/upvote- downvote
  • 95. Russ Weakley Max Design Site: maxdesign.com.au Twitter: twitter.com/russmaxdesign Slideshare: slideshare.net/maxdesign Linkedin: linkedin.com/in/russweakley