DEV Community

khalil la
khalil la

Posted on

Make a `<div>` Act Like a Button in Angular

Introduction

In modern web development, buttons are essential interactive elements. While the <button> element is the best choice for accessibility and usability, there may be cases where you need a <div> to function like a button. In this article, we'll explore how to make a <div> behave like a button in an Angular application while ensuring it remains accessible and functional.

Why Not Use <div> Instead of <button>?

Using a <div> as a button without additional enhancements can lead to several issues:

  • Not keyboard accessible – Users can't navigate to it using the Tab key.
  • No built-in click behavior – Unlike <button>, a <div> does not trigger form submissions or default actions.
  • Lack of accessibility – Screen readers do not recognize it as a button.

To resolve these issues, we must add proper event handlers, accessibility attributes, and keyboard support.

Implementing a Div Button in Angular with Tailwind CSS

We can make a <div> act like a button while keeping it fully accessible. Below is a step-by-step guide to implementing this approach in an Angular project with Tailwind CSS.

1️⃣ HTML (Angular Template)

<div
  role="button"
  tabindex="0"
  (click)="handleClick($event)"
  (keydown)="handleClick($event)"
  class="px-4 py-2 bg-blue-500 text-white text-center rounded-lg cursor-pointer
         focus:outline-none focus:ring-2 focus:ring-blue-300 active:bg-blue-600"
>
  Click Me
</div>
Enter fullscreen mode Exit fullscreen mode

2️⃣ TypeScript (Component Logic)

handleClick(event: KeyboardEvent | MouseEvent) {
  if (event instanceof MouseEvent || event.key === "Enter" || event.key === " ") {
    console.log("Div button clicked!");
    // Add additional logic here
  }
}
Enter fullscreen mode Exit fullscreen mode

3️⃣ Explanation of Enhancements

  • role="button" – Helps screen readers understand that this <div> is interactive.
  • tabindex="0" – Makes the <div> focusable using the keyboard.
  • Event Listeners:
    • (click) – Handles mouse clicks.
    • (keydown) – Detects Enter and Space key presses, making it keyboard accessible.
  • Tailwind Styles:
    • cursor-pointer → Makes it visually clickable.
    • focus:outline-none focus:ring-2 focus:ring-blue-300 → Adds focus indicators for accessibility.
    • active:bg-blue-600 → Provides a pressed effect for better UX.

Final Thoughts

While using a <button> is always recommended for better accessibility, sometimes we may need to use a <div> for flexibility. By following this approach, you can ensure your div-based button is fully interactive and accessible in an Angular application.

Top comments (2)

Collapse
 
fyodorio profile image
Fyodor • Edited

there may be cases where you need a div to function like a button

Which cases?

Collapse
 
gridou profile image
khalil la

Hi Fyord, Imagine you want to make a Card clickable, you can wrap the Card in a button or use a Div. Putting a Div inside a button is incorrect semantically: stackoverflow.com/questions/129822...