Loading video...

Video Failed to Load

Go Home

I think I figured out how to create responsive type scales with composable CSS utilities, thet lets you scale linearly between exact pixel values (this is important if you want to align exactly with a type scale, rather than just scale type on a case-by-case basis) 🧵

20,956 views • 2 years ago •via X (Twitter)

10 Comments

Tobias Ahlin's profile picture
Tobias Ahlin2 years ago

I've summarized the technique at length here but here's a quick breakdown of the problem and solution. I've always assumed that this has been impossible to pull off, since you currently can't divide a pixel value with another pixel value using CSS calc()

Tobias Ahlin's profile picture
Tobias Ahlin2 years ago

This calc() restriction is going to be relaxed in the css-values-4 spec ( but for the time being, that's the restriction we're dealing with. How do we then divide, for example, the current viewport width with the maximum viewport width, to know how far...

Tobias Ahlin's profile picture
Tobias Ahlin2 years ago

we are between two viewport sizes, so that we can scale a font size accordingly? Since we currently can't convert pixel numbers to unit-less numbers, we have to go the other direction → convert unit-less numbers to pixels. We can define all of our variables without units:

Tobias Ahlin's profile picture
Tobias Ahlin2 years ago

…and then convert them to pixel values by multiplying them with 1px when we need them as pixel values. We can then "unlock" the calculation that at first hand can seem impossible to perform with the current restrictions:

Tobias Ahlin's profile picture
Tobias Ahlin2 years ago

Then we can set new variable values with utility classes, to create composable type scales:

Tobias Ahlin's profile picture
Tobias Ahlin2 years ago

The demo in the first tweet is then created by combining these classes:

Tobias Ahlin's profile picture
Tobias Ahlin2 years ago

Again, all the details are here: significant limitation of this technique right now is that we can't use rems (this only works with pixels), but that should be resolved with the relaxed CSS calc() specs 👀

XH's profile picture
XH2 years ago

Just an FYI, in case you run into this edge case on Safari text reflow (gave me a lot of headache)

Tobias Ahlin's profile picture
Tobias Ahlin2 years ago

Oh dear, that’s why!

Igor bedesqui's profile picture
Igor bedesqui2 years ago

omg this is AMAZING

Related Videos