Toggles suck!

It all started when I wanted to find the best price for a new headset that I needed to perform my online courses for our clients. I went to www.pricerunner.com but I got interrupted by a cookie popup. Knowing that free websites use a lot of dark patterns and tricks to make us users accept trackers against our will, I wanted to make sure I did not accept any cookies. This is what I saw:

Toggles for cookies. All are grey, but they have different unclear states.

“Are they on” I thought? And does “on” mean I accept or decline the cookies? What’s going on here? This interface forced me to think!

Now, I’m no coward! My usual strategy online is to try pressing buttons to see what they do! Problem is – nothing seems to happen when pressing these buttons, so that doesn’t work! All I can assume is that pressing these gray things will change the setting. But change to what?! It took me far longer than should be necessary to figure it out. My confusion had time to turn into frustration and by the time I figured it out that frustration had lit a tiny fire of anger in my chest! I realized this was not my first time raging against unclear toggles, but I couldn’t exactly explain why I hated them so much?

So I decided to do some research and collect my thoughts and now I’m writing this article about Why Toggles Suck!

Short version

This is an in-depth article, so here are the main takeaways for readers in a hurry. Toggles fail to convey their current status without making users think! They also have very poor accessibility for users with disabilities. They are used inconsistently across the web, and they don’t have native HTML support. Use checkboxes or radio groups instead, or some of the other options described below!

What’s a toggle?

Toggle labeled "Good Luck".

Digital toggles have existed since the early versions of smartphones. Especially common under different “settings” views on touch devices, they are used for things like turning WiFi on/off. They are called “toggles” or “toggle switches” since they switch something on or off, or “toggle” its status back and forth when activated. 

To truly understand why they suck, it helps to compare them to two other controls that accomplish the same thing, but that actually work well. Physical toggles and digital checkboxes. Let’s first list some reasons why they work well, and then later investigate if digital toggles fulfill those same requirements or not!

Physical toggles

We are used to light switches turning the light on/off in a room.

Physical lamp toggle without labels, pencil drawing.

And many electrical devices use toggles the same way

Electrical junction box, pencil drawing.

Toggles work well for lights and electrical outlets for many reasons, some more obvious than others:

  • They enforce a mutually exclusive state, on or off.
  • They let users press the state they want.
  • Pressing “on” many times in a row is not a problem.
  • Labels are a bonus but not really needed since:
  • Context makes the current state obvious.

The last one is important. The results are obvious when turning on a light switch – the room gets lit! The results are also obvious when turning on the electrical junction box above because stuff connected to it starts working. The toggle also has a LED indicator lighting up when it has electricity so it’s obviously on because a LED cannot light up without electricity in the box. So you don’t really need to label these toggles. The junction box toggle above still has “O/I” labels though, for when it is not connected to a wall outlet, or if the LED in the button is broken.

But the light switch has no label, since context is enough… most of the time! But if that switch were to be placed – oh I don’t know – outside of my bathroom instead of inside 😡. Then the status of the switch is no longer obvious! Like when my fiancé is using the bathroom and I’m outside the door. In that situation, how can I know what its current state is? I can’t! So really – she has no right to be mad at me for making her poop-in-the-dark, when I’m just trying to help light up the room!

With a label like the one on the junction box you can put your finger on the choice you want and press it in. If you press “I” you can be sure it’s turned ON. If you want to be very sure, you can press “I” very hard or several times. It will still be ON. Assuming of course that you know that “O” means “off” and “I” means “on”. I still mix them up regularly; “O mean ON, and I means IN? No… what was it again?”. But I digress! 

Same with the light switch outside my bathroom. If it had “on” written above the button, and “off” written under it like this:

Lamp toggle with labels "on" and "off" on each side, pencil drawing.

Then I would know the state from the control itself because of a principle called the “proximity principle” in visual design. 

I would press closest to the “on” label. In both cases, you simply press the thing you want! 

Pressing what you want is a natural human instinct and universal. There are no cultures in the world where the learned pattern is to “press what you don’t want”. Imagine a child standing by an ice cream stand pointing to all the flavors they don’t want. Doesn’t make sense, does it? Because we humans point with one finger, in order to single out one thing while excluding everything else! We point to the thing we want!

But then – how come we understand checkboxes? 

Digital checkboxes

You see a checkmark and you want the thing to be checked – so according to “press the thing you want” I should press the checkmark to get it?

Checked checkbox labeled "Lights".

No! So how come we understand checkboxes?

A checkbox has two modes, “checked” or “not checked” and is normally part of a form.

The checkbox as a form component comes from the physical paper form where it has been used for ages, long before computers were a thing.

