Width or Flex-Basis?
2018-11-28
Creating rows and columns of elements that adapt dynamically can be a little tricky depending on the desired outcome. Let's breakdown how to solve this issue using both inline-block
paired with width
and flex-basis
.
Width
Setting the width of the inner children to a divisible value and setting their display to inline-block
, we are able to create self-wrapping elements:
.width-container {
display: block;
}
.width-container__item {
display: inline-block;
width: calc(33% - 3px); /* Fix for wonky inline-block margins */
}
Pros
- Full browser support (as far back as IE6)
- No floats needed
Cons
- Buggy
margin
workaround needed - Wrapped elements cannot dynamically fill remaining empty parent space
Flex-basis
This is my personal preference for dynamically wrapping inner children elements. Simply set the parent as display: flex
, allow flex-wrapping and then set the flex-basis
of the children to any percentage value.
.flex-container {
display: flex;
flex-wrap: wrap;
}
.flex-container__item {
flex: 1 1 auto;
flex-basis: 33%;
}
You will also notice the flex
property set to 1 1 auto
. This is important if you require your wrapped elements to fill the remaining space of the parent container.
Pros
- No buggy margins to play with
- Dynamically renders children to fill parent container if
flex
is set - Scales well across screen / device sizes
Cons
- Some versions of IE struggle with browser support
CodePen Demo
Feel free to play around with a slightly more stylized version of both options below: