or, the "and you thought JS was bad" part.
ie6, or, âhow i think kids have it too easy these daysâ. (source unknown :-/)
oklchif youâre absolutely new to CSS, start here at the Mozilla Developer Network (or MDN). theyâre the people that make Firefox and have the best reference guides for CSS. in general though this guide assumes youâve got a base understanding of CSS so go forth and mess around with the language as much as you can before moving on to the rest of the more complicated stuff.
an easy way to get started is by checking out some of these tools that let you play around with the language:
thereâs been a lot of standards around color, beginning with rgb and including other fancier things like hsl. the new âkingâ of color definition is oklch.
this guide is about writing an application not a regular webpage. to that end, you shouldnât be using regular CSS with <style> tags anymore â as your application grows and more contributors add to it, you will drown in a sea of madness and salty tears. yes, your mother taught you to wash behind your ears, brush your teeth, and never, EVER use inline styles in your HTML. but those days are over and a new era has come.
the truth is that this space is still rapidly in development and the dust isnât quite settled yet. i think there are compelling arguments for both CSS-in-JS and CSS Modules. youâll probably fine going with either these days.
finally, there's also truth in this: whatever you pick may never be enough
CSS Modules are a great way to get a lot of the benefits of CSS-in-JS without leaving the CSS world altogether. hereâs a helpful primer on getting started.
CSS-in-JS forgoes CSS files altogether and says we should have our styling where our components are. think about it this way. when youâre sharing HTML these days, we tend to do so via HTML-in-JS. in other words, one can create React components and publish them to the general web to share to fellow developers. similarly, one could argue, the best way to share CSS is to package them inside of something standard like JS.
great reads on the topic
package options
again, thereâs so much action going on in this space that itâs still to be decided what paradigm will win here. for now though, my tentative recommendation is emotion.
this is an opinionated guide, remember? everything in my soul tells me to keep Tailwind away with a 10-foot pole. it's vendor lock-in embodied in a library, it has its own bespoke version of CSS that you have to learn, it becomes a garbled, cluttered mess within your HTML/JSX, ugh, ugh, ugh!
yes, it's very conveniently "spoken" by LLMs but trying to maintain it is untenable. Tailwind just ends up being a bloody mess once the codebase has any amount of real complexity or the number of collaborators grows. we webdevs went through this experience with CoffeeScript before. yes, it was elegant, neat, enticing â and, in the end, we needed to rewrite it all to stay relevant.
relevant reading:
there are so. many. libraries. coming out that are built on Tailwind, and, yeah, they look a peach. but ugh, mark my words, in 10 years, this madness will (hopefully) be behind us, leaving us to cleanup the strangling kudzu-like vines of unmaintainable code for decades to come.
related to the previous section on JS, iâll mention again here the technologies included by default related to CSS for you to use out of the box.
browserslist field in package.json. (historical note: postcss-preset-env was previously known as âcssnextâ)*.module.css to take advantage.node-sass package.)sanitize.css is a CSS Reset that helps normalize things across browsers, a lesser problem these days but still important. Chris Coyier's "reset": an opinionated take on a reset.
CSS Modules
when you can, itâs suggested to use CSS Modules which provide great scoping for your CSS to a particular JS module. first, name your CSS file [name].module.css and then you can use it in your JS module as such (take note of the composes keyword and what itâs doing):
// Button.module.css.className {color: green;background: red;}.otherClassName {composes: className;color: yellow;}
// Button.jsimport React, { Component } from 'react';import styles from './Button.module.css'; // Import css modules stylesheet as stylesimport './another-stylesheet.css'; // Import regular stylesheetclass Button extends Component {render() {// reference as a js objectreturn <button className={styles.otherClassName}>Button</button>;}}
given the recommendation for CSS Modules/CSS-in-JS i might steer you away from CSS preprocessors (which would add yet another layer top of an already complex stack of technologies). but, if thatâs your thing, then take a look at Sass.
the advantages Sass can give you are things like:
(historical note: other packages in the space are things like Less but the community isnât as strong there and the support from other vendors isnât as robust.)
thereâs a bunch of CSS features constantly in the making. i had this section listing things from 2018 that were exciting and the neat thing is that the CSS development flywheel has only continued to produce great stuff!