Modern CSS - Container Queries are almost here!
I am giving a talk at the INNOQ Technology Night (in German) about modern CSS and container queries. The talk is audio-only, but I wanted to provide this page as a reference for those who want to follow along during my talk or for those who want to look up the links after the fact.
The CSS isn’t easy comic by Julia Evans really encapsulates my feeling about CSS:
CSS may seem easy, but layout is a really difficult problem. Modern CSS has evolved to the point where it can very eloquently solve this problem – and it’s getting better all the time.
For those who want a deeper look at the intricacies which are involved in website layout, I recommend this in-depth look at how page layout is implemented in browsers from the Web Browser Engineering book.
When web development began, CSS didn’t provide any mechanisms for implementing layout. This is why web developers ended up misusing tables and floats to do layout. Over the years, we’ve gotten Flexbox and CSS Grid – changes that were always backwards compatible and drastically improved what we as developers can do.
CSS Containment
The CSS Containment spec has also been added to modern browsers. With CSS containment, we can give the browser more contextual information about our webpage:
contain: layout
- tells the browser that everything inside the element does not affect anything else on the pagecontain: size
- tells the browser that the size of the children cannot affect the size of the element itselfcontain: paint
- tells the browser that all of the visible content will be printed inside of the element’s box – anything outside of the box will be clipped
Container Queries
Because of the progress made with CSS containment, we now have the tools to implement container queries in a way that doesn’t totally kill performance. Here is the Container Queries spec proposed by Miriam Suzanne. An implementation of this spec is now available behind a flag in the Canary Release of the Chome browser.
These excellent tutorials give a good overview of what we can currently do with container queries, as well as providing some rationale for why we need them and examples of how to use them:
- CSS Container Queries is a write up on MDN by Rachel Andrew
- Container Queries are actually coming by Andy Bell
- Say Hello to CSS Container Queries by Ahmad Shadeed
TL;DR
We will be able to activate CSS containment for a specific area in our markup:
main {
contain: layout inline-size;
}
And then we can declaratively write CSS which will only activate when our component has enough space.
.component { /* Base CSS for component */ }
@container (min-width: 25rem) {
.component {
/* Styles when the component has more space */
}
}
An important key to this puzzle is progressive enhancement. We can create a minimal viable experience for all modern browsers, and then add container queries as an optional feature – older browsers will ignore them because they don’t understand them yet, but if our minimal viable experience is good enough, users won’t even realize that they don’t have the optimal experience
Other Links
If you are interested in this topic, consider checking out my other resources:
- Responsible Web Apps: My site which discusses how to create websites which are responsive and accessible out-of-the-box
- Case Podcast with Rachel Andrew: I had the privilege of interviewing Rachel Andrew and discussed – among other things – how much we all want container queries
- INNOQ Podcast: Intrinsic Design (German): A podcast where I talk about responsive design and its successor: intrinsic design
- INNOQ Podcast: Responsible Web Apps (German): A podcast where I talk about responsible web applications (covering a lot of content from the responsibleweb.app website)