Bird
Raised Fist0
Angularframework~5 mins

Keyboard navigation support in Angular

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction

Keyboard navigation helps users move through your app using only the keyboard. This makes your app easier to use for everyone, especially people who cannot use a mouse.

When building forms that users fill out quickly without a mouse.
When creating menus or dropdowns that users should navigate with arrow keys.
When making interactive lists or tables accessible for keyboard users.
When supporting users with disabilities who rely on keyboard navigation.
When improving overall user experience for faster navigation.
Syntax
Angular
import { Component, HostListener } from '@angular/core';

@Component({
  selector: 'app-keyboard-nav',
  template: `
    <div tabindex="0" (keydown)="onKeydown($event)">
      Press arrow keys to navigate
    </div>
  `
})
export class KeyboardNavComponent {
  @HostListener('keydown', ['$event'])
  onKeydown(event: KeyboardEvent) {
    switch(event.key) {
      case 'ArrowUp':
        // move focus up
        break;
      case 'ArrowDown':
        // move focus down
        break;
      // add more keys as needed
    }
  }
}

Use tabindex="0" to make elements focusable by keyboard.

Use @HostListener('keydown') to listen for keyboard events in Angular.

Examples
This makes a div focusable and listens for key presses.
Angular
<div tabindex="0" (keydown)="onKeydown($event)">Focusable div</div>
Handles the Enter key press inside a component method.
Angular
onKeydown(event: KeyboardEvent) {
  if(event.key === 'Enter') {
    console.log('Enter pressed');
  }
}
Using HostListener to catch keyboard events globally on the component.
Angular
@HostListener('keydown', ['$event'])
onKeydown(event: KeyboardEvent) {
  if(event.key === 'Tab') {
    // custom tab behavior
  }
}
Sample Program

This component shows a list of items. You can use the up and down arrow keys to move focus between items. The focused item is highlighted with keyboard focus.

Angular
import { Component, ElementRef, ViewChildren, QueryList, AfterViewInit, HostListener } from '@angular/core';

@Component({
  selector: 'app-keyboard-navigation',
  template: `
    <ul>
      <li #items tabindex="0" *ngFor="let item of itemsList; let i = index" [attr.aria-selected]="i === focusedIndex">
        {{item}}
      </li>
    </ul>
  `
})
export class KeyboardNavigationComponent implements AfterViewInit {
  itemsList = ['Item 1', 'Item 2', 'Item 3', 'Item 4'];
  focusedIndex = 0;

  @ViewChildren('items', {read: ElementRef}) items!: QueryList<ElementRef>;

  ngAfterViewInit() {
    this.focusItem(this.focusedIndex);
  }

  @HostListener('keydown', ['$event'])
  onKeydown(event: KeyboardEvent) {
    if(event.key === 'ArrowDown') {
      this.focusedIndex = (this.focusedIndex + 1) % this.itemsList.length;
      this.focusItem(this.focusedIndex);
      event.preventDefault();
    } else if(event.key === 'ArrowUp') {
      this.focusedIndex = (this.focusedIndex - 1 + this.itemsList.length) % this.itemsList.length;
      this.focusItem(this.focusedIndex);
      event.preventDefault();
    }
  }

  focusItem(index: number) {
    const element = this.items.toArray()[index].nativeElement as HTMLElement;
    element.focus();
  }
}
OutputSuccess
Important Notes

Always add tabindex="0" to elements you want keyboard users to focus.

Use event.preventDefault() to stop default scrolling when handling arrow keys.

Use ARIA attributes like aria-selected to improve screen reader support.

Summary

Keyboard navigation lets users move through UI with keys like arrows and tab.

Use tabindex to make elements focusable and @HostListener to handle key events.

Test keyboard navigation to ensure your app is accessible and easy to use.

Practice

(1/5)
1. What is the main purpose of adding keyboard navigation support in an Angular app?
easy
A. To allow users to navigate the app using keyboard keys
B. To improve the app's loading speed
C. To change the app's color scheme automatically
D. To add animations when clicking buttons

Solution

  1. Step 1: Understand keyboard navigation

    Keyboard navigation lets users move through app elements using keys like arrows or tab.
  2. Step 2: Identify the purpose in Angular apps

    Adding keyboard navigation improves accessibility and user experience by enabling key-based movement.
  3. Final Answer:

    To allow users to navigate the app using keyboard keys -> Option A
  4. Quick Check:

    Keyboard navigation = user key movement [OK]
Hint: Keyboard navigation means moving with keys, not visuals [OK]
Common Mistakes:
  • Confusing keyboard navigation with app speed
  • Thinking it changes colors or animations
  • Assuming it only works with mouse clicks
