Skip to content

Arrow Key Navigation — Implementing Arrow Key Interactions

DodaTech Updated 2026-06-28 3 min read

In this tutorial, you will learn about Arrow Key Navigation. We cover key concepts, practical examples, and best practices to help you master this topic.

Arrow key navigation enables users to move between items within a widget group, such as tabs in a tablist or options in a listbox, using directional keys instead of Tab.

In this tutorial, you'll learn to implement Keyboard Navigation arrow key patterns.

What You'll Learn

By the end of this lesson, you'll understand arrow key patterns for horizontal and vertical widgets, circular and non-circular navigation, and the expected behavior for Home and End keys.

Why It Matters

Arrow keys provide efficient navigation within widgets. Without them, users must tab through every item individually.

Real-World Use

Doda Browser's tab panels and Durga Antivirus Pro's settings menus both use arrow key navigation.

Arrow Key Patterns

flowchart TD
  A[Arrow Key Behavior] --> B[Horizontal widgets]
  A --> C[Vertical widgets]
  A --> D[Grid widgets]
  B --> E[Left/Right arrows]
  C --> F[Up/Down arrows]
  D --> G[Four directional arrows]
  B --> H[Examples: tabs, toolbar]
  C --> I[Examples: menu, listbox]
  D --> J[Examples: grid, table]

Horizontal Navigation

function handleHorizontalArrow(event, items, container) {
  const currentIndex = items.indexOf(document.activeElement);
  let newIndex;

  switch (event.key) {
    case 'ArrowLeft':
      newIndex = (currentIndex - 1 + items.length) % items.length;
      break;
    case 'ArrowRight':
      newIndex = (currentIndex + 1) % items.length;
      break;
    case 'Home':
      newIndex = 0;
      break;
    case 'End':
      newIndex = items.length - 1;
      break;
    default:
      return;
  }

  event.preventDefault();
  focusItem(items[newIndex]);
}

Vertical Navigation

<ul role="menu" aria-label="File menu">
  <li role="menuitem" tabindex="0">Open</li>
  <li role="menuitem" tabindex="-1">Save</li>
  <li role="menuitem" tabindex="-1">Close</li>
</ul>
// Use Up/Down arrows for vertical widgets
// Wrap: circular navigation (first to last and vice versa)
// No wrap: stop at first and last items

Grid Navigation

Grids require four-directional navigation:

case 'ArrowUp':
  newIndex = currentIndex - columns;
  break;
case 'ArrowDown':
  newIndex = currentIndex + columns;
  break;
case 'ArrowLeft':
  newIndex = currentIndex - 1;
  break;
case 'ArrowRight':
  newIndex = currentIndex + 1;
  break;

Common Mistakes

  • Using wrong arrow keys for widget orientation: Left/Right for horizontal, Up/Down for vertical.
  • Not wrapping in circular widgets: Tab lists wrap (last to first).
  • Wrapping in non-circular widgets: Menus may stop at first and last items.
  • Not handling Home and End keys: Users expect these keys to work.
  • Overriding browser arrow key behavior: Page scrolling should still work outside widgets.

Practice and Challenge

1. What arrow keys navigate a horizontal tab list? Left and Right arrows.

2. What arrow keys navigate a vertical menu? Up and Down arrows.

3. Should a tab list wrap from last to first? Yes. Tab lists typically use circular navigation.

4. What is the expected behavior of the Home key? Navigate to the first item.

5. Challenge: Implement a listbox with arrow key navigation. Include wrapping, Home, and End keys.

FAQ

Do I need to implement Shift+Arrow as well?

No. Shift+Arrow is not a standard accessibility pattern.

Should I use keydown or keyup for arrow navigation?

keydown is preferred for immediate response.

What if the widget is both horizontal and vertical?

Use all four arrow keys. For example, a grid uses Left, Right, Up, and Down.

Do arrow keys work in browse mode?

In browse mode, arrow keys navigate the document. Arrow key widgets need focus mode.

How do I prevent scrolling when arrow keys are used in a widget?

Call event.preventDefault() on the keydown event.

Mini Project

Create a custom listbox component with vertical arrow navigation, wrapping, and Home/End keys. Use role="listbox" and role="option".

What's Next

Continue to Keyboard Shortcuts to learn about implementing custom shortcut keys.

Built by the developers of DodaTech

Doda Browser, DodaZIP & Durga Antivirus Pro