Chris’ Corner: Real World CSS
I enjoyed Lee Robinson’s take on How I’m Writing CSS in 2024. Rather than jump right into tools and syntax, it starts with the user:
What does a great experience look like loading stylesheets when visiting a website?
- Stylesheets should load as fast as possible (small file sizes)
- Stylesheets should not re-download unless changed (proper caching headers)
- The page content should have minimal or no layout shift
- Fonts should load as fast as possible and minimize layout shift
Agreed! Number 3, and to some degree 4, are almost more in the JavaScript bucket than CSS, but it’s a good starter list. I’d add “The page styles shouldn’t interfere with default accessibility”.
Then, after those, the developer experience is considered:
How can the DX of the styling tools we use help us create a better UX?
- Prune unused styles, minify, and compress CSS for smaller file sizes
- Generate hashed file names to enable safe, immutable caching
- Bundle CSS files together to make fewer network requests
- Prevent naming collisions to avoid visual regressions
What about to help us write more maintainable, enjoyable CSS?
- Easy to delete styles when deleting corresponding UI code
- Easy to adhere to a design system or set of themes
- Editor feedback with TypeScript support, autocompletion, and linting
- Receive tooling feedback in-editor to prevent errors (type checking, linting)
I like how the DX concerns are about making things easier that the UX demands. I want all that stuff! Although I admit I still bristle at the idea of dealing with unused styles. It’s very hard to properly detect unused styles and I worry about tools making those decisions.
Lee’s ultimate recommendations are CSS Modules, Tailwind, or StyleX (or just vanilla CSS on simple stuff), and I feel like those feel fair based on his own journey and accomplish the things he laid out. I’m a fan of the CSS Modules approach myself. It’s largely vanilla CSS, but with great scoping built in, it couples to components nicely, and is so well established it’s everywhere you need it.
Speaking of writing CSS in the real world, Ahmad Shadeed did quite a deep dive of looking at the TechCrunch Layout and approaching it with modern techniques.
Sure, it’s just a three column layout, but the different columns have all sorts of different constraints. The first is in a fixed position, the main content has a maximum width but is otherwise fluid as well as contains nested grids. There is a maximum width overall too, with the third column involving absolute positioning. That’s without getting into the (five!) major breakpoints and footer complexities. If you’re into nerding out on CSS layout, Ahmad tackles it literally five different ways, ultimately landing on a nice CSS grid powered technique. He called it easy to implement, but looking at the column declarations I think it only looks easy to someone who was on his fifth iteration. 🤣. And that’s only half the article.
To think that Ahmad’s tackling of a complex layout, in the end, only boiled down to a few lines of CSS is rather incredible. CSS is certainly more powerful. But is it easier? Geoff Graham thinks yeah, it is a little easier to write actually, in some ways.
To name a few, grouping styles is easier, centering is easier, translation needs are easier, and spacing is easier. Geoff names more. And by easier, really truly easier in all ways. Less and more direct code that is easier to reason about and does what it says.
Roman Komarov outlines The Shrinkwrap Problem, which is maybe a little niche but certainly a very interesting layout situation. The deal is that if content wraps, the element essentially takes up all available width. Not that strange, but when you look at how a wrapped title looks with text-wrap: balance;
, for example, it looks a little weird. A header might only take up half the space visually, yet still take up all the available space.
Roman goes really deep on this, with solutions that involve even new tech like anchor positioning which is an awfully weird thing to invoke just for this, but hey, needs are needs. Just when you think this is all far too much for such a niche thing, Roman gets to the use-cases which are actually pretty basic and straightforward. Things like chat bubbles where full-width bubbles would look awkward. Or decorations on either side of a header.
David Bushell has a fun and illuminating post about button-specific CSS styles.
Have you ever repeatedly tapped on a button only for the page to zoom in unexpectedly? Rewind and fast-forward buttons in an audio player for example. This unwanted side effect can be removed with
touch-action
.
There are four others in there that are all in the decent-chance-you-hadn’t-thought-of-it category.