DEV Community

Cover image for Never forget the keyboard warriors
Ross Angus
Ross Angus

Posted on

2 1

Never forget the keyboard warriors

I was polishing a site today and checking how it worked when using the keyboard to navigate when I noticed something: at certain points, the focus disappeared. Sometimes, this was because it got swallowed by tooltips or navigation bars (which I've since updated so they fly open). But even after this, the focus still went AWOL.

Then I remembered that I'd inherited a form where the manual submit button was hidden with JavaScript, but which auto-submits, when the user changes a select box.

I'd used the old trick of getting JavaScript to add a js class to the body, then used a data-js="hidden" attribute on elements I wanted to scoot out of the way. It's a variation of the old sr-only class:

.sr-only, .js [data-js="hidden"] {
  border: 0;
  clip: rect(0,0,0,0);
  height: 1px;
  margin: -1px;
  min-width: 0;
  overflow: hidden;
  padding: 0;
  position: absolute;
  white-space: nowrap;
  width: 1px;
}
Enter fullscreen mode Exit fullscreen mode

Rather than adding more JavaScript or another class, instead, I expanded it like this (I'm using SCSS):

.sr-only, .js [data-js="hidden"] {
  border: 0;
  clip: rect(0,0,0,0);
  height: 1px;
  margin: -1px;
  min-width: 0;
  overflow: hidden;
  padding: 0;
  position: absolute;
  white-space: nowrap;
  width: 1px;

  // Never forget our keyboard navigating siblings.
  &:focus {
    height: auto;
    margin: unset;
    min-width: unset;
    overflow: visible;
    padding: unset;
    position: static;
    width: auto;
  }
}
Enter fullscreen mode Exit fullscreen mode

Note that one limitation with my use of the data-js attribute is that it's not particularly expandable - trying to add a second value to the attribute will break the pattern, unless I started using a pattern along the lines of [data-js^="hidden"], [data-js*=" hidden"]. I'll revisit this if it becomes an issue.

Anyway, it worked a treat and my hidden submit button pops out when required. Mouse-driven users and touch users probably won't ever see it. Dunno if this might be useful to someone. Feel free to reuse it.

Update

Well, that didn't take long. What I'd forgotten was that I'm heavily abusing checkboxes and radio buttons for various tasks around the site, all of which popped up when I added this code (and they went into focus, of course). For the moment, I've locked this behaviour behind an .kb-focus:focus selector, which makes it opt-in.

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More

Top comments (0)

AWS Security LIVE!

Tune in for AWS Security LIVE!

Join AWS Security LIVE! for expert insights and actionable tips to protect your organization and keep security teams prepared.

Learn More

👋 Kindness is contagious

Engage with a sea of insights in this enlightening article, highly esteemed within the encouraging DEV Community. Programmers of every skill level are invited to participate and enrich our shared knowledge.

A simple "thank you" can uplift someone's spirits. Express your appreciation in the comments section!

On DEV, sharing knowledge smooths our journey and strengthens our community bonds. Found this useful? A brief thank you to the author can mean a lot.

Okay