You would get an empty form

Empty form, pencil drawing.

and be asked to post or hand over a filled in one.

Filled in form, pencil drawing.

It’s obvious that things are empty before I have started filling in the form. Text inputs are empty rectangles, checkboxes are empty squares. I use my pen to actively add things into the emptiness.

It would be absurd (but not impossible) to have it the other way around – imagine a form coming filled with stuff, and then having to erase stuff using white-out (like tipex) or an eraser to complete the form. That’s just not how we do things anywhere in the world!

So this has taught us a basic instinct over hundreds of years: empty shapes are not filled in, passive, untouched. Filled shapes are filled in, active, touched, and ready to be submitted.

And that’s why checkboxes work, cognitively! Same goes for radio buttons where the filled in shape is the active one.

Radio button group labeled "select a maintenance drone:" options "Huey, Dewey and Louie", Huey being selected.

It even works for text input boxes! In our user tests, a majority of users will assume an empty text field is actually mandatory and expect an input to be made. 

So much so that we even recommend you to not use asterisks * to indicate mandatory fields, and instead mark optional fields as “optional”.

Two forms, one bad using asterisk implying mandatory fields, one good using "optional" text on optional fields instead.

The “filled in = active / touched / done” pattern is so well recognized that if a text input field is not empty, many users will believe it’s done and requires no more work. That’s why you should try to avoid placeholder text…

Placeholder text used in a phone number input field.

… and labels that are positioned inside the input field like the commonly used Material UI component, even if it “moves away” on focus:

Input field with placeholder text "Password".

Users often assume “it’s filled in, so it’s completed” and skip to the next one looking for something empty.

Enter digital toggles

Now that we have established a few fundamentals that make physical toggles and digital checkboxes work – let’s see if digital toggles fulfill these criteria!

Press what you want

Nope! If a toggle says “On” then it’s actually an Off-button!

Three very similar buttons, all with text "ON" inside, second one has a "power" icon looking almost like a circle. Bottom one has a circle. All are on-buttons, except the last one which is an off button. Because its a goddamn toggle!

Allows multiple presses on the thing you want

Nope! Toggles change what they do each time you click them. This is also true for a checkbox (but they work for other reasons) – while a radio group fulfills this criteria!

Context makes labels unnecessary

Nope! Well, at least not usually. Toggles tend to be used for settings that are invisible or only visible later or in some other place.

Toggles controlling invisible settings like cookies and personalized ads.
That means there is no context to help you. Active cookies are about as noticeable as my bathroom lights when the door is shut. In that they are not! In these situations – labels on the control are very much needed and important! So you’d hope they follow the “Proximity principle” – right?

Proximity principle

Nope! Labels are often put far away from the control, and you often have to move the toggle “knob” away from the label representing what you activate. Not closer to it!

Perhaps I can make my point clearer with this image:

Toggle with labels left and right, then same toggle with only the left label. This changes the meaning of the toggle completely.

In the top toggle, users can understand that right means “no cookies” since it’s the rightmost label. While in the bottom toggle that looks like most toggles online with only one label on the left side, right means “cookies” all of a sudden. Proximity principle, schmoximity principle!

Of course this can be changed by having the toggle first, followed by the label. 

Toggle with label to the right saying "Push Alerts"

But is that how people commonly use toggles? No! 👿

Empty = passive, Filled in = active

Nope! A toggle has no “empty” state. Only left/right. There is no obvious “default” state when untouched, and there is no universal agreement of which side a “knob” should be on to be passive or active, on or off. 

Most western designers seem to assume that “right = active”. But that’s my point! “Most” designers, but not all! It’s completely up to the designer to do what they want with toggles on the web because a toggle is not even a thing in HTML (more about that later). So there is no established “out of the box” behavior, at least not for the web! Oh, and only western designers – in arabic speaking countries the designers often make “left = active”. 

Perhaps it becomes even more clear that direction is not a universally understood pattern for active vs. passive in this image:

2 checkboxes, one checked one not. Followed by rotated toggles in different states.

I held my phone on the side when taking this photo. But I decided to not rotate it. No matter how I hold my phone I can understand which checkbox is active in the first frame. But which of the toggles are activated in frame 2-5? I have no idea! You cannot rely only on direction for conveying status!

Conclusion #1

The most common toggle on the web fulfills NONE of the criteria that make physical toggles and checkboxes understandable! 

So am I done now? Nooooo! I’m just getting warmed up! Let’s look at 3 more things that are awful about toggles!

Toggles don’t exist!

“By hey – if they are so terrible, why is the toggle even in the HTML language?” – you may ask.

