Creating a Simple, Accessible On/Off Switch

Russ Weakley
Russ WeakleyUX/UI developer at Max Design
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
1 of 95

More Related Content

What's hot(20)

Html JavaScript and CSSHtml JavaScript and CSS
Html JavaScript and CSS
Radhe Krishna Rajan12.9K views
Web Server Controls VB Set 1Web Server Controls VB Set 1
Web Server Controls VB Set 1
sunmitraeducation117 views
Computer homeworkComputer homework
Computer homework
adarsh-kaul1.3K views
Ppt on visual basicsPpt on visual basics
Ppt on visual basics
younganand210 views
Android ButtonAndroid Button
Android Button
bhavin joshi609 views
Angular js form validation shashi-19-7-16Angular js form validation shashi-19-7-16
Angular js form validation shashi-19-7-16
Shashikant Bhongale430 views
Documentation For Tab SetupDocumentation For Tab Setup
Documentation For Tab Setup
vkeeton195 views
HTML frames and HTML formsHTML frames and HTML forms
HTML frames and HTML forms
Nadine Cruz12.3K views
Web Server Controls CS Set Web Server Controls CS Set
Web Server Controls CS Set
sunmitraeducation101 views
swingbasicsswingbasics
swingbasics
Arjun Shanka774 views
Sencha touchSencha touch
Sencha touch
Akshay Prabhu3.4K views
Knockout in actionKnockout in action
Knockout in action
Gerardo Leyes1.9K views
Intro to HamlIntro to Haml
Intro to Haml
Clifford Heath1.2K views
Android UI ReferenceAndroid UI Reference
Android UI Reference
GauntFace1.4K views
Developing in androidDeveloping in android
Developing in android
Christopher Decker1K views
Revit drafting procedureRevit drafting procedure
Revit drafting procedure
Anima M C870 views
GWT Training - Session 3/3GWT Training - Session 3/3
GWT Training - Session 3/3
Faiz Bashir2.7K views
GWT Training - Session 2/3GWT Training - Session 2/3
GWT Training - Session 2/3
Faiz Bashir3.6K views

Similar to Creating a Simple, Accessible On/Off Switch

WPF ControlsWPF Controls
WPF ControlsDoncho Minkov
1.5K views56 slides

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

Introduction to JavascriptIntroduction to Javascript
Introduction to Javascript
ambuj pathak101 views
Testar2014 presentationTestar2014 presentation
Testar2014 presentation
Tanja Vos820 views
WPF ControlsWPF Controls
WPF Controls
Doncho Minkov1.5K views
Bring the fun back to javaBring the fun back to java
Bring the fun back to java
ciklum_ods640 views
Creating Acessible floating labelsCreating Acessible floating labels
Creating Acessible floating labels
Russ Weakley2.8K views
svelte-en.pdfsvelte-en.pdf
svelte-en.pdf
ssuser65180a1.1K views
JavascriptJavascript
Javascript
timsplin426 views
Java 17Java 17
Java 17
Mutlu Okuducu81 views
Less10 2 e_testermodule_9Less10 2 e_testermodule_9
Less10 2 e_testermodule_9
Suresh Mishra1.9K views
CRUD with DojoCRUD with Dojo
CRUD with Dojo
Eugene Lazutkin4.9K views
Chapter 02Chapter 02
Chapter 02
Terry Yoast379 views
AEM Sightly Template LanguageAEM Sightly Template Language
AEM Sightly Template Language
Gabriel Walt47.6K views
Automate sap security user auditAutomate sap security user audit
Automate sap security user audit
Satyajit Deb548 views
Final Project PresentationFinal Project Presentation
Final Project Presentation
zroserie924 views
Idoc script beginner guide Idoc script beginner guide
Idoc script beginner guide
Vinay Kumar9.9K views
Visual Basic 6.0Visual Basic 6.0
Visual Basic 6.0
Palitha Baddegama6.4K views

More from Russ Weakley(20)