2. Which Angular syntax correctly listens for the 'ArrowDown' key press on a button?
easy
A. Click
B. Click
C. Click
D. Click

Solution

  1. Step 1: Recall Angular event binding syntax

    Angular uses parentheses for events and lowercase event names with dots for key names.
  2. Step 2: Match correct key event syntax

    The correct syntax is (keydown.arrowdown) with lowercase and dot notation.
  3. Final Answer:

    <button (keydown.arrowdown)="onArrowDown()">Click</button> -> Option B
  4. Quick Check:

    Angular key event = (keydown.arrowdown) [OK]
Hint: Use lowercase and dot for key events in Angular [OK]
Common Mistakes:
  • Using uppercase letters in event names
  • Replacing dot with dash or camelCase
  • Missing parentheses around event
3. Given this Angular snippet, what happens when the user presses the 'ArrowDown' key?
<button #btn1 (keydown.arrowdown)="focusNext(1)">One</button>
<button #btn2 (keydown.arrowdown)="focusNext(2)">Two</button>
<button #btn3>Three</button>

Assuming focusNext(index) sets focus to the button at that index, which button gets focused after pressing 'ArrowDown' on button 1?

medium
A. Button One again
B. Button Three
C. Button Two
D. No button gets focused

Solution

  1. Step 1: Understand the event binding

    Pressing 'ArrowDown' on button 1 triggers focusNext(1), which focuses button at index 1 (button 2).
  2. Step 2: Identify which button is at index 1

    Button Two is the second button, so it receives focus.
  3. Final Answer:

    Button Two -> Option C
  4. Quick Check:

    ArrowDown on btn1 focuses btn2 [OK]
Hint: Index 1 means second button, so focus moves there [OK]
Common Mistakes:
  • Assuming index starts at 0 instead of 1
  • Thinking focus stays on the same button
  • Confusing button labels with indexes
4. You wrote this Angular code to move focus on 'ArrowDown', but it does not work:
@ViewChildren('btn') buttons: QueryList<ElementRef>;

focusNext(index: number) {
  this.buttons.toArray()[index].nativeElement.focus;
}

What is the error preventing focus from moving?

medium
A. Index should be zero-based, not one-based
B. Wrong decorator used instead of @ViewChild
C. QueryList does not support toArray() method
D. Missing parentheses after focus method call

Solution

  1. Step 1: Check method call syntax

    The code uses nativeElement.focus without parentheses, so the focus method is not called.
  2. Step 2: Understand method invocation

    To move focus, focus() must be called with parentheses to execute it.
  3. Final Answer:

    Missing parentheses after focus method call -> Option D
  4. Quick Check:

    Call focus() with () to move focus [OK]
Hint: Remember to call focus() with parentheses [OK]
Common Mistakes:
  • Forgetting parentheses on method calls
  • Confusing @ViewChild and @ViewChildren usage
  • Assuming toArray() is invalid on QueryList
5. You want to create a keyboard navigation system in Angular where pressing 'ArrowDown' moves focus to the next item, and pressing 'ArrowUp' moves focus to the previous item in a list of buttons. Which approach correctly supports this behavior and handles edge cases (start and end of list)?
hard
A. Use @ViewChildren to get buttons, then in keydown handlers call focusNext(index) or focusPrev(index) with checks to wrap focus from last to first and vice versa
B. Use @ViewChild for each button separately and manually set focus without index checks
C. Use (keydown) event without specifying keys and call focus() on the first button always
D. Use native JavaScript event listeners outside Angular to manage focus without Angular bindings

Solution

  1. Step 1: Understand Angular focus management

    @ViewChildren collects all buttons, allowing indexed access to manage focus programmatically.
  2. Step 2: Handle keydown events with wrapping logic

    Using keydown handlers for ArrowUp and ArrowDown with index checks lets you move focus up/down and wrap from last to first or first to last.
  3. Step 3: Compare options for correctness

    Use @ViewChildren to get buttons, then in keydown handlers call focusNext(index) or focusPrev(index) with checks to wrap focus from last to first and vice versa uses Angular patterns and handles edge cases correctly. Others miss index checks or Angular integration.
  4. Final Answer:

    Use @ViewChildren to get buttons, then in keydown handlers call focusNext(index) or focusPrev(index) with checks to wrap focus from last to first and vice versa -> Option A
  5. Quick Check:

    Indexed focus with wrapping = correct keyboard navigation [OK]
Hint: Use @ViewChildren and wrap focus indexes for smooth navigation [OK]
Common Mistakes:
  • Not handling focus wrap at list ends
  • Using @ViewChild for multiple elements incorrectly
  • Ignoring Angular event bindings and using native listeners