Recently, someone posted on LinkedIn that skip links are often broken because their target elements are missing a `tabindex` attribute. I was really surprised to see that because I thought that was an issue of the past. That's why I decided to test it.

https://matuzo.at/blog/2026/skip-links-tabindex?d=0503

Update: Thanks for the feedback. I've added more tests and updated the title.

Your skip link targets may not need tabindex=-1 to work properly - Manuel Matuzovic

I'm a frontend developer in Graz, specialized in HTML, accessibility, and CSS layout and architecture.

Manuel Matuzovic

@matuzo FWIW, when I last tested this in early 2025: there was a lingering issue with iOS Safari.

If the target was overlapped by another element (e.g. a sticky header), the skip links didn't work properly without tabindex on the target. And when I say "overlapped," I don't necessarily mean to the degree that the target was obscured.

I tend to still add the tabindex because why not? And also because I'm getting old.

@jscholes
I find `tabindex="-1"` is still needed on the skip link target.

Testing with VoiceOver on macOS 15.7.4+Safari 26.3

- Focus and virtual cursor is on "Skip to content" link.
- Press Enter to activate link
- Press VO+right arrow to move the virtual cursor to next element

If the skip link target doesn't have `tabindex="-1"`, the virtual cursor moves to the next element after the skip link. If the target does have `tabindex="-1"`, to moves to the next element after/within the targeted element, the intended behavior.

If I use VO+Space to activate the skip link instead of Enter, the tabindex isn't needed to work as intended. Even if that's the more common way to activate a link with VoiceOver on, the intended behavior should still be supported when Enter is pressed.

@matuzo

@cwilcox808 @matuzo Good data! Thanks for testing.

In general, VO has quite a few small bugs in the synchronisation between its own cursor and the system focus. Especially when the latter is set programmatically by the page itself.