HTML5 Features I Actually Use (And The Ones I Ignore)

Stop Writing Div Soup. Seriously.

I reviewed a pull request last Tuesday—January 27th, to be exact—and I nearly cried. It was a React component, beautifully logic-heavy, running on Node 22.14.0. But the render return? A nightmare of nested <div> tags. Just layers and layers of generic containers.

But we are in 2026. HTML5 has been the standard for over a decade. And I still see developers treating semantic tags like they’re optional DLC.

HTML5 wasn’t just a version bump. It was a fundamental shift from “documents” to “applications.” But if you’re just using it to embed a video and call it a day, you’re missing the point. Well, that’s not entirely accurate—I want to talk about the features that actually save my bacon in production, the APIs that replaced my jQuery spaghetti, and the parts of the spec that are frankly still a mess.

The Semantic Stuff (That Actually Matters for SEO)

You know the basics: <header>, <footer>, <nav>. But the one that people still mess up is <article> vs <section>.

Here’s my rule of thumb: If I can rip this chunk of content out, paste it on another site, and it still makes sense? That’s an <article>. If it’s just a thematic grouping inside a page? That’s a <section>.

Why care? Because screen readers rely on this. I ran a quick accessibility audit on a client site last month using Lighthouse in Chrome 142. And we bumped their accessibility score from a dismal 64 to a 96 just by swapping generic divs for semantic landmarks. No complex ARIA labels, no JavaScript hacks. Just proper HTML tags. Google’s crawlers eat this stuff up.

Forms: The Unsung Heroes

Remember writing JavaScript regex to validate email addresses? I do. It was awful. I probably still have a snippet somewhere that checks for the “@” symbol and prays for the best.

But HTML5 input types are the single biggest time-saver for frontend work.

<input type="email">

<input type="date">

HTML source code on screen - Developer python, java script, html, css source code on monitor ...
HTML source code on screen – Developer python, java script, html, css source code on monitor …

<input type="tel">

It’s not just about validation. It’s about the keyboard. If you load a form on an iPhone running iOS 19 and the email field doesn’t bring up the keyboard with the “@” symbol prominent, I’m judging you. It’s a tiny UX detail that reduces friction significantly.

A warning though: The native date picker styling is still… opinionated. I tried to style a <input type="date"> for a dark-mode dashboard last week, and let’s just say Safari and I are currently not on speaking terms. But for internal tools? Native all the way.

The “No-Plugins” Multimedia Dream

I’m old enough to remember the dark ages. <object> tags. Flash updates. The “click to activate” overlay.

HTML5 gave us <video> and <audio>. It just works. You drop a source in, add the controls attribute, and the browser handles the rest.

But here is a gotcha that bit me recently: Autoplay policies.

<video autoplay muted playsinline loop>
  <source src="hero-background.mp4" type="video/mp4">
</video>

That playsinline attribute is critical for mobile, by the way. Without it, iPhones used to force the video into fullscreen mode, hijacking the entire experience. I learned that the hard way during a launch in late 2024.

Storage: LocalStorage vs. IndexedDB

This is where things get interesting. We all love LocalStorage. It’s a simple key-value pair system. It’s synchronous. It’s easy.

localStorage.setItem('theme', 'dark');

But people abuse it. And I saw a dev trying to store a 4MB base64 encoded image string in LocalStorage. The main thread locked up every time the app initialized.

My benchmark test:

I decided to test this properly. I wrote a script to read/write a 2MB JSON object 100 times.

HTML source code on screen - Developer python, java script, html, css source code on monitor ...
HTML source code on screen – Developer python, java script, html, css source code on monitor …
  • LocalStorage: Averaged 14ms per write. Blocking the main thread. The UI stuttered noticeably.
  • IndexedDB: Averaged 45ms per write (async overhead), but zero UI blocking.

My advice? Use LocalStorage for tiny config settings (theme, sidebar state). Use IndexedDB (preferably with a wrapper like idb) for anything that resembles actual data. Don’t block your user’s UI just because you’re lazy with storage.

Graphics: Canvas vs. SVG

HTML5 introduced the <canvas> element, which is basically a bitmap drawing surface scriptable with JavaScript. It’s fast. I use it for rendering real-time charts where I have thousands of data points updating every second.

But for everything else? SVG (Scalable Vector Graphics) is superior.

I had a project last month where we needed an interactive map. My first instinct was Canvas because “performance.” I was wrong. The complexity of handling click events on a rasterized Canvas drawing was a nightmare. I switched to inline SVG, added a few CSS classes for hover states, and the DOM handled the event listeners perfectly. It was cleaner, accessible, and frankly, easier to debug.

The API I Hate: Drag and Drop

We need to talk about the HTML5 Drag and Drop API.

It exists. It works. And I hate it.

HTML source code on screen - View or Edit HTML: Cascade Help - Northwestern University
HTML source code on screen – View or Edit HTML: Cascade Help – Northwestern University

If you need drag and drop, honestly, just use a library that wraps this mess. I spent three days fighting native DnD implementation quirks on Firefox before giving up and using a lightweight wrapper. Life is too short.

Geolocation (Use With Caution)

navigator.geolocation is powerful. But user trust is at an all-time low. If your website asks for my location the second I land on the homepage, I’m clicking “Block” instantly.

The right way to use this feature is context. Don’t ask on load. Ask when I click “Find stores near me.”

I implemented this on a delivery tracking page recently. We waited until the user tapped the “Where is my driver?” button to request permission. Acceptance rates went from 12% (when asking on load) to 85%. Context matters more than the code.

So, What Now?

HTML5 isn’t new anymore. It’s the water we swim in. But the difference between a junior dev and a senior dev often comes down to knowing which parts of the spec to use.

Don’t use features just because they exist. Use semantic tags because they make your code readable and accessible. Use the video tag because it’s stable. Use LocalStorage sparingly. And for the love of code, please stop using nested divs for everything. Stop Writing Divs: A Modern HTML Survival Guide.

Your email address will not be published. Required fields are marked *

Zeen Social Icons