HTML Semantics & Accessibility
Mind Map Summary
- Semantic HTML
- What: Using HTML elements according to their meaning, not their appearance.
- Why It Matters:
- Accessibility (a11y): Screen readers use semantic tags (
<nav>
,<h1>
,<button>
) to understand the page structure and provide navigation shortcuts to users. - SEO: Search engines use tags like
<article>
and<h1>
to better understand and rank your content. - Maintainability: Code is easier for other developers to read and understand.
- Accessibility (a11y): Screen readers use semantic tags (
- The Golden Rule: If a native HTML element exists for the job, use it. (
<button>
is better than<div role="button">
).
- Accessibility (a11y)
- What: The practice of making websites usable by everyone, including people with disabilities.
- WCAG (Web Content Accessibility Guidelines): The global standard for accessibility, based on four principles (POUR):
- Perceivable: Users must be able to perceive the information (e.g., providing
alt
text for images). - Operable: Users must be able to operate the interface (e.g., everything works with a keyboard).
- Understandable: The content and UI must be clear and predictable.
- Robust: Content must be compatible with a wide range of user agents, including assistive technologies.
- Perceivable: Users must be able to perceive the information (e.g., providing
- ARIA (Accessible Rich Internet Applications)
- What: A set of HTML attributes that can enhance accessibility when native semantics are not sufficient.
- Use Case: To add context to non-semantic elements (like a
div
pretending to be a button) or to describe the state of dynamic widgets (e.g.,aria-expanded="true"
).
Core Concepts
1. Semantic HTML: Writing with Meaning
At its core, semantic HTML is about choosing the right element for the right job. A <div>
is a generic container; it tells you nothing about its contents. A <nav>
element, however, explicitly tells browsers, search engines, and screen readers that its contents are the primary navigation links for the page.
- Non-Semantic Elements:
<div>
,<span>
. Use these for purely presentational styling when no other element is appropriate. - Structural Elements:
<header>
,<footer>
,<nav>
,<main>
,<section>
,<article>
,<aside>
. These give your page a clear, machine-readable structure. - Text Elements:
<h1>
-<h6>
,<p>
,<ul>
,<ol>
,<li>
,<blockquote>
. These structure your content, which is vital for readability and SEO. - Interactive Elements:
<button>
,<a>
,<input>
,<form>
. Using these native elements is critical because they come with built-in accessibility features, such as being focusable by a keyboard and being understood by screen readers.
2. Accessibility (a11y): Beyond the Visuals
Accessibility means designing for everyone. This includes users who may be blind and use a screen reader, users who cannot operate a mouse and rely on a keyboard, users with low vision who need high contrast, and many others. Using semantic HTML is the foundation of accessibility. A screen reader can announce “Heading level 1” for an <h1>
or “Button” for a <button>
, giving essential context to a non-sighted user. If you use a <div>
for everything, that context is lost.
3. ARIA: Bridging the Gap
The first rule of ARIA is: don’t use ARIA. If a native HTML element with the right semantics exists, use it. However, for complex, dynamic web applications, you sometimes create components that have no native HTML equivalent (like a custom dropdown menu or a tabbed interface). In these cases, ARIA is essential.
role
: This attribute tells assistive technologies what a generic element is pretending to be. For example,<div role="button">
tells a screen reader to treat thisdiv
as a button.aria-label
: Provides an accessible name for an element when there is no visible text (e.g., an icon-only button:<button aria-label="Close">X</button>
).- State Attributes: Attributes like
aria-expanded
,aria-selected
, andaria-hidden
describe the state of dynamic components.
Practice Exercise
Audit a simple webpage for accessibility issues. Refactor non-semantic elements (div
s used for buttons or headers) into their correct semantic counterparts (button
, h1
, etc.) and add necessary ARIA attributes.
Answer
”Bad” Code: Non-Semantic and Inaccessible
<div class="header">
<div class="logo">My Awesome Site</div>
<div class="nav">
<span>Home</span>
<span>About</span>
<span>Contact</span>
</div>
</div>
<div class="main-content">
<div class="page-title">Welcome to my site!</div>
<p>This is some content.</p>
<div class="button" onclick="doSomething()">Click Me</div>
</div>
Accessibility Issues:
- No Structure: A screen reader just sees a series of
div
s and has no idea what the page structure is. - Fake Heading: The
page-title
div
looks like a heading, but it isn’t programmatically a heading. - Fake Navigation: The
nav
div
andspan
s are not identifiable as a navigation block or as links. - Fake Button: The
button
div
is the worst offender. It is not focusable with a keyboard, it doesn’t announce itself as a button to screen readers, and it cannot be activated with the Enter or Space keys.
”Good” Code: Semantic and Accessible
<header>
<a href="/" class="logo">My Awesome Site</a>
<nav aria-label="Main Navigation">
<ul>
<li><a href="/">Home</a></li>
<li><a href="/about">About</a></li>
<li><a href="/contact">Contact</a></li>
</ul>
</nav>
</header>
<main>
<h1>Welcome to my site!</h1>
<p>This is some content.</p>
<button type="button" onclick="doSomething()">Click Me</button>
</main>
Improvements:
- Clear Structure: The page is now structured with
<header>
and<main>
, which is immediately understandable to assistive technologies. - Real Heading:
<h1>
is used for the main page title. A screen reader user can now use a shortcut to jump directly to the main heading. - Real Navigation:
<nav>
defines the navigation region. Using a<ul>
(unordered list) for the links is a standard, semantic way to structure a list of navigation items. Thearia-label
on the<nav>
helps distinguish it if there were multiple navigation blocks on the page. - Real Button: The
<button>
element is used. This is a huge improvement:- It is automatically focusable via the keyboard (e.g., by pressing Tab).
- It can be activated with both the Enter and Space keys.
- It announces itself to screen readers as “Button, Click Me”.
This refactored version is far more accessible, better for SEO, and easier for other developers to understand and maintain.