All blogs / Frontend / CSS / browsers
HTMHell
A collection of bad practices in HTML, copied from real websites.
- Posts
- 140 from 17 Oct 2019 to 28 Dec 2025
- Posting
- weekly (28 in the last year)
- Kind
- community
- Feed
- https://www.htmhell.dev/feed.xml?y=122024
2025 29
- HTML Input Validation is (maybe) Good
- Replacing JS with just HTML
- Class names for content not design
- Abbreviations done right: The <abbr> element and why not use it
- The three semantics of HTML
- For the Love of <details>
- The HTML Elements Time Forgot
- Styling by Language: Using the lang Attribute for Multilingual Design
- The many lives of the page title
- Semantics beyond the tag name
- Forms are a badly designed part of HTML
- Don't leave the screen reader hungry
- Giving pages a clear shape by using headings
- Them’s the Breaks
- The Wonderful World of Web Feeds
- Hell is other people's markup
- A11y Considerations in Math on the Web
- How HTML changes in ePub
- a11y freedom beaver
- Discover Dialog
- What's wrong with this HTML, and is it valid?
- Controlling dialogs and popovers with the Invoker Commands API
- Accessible by Design: The Role of the 'lang' Attribute
- IDREFs: What they are and how to use them
- Referencing HTML elements inside Shadow DOM
- Speculation rules improvements
- Using the Ancient Evils for Debugging
- Top layer troubles: popover vs. dialog
- Details and tips on how to fix the diabolic code of #35.
2024 31
- datalists are more powerful than you think
- Boost website speed with prefetching and the Speculation Rules API
- Misleading Icons: Icon-Only-Buttons and Their Impact on Screen Readers
- The underrated <dl> element
- Preloading fonts for web performance with link rel="preload"
- The search input: They almost got it right
- The devil is in the <details>
- PSA: Stop using the title attribute as tooltip!
- Grouping form fields
- My favourite colour is Chuck Norris red
- Getting Oriented with HTML Video
- Microdata for books
- How I gained a new perspective on ARIA
- You don’t need the isOpen class
- The Gift You Do NOT Want: A Div in a Button's Clothing
- Page by Page: How Pagination Makes the Web Accessible
- Improving User Experience for Multilingual Web Browsing
- HTML and CSS I didn't even know about before I started creating content in Japanese
- Makeshift hot reload
- Submit to the Quirks of HTML
- Native HTML light and dark color scheme switching
- Past HTML, Future HTML?
- Almost, but not quite, entirely unlike...
- aria-labelledby = self
- Forced Colors Mode Futility
- Control the Viewport Resize Behavior on mobile with `interactive-widget`
- Smooth Multi-Page Experiences with Just a Few Lines of CSS
- Starting off right: Where autofocus shines
- A link on a logo in the header, what should the alt-text be?
- #34 a button is not a link
- #33 make me one (input) with everything
2023 24
- Never underestimate HTML
- The devil is in the details: a look into a disclosure widget markup
- ARIA Live Regions
- The Implied Web
- Design pattern for custom tooltips
- Boosting testing efficiency: how semantic HTML transforms End-to-End testing
- The road to HTMHell is paved with semantics
- Revisiting Fundamentals - Semantic lists for Improved Accessibility
- Swallowing camels
- The Ghosts of Markup Past
- Getting started with Web Performance 🚀
- HTML: The Bad Parts
- Test-driven HTML and accessibility
- The hidden attribute in HTML
- Template for accessibility guidelines
- What the slot?
- The hidden depths of the input element
- Security Headers using <meta>
- Web Components FTW!
- The Hellish History of HTML: An incomplete and personal account
- Back to Basics: 5 HTML attributes for improved accessibility and user experience
- The Form Attribute - Enhancing Form Layout Flexibility
- You don't need JavaScript for that
- The UX of HTML
2022 27
- Preventing form submission with zero Javascript
- Enforcing better HTML markup with Eleventy
- What is the Difference Between Alternative Text, Long Description, and Caption?
- A Theory of Web Relativity
- Common nesting issues in HTML
- Do you know color-scheme?
- Mini-guide to add an image
- Modern HTML as a foundation for progressive enhancement
- 5 HTML elements, And a partridge in a despair tree
- Get that marquee ✨AeStHeTiC✨
- Table Like It's 2023
- One day we'll have a fully customisable select
- DOM Clobbering
- There can be only one: Options for building “choose one” fields
- Dear developer, your assumptions are wrong
- You don't need HTML!
- Improving SEO without knowing where to start
- Meaningful labels using ARIA – or not.
- Adding Complementary Performance Data to Your Site
- Reading the meter
- Landmarks and where to put them
- Using SRI to protect from malicious JavaScript
- You Don't Need ARIA For That
- How to transfigure wireframes into HTML
- #32 almost a proper close button
- #31 additional “assistance”
- #30 Bullet “list”
2021 5
2020 12
- #24 A placeholder is not a label
- #23 A card pattern
- #22 the good ol’ div link
- #21 Legendary legend!
- #20 HTMHell special: close buttons
- #19 heading in the wrong direction
- #18 main divigation
- #17 inaccessible cards
- #16 alt, no wait…, aria-label, no wait…, alt
- #15 letter by letter
- #14 not my type
- #13 link or label
2019 12
- #12 accessible poll yes/no
- #11 The trigram for heaven
- #10 <section> is no replacement for <div>
- #9 Cookie Consent from Hell
- #8 anchor tag used as button
- #7 multiple duplicate ids and table layout
- #6 link with void operator as href value
- #5 button-like-link
- #4 link-also-button
- #3 image-buttons
- #2 div with button role
- #1 button disguised as a link