It isn’t! It’s been made up by designers! HTML is the language of the web, where programmers add elements like <button> to create a button on the screen, or <img> to add an image. There are at least 111 different types of such elements to pick from. None of them is a toggle! And that’s because we already have elements for selecting boolean (on/off) values! You may remember them from earlier; checkboxes and radio buttons. Or as they are known in HTML:

<input type=”checkbox”>

<input type=”radio”>

You can style them as you like, make them larger, color them differently, have them auto-save or only save when you press “submit”. You can place labels before or after. Basically whatever use-case you have for toggling on/off values it can be done with these wonderful elements! 

Here the HTML radio button groups are used by Amazon, a leading software company, as controls for their cookies:

Amazon cookie settings using radio button group instead of toggles.

If native HTML elements are good enough for Amazon, why are they not good enough for you?!

You can even use other HTML elements to toggle settings. A normal <button> for instance! Here is how famous corporate chat client “Slack” uses HTML buttons instead of toggles: 

Slack cookie settings using buttons labeled "Turn off" instead of toggles.

If native HTML elements are good enough for Slack, why are they not good enough for you?!

Text labels on normal buttons indicate the action of the button, especially when using active language like “Turn on” instead of “On”.

Now, I know toggles “exist” in iOS and Android SDKs, so this last argument is not as valid for native apps. But the cognitive issues remain for toggles used in native apps, so they still suck! They just suck a tiny bit less in native settings…

So toggles are not real, at least not on the web, but some designers want that fresh look and feel of the toggle! What’s the actual problem with not using built in HTML elements?

Accessibility is the problem!

Accessibility problems

HTML elements come with a lot of “hidden features” that help users with disabilities and their assistive technologies, like screen readers. HTML elements have invisible roles, states, and labels only read aloud by screen readers and other assistive tech. This is what makes users with disabilities able to interpret and interact with websites, even if they don’t see the screen, or can’t use a mouse, or if they use eye tracking, or voice control, etc.

If you just style a “box” (an HTML <div> element is commonly used) to look like a toggle, and add some “onClick” logic in JavaScript, then it will be unusable by people with assistive technologies. Making such a toggle fully accessible is not impossible – but it’s really hard! 

Haydon Pickering has a very good article about it here: https://inclusive-components.design/toggle-button/.

There are some more good ideas in this one by Sara Soueidan: https://www.sarasoueidan.com/blog/toggle-switch-design/ with both “proximity principle” and “press what you want” support.

Toggle with two labels on each side of the control, left says "Light" and right says "Dark".

And Adrian Roselli has a nice article here: https://adrianroselli.com/2019/03/under-engineered-toggles.html

So it is possible to make accessible toggles. The problem is – most web developers and designers don’t know enough about accessibility. So they copy some toggle code from the internet, and then that’s what their users get. And that’s often completely inaccessible to screen readers and other assistive technologies! The effect being that the toggle is unreachable for them, or not possible to activate even if they reach it.

Unhelpful colors

Because the toggle is known to be confusing, designers add colors to help clarify! That’s generally a good thing. But it’s not enough! 8% of male users have red/green color vision deficiency. That means it’s not much help for them using green as “on” and red as “off”.

And, again because a toggle is not really a thing in HTML, designers can decide to use any look-and-feel, since they’ve made this component up and there is no “built in browser version” of it! Can you guess what the status is of this little gem I found?

Red toggle with knob to the right.

Well, when you have red as your company’s profile color – red means “ON”.

Obvious – right? Making it easy for internet users to learn how to use this fancy toggle thing – right? …*sigh*

Some designers make it darker on activation, some make it lighter! Some use gray as “off” – but also as “on but disabled”.

Two toggles, one grey because its disabled and on, one grey because its off.

Even the digitization agency in Sweden, who are supposed to make sure others follow the accessibility guidelines, have this terrible color scheme on their cookie toggle with hardly any perceivable difference in color:

Grey toggle.
Almost grey toggle.

And even when colors are perceived and understood (“green = on”), there is still cognitive confusion; is this green color a status or an action? Is this an on-button or an on-status? It cannot be both!

Green On-button, or a toggle that is currently on, no one knows...

We can get guidance from WCAG point 1.4.1 – “don’t rely on only color to convey meaning”.

And you know who doesn’t rely at all on color to convey meaning? Checkboxes don’t. Radio buttons don’t. Just say’n. 

Are there any situations where toggles are OK?

Yes! The main problem is understanding the current state – so if the state is obvious to the user for other reasons – a toggle can be cognitively OK. As long as you make sure it’s accessible!

