Master alternative text, a heading hierarchy screen readers can actually navigate, and ARIA usage limited to cases where native HTML falls short.
Open this lesson in KodokonAccessibility is not a cosmetic layer bolted on at the end of a project: it is a structural property of your HTML. First up, the alt attribute. Good alternative text describes the function of the image in its context, not its pixel-by-pixel appearance. A sales chart isn't described as "blue bar chart" but by the information it carries. And a purely decorative image must get an empty alt="": it is the explicit signal telling the screen reader to skip it. Omitting the attribute is the worst option of all, because the screen reader then announces the file name.
<img src="sales-chart.png"
alt="2025 sales: +18% in the last quarter">
<img src="divider-ornament.png" alt="">Second task: the heading hierarchy. Screen reader users overwhelmingly jump from heading to heading to build a mental map of the page. Your h1 → h2 → h3 outline must therefore reflect the logical structure of the content, never the visual size you happen to want. Two non-negotiable rules: a single h1 per page, and no skipped levels (no h4 directly under an h2). If a heading looks "too big", fix it in CSS, not by downgrading its semantic level.
<h1>Dashboard</h1>
<section>
<h2>Statistics</h2>
<h3>Monthly visits</h3>
<h3>Conversion rate</h3>
</section>
<section>
<h2>Exportable reports</h2>
</section>ARIA becomes legitimate when native HTML cannot express a dynamic state: a menu that is open or closed, a region updated live, an active tab. The key attributes are aria-expanded (open/closed state), aria-controls (link to the element being controlled), and aria-live (announcing updates). Remember the principle: native HTML provides the roles, ARIA fills in the states and properties that your JavaScript changes over time.
<button aria-expanded="false" aria-controls="menu">
Menu
</button>
<ul id="menu" hidden>
<li><a href="/profile">Profile</a></li>
<li><a href="/settings">Settings</a></li>
</ul>