Keyboard navigation tester

One-click bookmark that highlights every focusable element on the current page in document order. See your tab path without tabbing.

How to install

  1. Make your bookmarks bar visible (Ctrl+Shift+B / Cmd+Shift+B in Chrome and Firefox).
  2. Drag the orange button below to your bookmarks bar.
  3. Visit any page on your Shopify storefront (or any other site) and click the bookmark.
↪ AccessComply: Show Tab Order

Drag the button — don’t click it. (Clicking only works after you save it as a bookmark and run it on a third-party site.)

What you’ll see

Every focusable element gets:

  • A dashed orange outline (independent of any custom focus styling)
  • A numbered badge in the top-left corner showing document tab-order index
  • An emphasized solid orange ring while keyboard focus is on it

Click the bookmark a second time to clear every annotation. Run it on a fresh page load to re-discover focusable elements after dynamic content loads.

Source code

The bookmarklet is a self-contained IIFE under 4 KB with no external dependencies. Open the bookmark properties in your browser to inspect or modify the source.

(function() {
  // Toggle: clear if already injected
  var d = document;
  var e = d.getElementById('ac-knt');
  if (e) {
    e.parentNode.removeChild(e);
    d.querySelectorAll('.ac-knt-mark')
      .forEach(n => n.parentNode.removeChild(n));
    return;
  }
  // Inject focus ring style
  var s = d.createElement('style');
  s.id = 'ac-knt';
  s.textContent = '*:focus{outline:3px solid #f97316!important;outline-offset:2px!important}';
  d.head.appendChild(s);
  // Find focusables
  var sel = 'a[href],button,input:not([type=hidden]),select,textarea,'
          + '[tabindex]:not([tabindex="-1"]),summary,details,'
          + 'audio[controls],video[controls],iframe';
  var els = Array.from(d.querySelectorAll(sel))
    .filter(el => !el.disabled && el.offsetParent !== null);
  // Number each
  els.forEach((el, i) => {
    var r = el.getBoundingClientRect();
    var m = d.createElement('span');
    m.className = 'ac-knt-mark';
    m.textContent = (i + 1).toString();
    m.style.top = (r.top + scrollY) + 'px';
    m.style.left = (r.left + scrollX - 2) + 'px';
    d.body.appendChild(m);
    el.style.outline = '2px dashed #f97316';
  });
  console.log('AccessComply Keyboard Nav Tester:',
    els.length, 'focusable elements found.');
})();

Want every keyboard issue fixed automatically?

AccessComply scans every page of your Shopify store for tab-order, focus-trap, and focus-visible issues, then writes the fixes into your theme source code.

Scan my Shopify store free

FAQ

What does the keyboard nav tester do?

The bookmarklet finds every focusable element on the current page (links, buttons, inputs, custom elements with tabindex), numbers them in document order, and outlines each one. It lets you see the keyboard tab order without tabbing through manually — useful for catching skipped elements, hidden focusable elements, and broken focus order.

Why a bookmarklet and not a browser extension?

A bookmarklet works in any modern browser without installation, has no permissions footprint, and respects the page's own JavaScript context (so it sees what a screen reader would see). Extensions that inject content in an isolated context can miss dynamically-added focusable elements.

Does it find issues axe-core would flag?

It surfaces structure, not violations. axe-core flags rule violations (missing labels, contrast failures, ARIA mismatches). The bookmarklet shows you the tab order so you can decide whether the order matches the visual order. The two are complementary.

Will this break the page?

No. The bookmarklet only adds outline styles and absolutely-positioned numbering markers. It changes nothing in the page's JavaScript or DOM tree. Click the bookmark a second time to remove every change cleanly.

Is the source code open?

Yes — the unminified source is shown on this page. The bookmarklet is a single self-contained IIFE under 4 KB, no external dependencies, no network calls.