Grey toggle for "Free cancellation" on Airbnb close to a button saying "Show 105 places"
Black toggle for "Free cancellation" on Airbnb close to a button saying "Show 46 places"

Here is a toggle for filtering on Airbnb where a toggle button limits the amount of available houses. Users can understand by the reduced amount of houses that the filter is active, even if they don’t understand the toggle control. The number in the button is physically close to the toggle control, and many users will notice the change as it happens and draw the correct conclusion from context.

Users using zoom tools or screen readers may still miss it though, so make sure to test for that!

For multiple possible values that are mutually exclusive, a “toggle button group” can be effective. Especially if the state can be understood also from context! A good example is the “justify text” options in Google Docs:

Indentation setting toggle buttons.

Having multiple mutually exclusive options means the active option is obvious, since it’s the only one with a different look from the others. It would not be as obvious if there were only two options:

Toggle button group with 2 options, one dark one light.
Which one is active?

The user can also instantly see how the text moves around to become centered or left adjusted, so context allows users to understand the state even if they would not understand the icons in the control:

Indentation button group used in Microsoft word, one line of text is centered.

Just don’t use it for 2-option settings:

Yes and No toggle button group. Yes looking pressed into the page.

Personally, I think the “Ja” (yes) looks pressed “into the website”, so it should be active, just like the buttons on an old radio: 

Old radio with one button pressed in.

Of course – again – I was wrong…

The “toggles have instant effects” fallacy

So you’ve heard about this huh? I understand, I mean it’s in the top results when you search “when to use toggles”, and even promoted by my heroes at Nielsen Norman Group https://www.nngroup.com/articles/toggle-switch-guidelines/. The claim is that “Toggles inform users that settings have immediate effect while radio/checkbox inputs will be followed by a submit button”.

Let’s first assume this statement is correct (it isn’t). Let’s say 100% of users believe that toggles have immediate effect, that checkboxes and radio buttons cannot have immediate effect, and that 100% of websites use them that way (they don’t). Then by adding a toggle you will effectively have users who know something happened instantly when they pressed the toggle. But many of them still have no clue what happened. Congratulations! 

Now let’s prove it’s not even true!

You’ve already seen how Amazon and Slack use buttons and radio buttons with immediate effect. There are countless examples of websites doing the same. Even the big ones! Here is a settings page in Windows 10 where all settings have immediate effect. Both the toggle and the checkboxes. No “submit” button anywhere.

Settings screen with one toggle and 3 checkboxes, all selected.

So how can you claim that every user knows that checkboxes and radio buttons are always followed by a submit button, when even Microsoft’s Windows teaches them otherwise?

Next, almost every cookie manager uses toggles followed by a submit button like “Save & exit” or “Submit my preferences”.

Toggles with submit button.

And another one:

Toggles with submit button.

And another one:

Toggles with submit button.

So how can you believe that all users will know that toggles have an instant effect, when every cookie manager in the world teaches them otherwise?

This idea is simply not true! 

And there is nothing code-wise that would motivate this belief! Remember, toggles are not a thing in HTML, so they are often coded as a checkbox, button, or radio button under the surface. So whatever you can do with a toggle, you can also do with those HTML elements!

Recommendation

Just use a checkbox or radio group! It’s quick to implement, accessible from the start, and doesn’t make the user think.

If you want to save the setting instantly – then do so! And inform the user either by making the effect obvious from context, like changing colors of the interface immediately when the user checks “high contrast mode”. If no visual or obvious effects exist, then inform the user with a toast or status update message like “setting updated!” or a loading indicator with the text “saving…” like Google does:

Saving...
If users complain about the design (unlikely) or your design lead or boss demands a toggle at any cost (more likely) then follow this advice:

But if they insist…

  • Prepare to spend (waste) a LOT more time than you think to get this right
  • Make the current state obvious from context
  • Place the toggle close to what it affects
  • Don’t add a state label into the clickable button itself, as it may be interpreted as an “on-button” instead of a “button that is on”.
  • Don’t rely on color
  • Don’t assume everyone thinks “right = active”
  • Test the accessibility, preferably together with users with disabilities
  • Read up on accessibility and follow the linked articles

Summary

This table sums up the topics in this article:

Table visualizing that checkboxes and radio buttons have more good features than toggles.

I’ll leave you with this “great” example from an anonymous Swedish ferry company, where I still to this day have no idea what I have selected.

Toggles for newsletter and travel information, both grey with labels "on" and "off", both inside the toggle.

Toggles suck!

Feel free to tweet us at @AxessLab and share your own examples of confusing toggles! Or let us know why we’re wrong!