Accessible chat windowsAccessible chat windows
Accessible chat windows
Russ Weakley200 views
Accessible names & descriptionsAccessible names & descriptions
Accessible names & descriptions
Russ Weakley16 views
A deep dive into accessible namesA deep dive into accessible names
A deep dive into accessible names
Russ Weakley23 views
Accessible states in Design SystemsAccessible states in Design Systems
Accessible states in Design Systems
Russ Weakley1.3K views
Accessible Inline errors messagesAccessible Inline errors messages
Accessible Inline errors messages
Russ Weakley1.7K views
Accessible Form Hints and ErrorsAccessible Form Hints and Errors
Accessible Form Hints and Errors
Russ Weakley1.8K views
What is accessibility?What is accessibility?
What is accessibility?
Russ Weakley5.3K views
Accessibility in Pattern LibrariesAccessibility in Pattern Libraries
Accessibility in Pattern Libraries
Russ Weakley1.6K views
Accessibility in pattern librariesAccessibility in pattern libraries
Accessibility in pattern libraries
Russ Weakley1.6K views
Building an accessible auto-completeBuilding an accessible auto-complete
Building an accessible auto-complete
Russ Weakley9.9K views
Deep Dive into Line-HeightDeep Dive into Line-Height
Deep Dive into Line-Height
Russ Weakley3.8K views
Building Accessible Web ComponentsBuilding Accessible Web Components
Building Accessible Web Components
Russ Weakley1.9K views

Recently uploaded(20)

Azure DevOps Pipeline setup for Mule APIs #36Azure DevOps Pipeline setup for Mule APIs #36
Azure DevOps Pipeline setup for Mule APIs #36
MysoreMuleSoftMeetup75 views
STERILITY TEST.pptxSTERILITY TEST.pptx
STERILITY TEST.pptx
Anupkumar Sharma102 views
Education and Diversity.pptxEducation and Diversity.pptx
Education and Diversity.pptx
DrHafizKosar56 views
Gopal Chakraborty Memorial Quiz 2.0 Prelims.pptxGopal Chakraborty Memorial Quiz 2.0 Prelims.pptx
Gopal Chakraborty Memorial Quiz 2.0 Prelims.pptx
Debapriya Chakraborty221 views
STYP infopack.pdfSTYP infopack.pdf
STYP infopack.pdf
Fundacja Rozwoju Społeczeństwa Przedsiębiorczego143 views
CWP_23995_2013_17_11_2023_FINAL_ORDER.pdfCWP_23995_2013_17_11_2023_FINAL_ORDER.pdf
CWP_23995_2013_17_11_2023_FINAL_ORDER.pdf
SukhwinderSingh895865467 views
Plastic waste.pdfPlastic waste.pdf
Plastic waste.pdf
alqaseedae81 views
Scope of Biochemistry.pptxScope of Biochemistry.pptx
Scope of Biochemistry.pptx
shoba shoba110 views
Drama KS5 BreakdownDrama KS5 Breakdown
Drama KS5 Breakdown
WestHatch50 views
Industry4wrd.pptxIndustry4wrd.pptx
Industry4wrd.pptx
BC Chew153 views
discussion post.pdfdiscussion post.pdf
discussion post.pdf
jessemercerail70 views
Universe revised.pdfUniverse revised.pdf
Universe revised.pdf
DrHafizKosar84 views
ICS3211_lecture 08_2023.pdfICS3211_lecture 08_2023.pdf
ICS3211_lecture 08_2023.pdf
Vanessa Camilleri68 views
Sociology KS5Sociology KS5
Sociology KS5
WestHatch50 views
Streaming Quiz 2023.pdfStreaming Quiz 2023.pdf
Streaming Quiz 2023.pdf
Quiz Club NITW87 views
Lecture: Open InnovationLecture: Open Innovation
Lecture: Open Innovation
Michal Hron82 views
ANATOMY AND PHYSIOLOGY UNIT 1 { PART-1}ANATOMY AND PHYSIOLOGY UNIT 1 { PART-1}
ANATOMY AND PHYSIOLOGY UNIT 1 { PART-1}
DR .PALLAVI PATHANIA156 views
Narration lesson plan.docxNarration lesson plan.docx
Narration lesson plan.docx
Tariq KHAN90 views

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