Recently I have finished the Flexbox zombies game. The way the author forces you to deliberately practice a skill is great.
Flexbox zombies is an online course that teaches you the display: flex
css property. It presents quite a boring topic—placing items on a screen—in a very atractive way.
Even if you think you know css flexbox I would still recommend it, because it is interesting how it is presented directly inside a browser and everything is interactive. And you will probably find out you don’t know everything. I have found a couple of new facts and following are some notes about it.
Start with display: flex
The number of times one have to write display: flex
in the course is overwhelming, but at the end, it was worth it. As the author said—it is about deliberate practice.
Lets define a class with display: flex
and a couple of other properties.
.flex-container {
display: flex;
width: 300px;
height: 100px;
background: rebeccapurple;
}
.flex-item {
color: white;
background: darkcyan;
}
Flexible width
Width is flexible—who would guess?
<style>
.my-box {
width: 200px;
min-width: 150px;
max-width: 250px;
flex-basis: 225px;
}
.item-1 {
flex-shrink: 1;
}
.item-2 {
flex-grow: 1;
}
</style>
<div class="flex-container">
<div class="flex-item">Fits the content</div>
</div>
<div class="flex-container">
<div class="flex-item my-box">Flex-basis wide</div>
</div>
<div class="flex-container">
<div class="flex-item my-box item-1">No need to shrink</div>
</div>
<div class="flex-container">
<div class="flex-item my-box item-2">Grow stops at 250px</div>
</div>
<style>
.my-box {
width: 200px;
min-width: 150px;
max-width: 250px;
flex-basis: 225px;
}
.item-1 {
flex-shrink: 1;
}
.item-2 {
flex-grow: 1;
}
</style>
<div class="flex-container">
<div class="flex-item">Fits the content</div>
</div>
<div class="flex-container">
<div class="flex-item my-box">Flex-basis wide</div>
</div>
<div class="flex-container">
<div class="flex-item my-box item-1">No need to shrink</div>
</div>
<div class="flex-container">
<div class="flex-item my-box item-2">Grow stops at 250px</div>
</div>
Flex shorthand
Shorthand property flex
combines flex-grow
, flex-shrink
and flex-basis
. When you omit the last one, flex-basis
became 0
instead of auto
.
<style>
.flex-basis-auto {
flex-basis: initial;
}
.flex-basis-zero {
flex: 0 0;
}
</style>
<div class="flex-container">
<div class="flex-item flex-basis-auto">Flex-basis auto</div>
</div>
<div class="flex-container">
<div class="flex-item flex-basis-zero">Flex-basis 0</div>
</div>
<style>
.flex-basis-auto {
flex-basis: initial;
}
.flex-basis-zero {
flex: 0 0;
}
</style>
<div class="flex-container">
<div class="flex-item flex-basis-auto">Flex-basis auto</div>
</div>
<div class="flex-container">
<div class="flex-item flex-basis-zero">Flex-basis 0</div>
</div>
Align content
In the following example the align-content
property pushes all the items to the vertical center of the container while align-items
to the center of their lines.
<style>
.content-aligned {
flex-wrap: wrap;
align-content: center;
}
.items-aligned {
flex-wrap: wrap;
align-items: center;
}
.content-aligned > *,
.items-aligned > * {
flex-basis: 140px;
text-align: center;
}
</style>
<div class="flex-container content-aligned">
<div class="flex-item" style="background: darkcyan">Item 1</div>
<div class="flex-item" style="background: darkgreen">Item 2</div>
<div class="flex-item" style="background: cadetblue">Item 3</div>
</div>
<br />
<div class="flex-container items-aligned" style="background: purple">
<div class="flex-item" style="background: darkcyan">Item 1</div>
<div class="flex-item" style="background: darkgreen">Item 2</div>
<div class="flex-item" style="background: cadetblue">Item 3</div>
</div>
<style>
.content-aligned {
flex-wrap: wrap;
align-content: center;
}
.items-aligned {
flex-wrap: wrap;
align-items: center;
}
.content-aligned > *,
.items-aligned > * {
flex-basis: 140px;
text-align: center;
}
</style>
<div class="flex-container content-aligned">
<div class="flex-item" style="background: darkcyan">Item 1</div>
<div class="flex-item" style="background: darkgreen">Item 2</div>
<div class="flex-item" style="background: cadetblue">Item 3</div>
</div>
<br />
<div class="flex-container items-aligned" style="background: purple">
<div class="flex-item" style="background: darkcyan">Item 1</div>
<div class="flex-item" style="background: darkgreen">Item 2</div>
<div class="flex-item" style="background: cadetblue">Item 3</div>
</div>
New properties
There are new properties available in some browsers that are not mentioned in the Flexbox zombies course.
One is gap
:
<style>
.flex-with-gap {
gap: 20px;
}
</style>
<div class="flex-container flex-with-gap">
<div class="flex-item">Item 1</div>
<div class="flex-item">Item 2</div>
<div class="flex-item">Item 3</div>
</div>
<style>
.flex-with-gap {
gap: 20px;
}
</style>
<div class="flex-container flex-with-gap">
<div class="flex-item">Item 1</div>
<div class="flex-item">Item 2</div>
<div class="flex-item">Item 3</div>
</div>
Another one is place-content
a shorthand for justify-content
and align-content
:
<style>
.flex-centered {
flex-wrap: wrap;
place-content: center;
}
.flex-centered > * {
width: 120px;
}
</style>
<div class="flex-container flex-centered">
<div class="flex-item">Item 1</div>
<div class="flex-item">Item 2</div>
<div class="flex-item">Item 3</div>
</div>
<style>
.flex-centered {
flex-wrap: wrap;
place-content: center;
}
.flex-centered > * {
width: 120px;
}
</style>
<div class="flex-container flex-centered">
<div class="flex-item">Item 1</div>
<div class="flex-item">Item 2</div>
<div class="flex-item">Item 3</div>
</div>
Conclusion
The Flexbox zombies is a great course and great game at the same time. That’s rare!
I don’t remember if the course mentioned a very useful value of justify-content
: space-evenly
. Other than that it is very thorough. I highly recommend this style of learning!