CSS History & Evolution
Understanding where CSS came from puts today's features in context and explains why some things work the way they do — including some of the quirks and limitations you'll encounter. The history of CSS is really the history of the web itself trying to grow up.
The pre-CSS era (before 1996)
In the early 1990s, the web had no CSS. HTML was intended to be purely structural — <h1> meant "this is a top-level heading", not "make this big and bold". But as the web grew, people wanted to make pages look good. Without a styling language, browsers started adding presentational HTML tags: <font> to change typeface and colour, <center> to centre content, <b> for bold, <i> for italic. Web pages became littered with markup like <font color="red" size="3" face="Arial">, which had to be repeated on every paragraph. It was messy, repetitive, and impossible to maintain.
<!-- What developers had to write in 1994 — messy presentational HTML --> <font color="#FF0000" size="5" face="Times New Roman"> <b>Welcome to my page!</b> </font> <br> <font color="#000000" size="3" face="Arial"> This paragraph has completely separate font tags. </font>
CSS1 (1996) — the foundation
In 1994, Norwegian computer scientist Håkon Wium Lie (then working at CERN) published the first proposal for a style sheet language for the web. Bert Bos, who was working on a browser project, collaborated with him, and together they presented the idea to the W3C (World Wide Web Consortium). After two years of debate and refinement, CSS Level 1 became a W3C recommendation in December 1996.
CSS1 introduced the fundamental model that still exists today: selectors, properties, values, the cascade, and inheritance. It defined properties for colours, fonts, margins, padding, and basic positioning. It was a huge step forward — but browser adoption was patchy. Internet Explorer 3 and Netscape 4 both implemented CSS, but inconsistently and with bugs. Developers spent years writing workarounds for browser differences.
CSS2 & the browser wars (1998–2002)
CSS Level 2 was released in 1998, adding positioning (absolute, fixed), z-index, media types (print vs screen), and more powerful selectors. But the real story of this era was the browser war between Internet Explorer and Netscape. Both browsers implemented CSS differently, invented non-standard features, and the resulting inconsistencies made web development genuinely painful.
The period from roughly 2000–2008 was the dark ages of CSS. Internet Explorer 6 — which dominated the market for years — had notorious bugs like the double margin float bug, the IE box model bug (where border and padding were included in width rather than added to it), and missing support for features like :hover on anything other than links. Developers wrote elaborate CSS hacks, conditional comments, and browser-detection scripts just to get layouts to look the same in every browser.
CSS2.1 & the standards movement (2002–2011)
CSS2.1 was not a new version so much as a corrected and clarified version of CSS2, published in 2011 after years of work. But the more important development of this era was the Web Standards Project — a group of developers who campaigned loudly for browsers to implement CSS properly. Firefox emerged as a standards-compliant alternative to IE, and the pressure on Microsoft eventually paid off. By 2008 IE7 and IE8 had dramatically improved CSS support.
CSS3 & the module era (2009–present)
The W3C learned a lesson from CSS2: releasing a monolithic specification that took 10 years to finalize was too slow. CSS Level 3 split into independent modules — Selectors, Backgrounds, Borders, Color, Flexbox, Grid, Animations, and so on — each with its own specification that could be developed and shipped independently. This is why you'll hear phrases like "the Flexbox module" or "the Grid specification".
This modular approach accelerated the pace dramatically. The period from 2009 to today has seen an explosion of powerful CSS features:
Year (approx) | Major feature landed |
|---|---|
2009–2012 | CSS Transitions, Animations, Gradients, border-radius, box-shadow, text-shadow |
2012–2015 | Flexbox (final spec), CSS Variables (Custom Properties), Transforms |
2017 | CSS Grid (shipped simultaneously in Chrome, Firefox, Safari) |
2018–2020 | CSS custom properties widespread, Grid improvements, logical properties |
2021–2022 | Container Queries, |
2023–2024 | CSS Nesting, Scroll-Driven Animations, View Transitions, |
Why this history matters
A few things you'll understand better with this context:
floatwas never meant for layout. It was designed to let text wrap around images. Developers used it for full-page layouts for over a decade because there was nothing better. Flexbox and Grid were the answer the web was waiting for.box-sizing: border-boxis a fix for a historical bug. The defaultcontent-boxmodel is the W3C standard, butborder-boxis what most developers prefer today.Vendor prefixes (
-webkit-,-moz-,-ms-) exist because browsers shipped experimental features before the spec was finalized. Many are now obsolete.The Interop project (previously "Compat 2021") is a collaboration between browser vendors to fix the cross-browser inconsistencies that still linger today.
CSS evolves much faster now — features that would have taken a decade are shipping in 1–2 years across all major browsers.