CSS Wizardry Blog Archives
This is the full archive of everything I’ve published here: 244 articles on web performance, site-speed, Core Web Vitals, caching, browser behaviour, and the occasional older CSS piece.
If you’d rather start somewhere less chronological, try Improving Perceived Performance with Multiple Background Images () at random.
2026
-
Front-End’s Missing Metric: The TBT Window -
Meet Your Users Where They Are with Obs.js -
Better Browser Caching with No-Vary-Search -
font-family Doesn’t Fall Back the Way You Think -
What Is CSS Containment and How Can I Use It? -
When All You Can Do Is All or Nothing, Do Nothing
2025
-
Obs.js: Context-Aware Web Performance for Everyone -
Low- and Mid-Tier Mobile for the Real World (2025) -
The Fastest Site in the Tour de France -
Making Sense of the Performance Extensibility API -
Why Do We Have a Cache-Control Request Header? -
HTML Is Not a Programming Language… -
Build for the Web, Build on the Web, Build with the Web
2024
-
Licensing Code on CSS Wizardry -
A Layered Approach to Speculation Rules -
Designing (and Evolving) a New Web Performance Score -
Core Web Vitals Colours -
The Ultimate Contract Templates for Tech Consultants: Protect Your Business and Get Paid -
Optimising for High Latency Environments -
Cache Grab: How Much Are You Leaving on the Table? -
blocking=render: Why would you do that?!
2023
-
Correctly Configure (Pre) Connections -
The Three Cs: 🤝 Concatenate, 🗜️ Compress, 🗳️ Cache -
What Is the Maximum max-age? -
How to Clear Cache and Cookies on a Customer’s Device -
The Ultimate Low-Quality Image Placeholder Technique -
Core Web Vitals for Search Engine Optimisation: What Do We Need to Know? -
The HTTP/1-liness of HTTP/2 -
In Defence of DOMContentLoaded -
Site-Speed Topography Remapped -
Why Not document.write()?
2022
-
Speeding Up Async Snippets -
Critical CSS? Not So Fast! -
Measure What You Impact, Not What You Influence -
Optimising Largest Contentful Paint
2021
2020
-
Site-Speed Topography -
Speed Up Google Fonts -
Real-World Effectiveness of Brotli -
Performance Budgets, Pragmatically
2019
-
Lazy Pre-Browsing with Prefetch -
Making Cloud.typography Fast(er) -
Time to First Byte: What It Is and How to Improve It -
Self-Host Your Static Assets -
Tips for Technical Interviews -
Cache-Control for Civilians -
Bandwidth or Latency: When to Optimise for Which
2018
-
ITCSS × Skillshare -
What If? -
CSS and Network Performance -
The Three Types of Performance Testing -
Getting to Know a Legacy Codebase -
Image Inconsistencies: How and When Browsers Download Images -
Identifying, Auditing, and Discussing Third Parties -
My Digital Music Setup -
Measuring the Hard-to-Measure -
Finding Dead CSS
2017
-
The Fallacies of Distributed Computing (Applied to Front-End Performance) -
Ten Years Old -
Relative Requirements -
Airplanes and Ashtrays -
Performance and Resilience: Stress-Testing Third Parties -
Refactoring Tunnels -
Little Things I Like to Do with Git -
Writing Tidy Code -
Configuring Git and Vim -
Base64 Encoding & Performance, Part 2: Gathering Data -
Base64 Encoding & Performance, Part 1: What’s Up with Base64? -
Code Smells in CSS Revisited -
Typography for Developers -
Moving CSS Wizardry onto HTTPS and HTTP/2 -
Ack for CSS Developers -
A New Year, a New Focus -
Preparing Vim for Apple’s Touch Bar -
Choosing the Correct Average
2016
-
CSS Shorthand Syntax Considered an Anti-Pattern -
CSS Wizardry Newsletter -
Nesting Your BEM? -
Improving Perceived Performance with Multiple Background Images -
Continue Normalising Your CSS -
Pure CSS Content Filter -
Pragmatic, Practical, and Progressive Theming with Custom Properties -
Refactoring CSS: The Three I’s -
Speaker’s Checklist: Before and After Your Talk -
Improving Your CSS with Parker -
The Importance of !important: Forcing Immutability in CSS -
Mixins Better for Performance -
Managing Typography on Large Apps
2015
-
White October Events Workshop Partnership -
BEMIT: Taking the BEM Naming Convention a Step Further -
Travelling Like You Want to, When You Have To -
Contextual Styling: UI Components, Nesting, and Implementation Detail -
Subtleties with Self-Chained Classes -
Cyclomatic Complexity: Logic in CSS -
Immutable CSS -
Can CSS Be Too Modular? -
More Transparent UI Code with Namespaces
2014
-
When to use @extend; when to use a mixin -
The Specificity Graph -
CSS Wizardry Ltd.: Year 1 in review -
CSS Guidelines 2.0.0 -
Advice to budding front-end developers -
CSS Wizardry referral scheme -
Hacks for dealing with specificity -
Vim for People Who Think Things Like Vim Are Weird and Hard -
Grouping related classes in your markup -
My Trello workflow -
Naming UI components in OOCSS -
Use zero-width spaces to stop annoying Twitter users -
Extending silent classes in Sass
2013
-
Workshop: Event Handler, London, February 2014 -
I wrote (part of) a book! -
My setup -
The problems with ‘crafting’ code -
Taming data tables -
Workshop: Smashing Workshops, Zürich, December 2013 -
Code reviews as a service -
Workshop: Make Do, Leeds, November 2013 -
‘It’s because you’re polite.’ -
Let’s work together -
Make it count -
Speak The Web discount code -
Leeds hangout -
Writing DRYer vanilla CSS -
Hashed classes in CSS -
‘Scope’ in CSS -
The flag object -
shame.css – full .net interview -
shame.css -
.net award nominee -
Introducing csswizardry-grids -
Responsive grid systems; a solution? -
You know your context – on critical thinking and thinking for yourself -
MindBEMding – getting your head ’round BEM syntax -
Your logo is still an image… and so is mine! -
Front-end performance for web designers and front-end developers -
Discussion via Branch
2012
-
A new CSS Wizardry -
My Git workflow for inuit.css -
Code smells in CSS -
A classless class—on using more classes in your HTML -
Announcing pr.ofile.me -
inuit.css v4.0.0—OOCSS, Sass and more -
Canvas Conf, 2012 -
Tags in CSS files -
Shoot to kill; CSS selector intent -
Quasi-qualified CSS selectors -
The open/closed principle applied to CSS -
Single-direction margin declarations -
Keep your CSS selectors short -
Front-Trends 2012 -
The single responsibility principle applied to CSS -
My HTML/CSS coding style -
Comments on CSS Wizardry -
Hacker News rebuttal -
Pragmatic, practical font sizing in CSS -
Breaking Good Habits—The Digital Barn
2011
-
On HTML and CSS best practices -
Measuring and sizing UIs, 2011-style (and beyond) -
Create a notched current-state nav -
Build-along #1, reflection and reasoning -
CSS Wizardry build-along #1 -
Sam Penrose Design—process and write-up -
Fully fluid, responsive CSS carousel -
The CSS Wizardry build-along is go! -
Build-along (testing the water) -
Reset restarted -
The ‘island’ object -
The ‘nav’ abstraction -
Ordered and numbered lists; the differences -
Writing efficient CSS selectors -
Do designers need to code? -
When using IDs can be a pain in the class... -
Two titillating table tips -
Building better grid systems -
Good developers are illusionists -
Updated CV -
More logo markup tips -
Borders on responsive images -
.net magazine awards nominee -
Responsive images right now -
Fluid grid calculator -
Namespacing fragment identifiers -
What is inuit.css? -
Styling alt text on images -
Introducing igloos—inuit.css gets plugins -
DIBI 2011 -
Annotated <figure>s in HTML5 and CSS -
Font sizing with rem could be avoided -
jQuery placeholder plugin/polyfill -
On negative hovers -
Introducing inuit.css -
Ideas of March -
Coding up a semantic, lean timeline -
Link: Technical Web Typography: Guidelines and Techniques -
Problems with the sans-serif hack -
Mobile business card -
Creating a pure CSS dropdown menu -
Pure CSS(3) accordion -
CSS powered ribbons the clean way -
Create a centred horizontal navigation -
Link: Recreating the Luke's Beard social icons with CSS3 -
Using the <body> element as a wrapper -
HTML(5) and text-level semantics -
Client respect -
Maximising hit-area for usability -
HTML elements, tags and attributes -
A new year, a new CSS Wizardry II -
Scrolling overflowed content in iOS -
The real HTML5 boilerplate -
A new year, a new CSS Wizardry
2010
-
Mo’ robust paragraph indenting -
Media queries, handier than you think -
The implementation ∝ appreciation rule -
CSS: CamelCase Seriously Sucks! -
Improving CSS tooltips -
Design and education -
Mark up a semantic, accessible, progressively enhanced, mobile optimised progress bar (bonus: style the numbers in an ordered list!) -
I hate that I love Writer -
Unsung heroes -
Things are changing at CSS Wizardry -
Your logo is an image, not an <h1> -
Good developers vs. good salespeople -
Designing in the browser leads to better quality builds -
In response to ‘Invisible captcha to prevent form spam’ -
Keeping code clean with content -
A quick counter to 'The Digital Agencies of the Future!' -
Set then unset (or reset...?) -
Zebra-striping rows and columns -
Semantics and sensibility -
Building sites without using IDs or classes -
30 days without an iPhone -
Moving forward is holding us back -
A quick note on border radius -
Type tips—quick tips on all things web typography -
Multiple column lists using one <ul> -
Upside down domains—registering an international domain name -
CSS bar charts—styling data with CSS3 and progressive enhancement -
iPhone CSS—tips for building iPhone websites -
The three types of dash -
The importance of proper punctuation -
A reconsideration—in defence of <b> and <i> (or: people fear what they don’t understand) -
A suitable alternative—on proper use of alt attributes

