- We use
flexbox
for our layout. - We want to add horizontal and vertical gutters inbetween these items.
- Items wrap according to contents (
flex-wrap: wrap
), therefore we can't decide when/where to apply gutters using breakpoints.
In the future this will be possible using the {row,column}-gap
(longhand) and gap
(shorthand) properties. However this is not currently well supported.
A discussion of this problem can be seen at https://stackoverflow.com/questions/20626685/better-way-to-set-distance-between-flexbox-items and http://www.heydonworks.com/article/flexbox-grid-finesse#gutter-tactics.
The most common solution involves padding on the items and negative margins on the container, to offset any extraneous padding.
https://jsfiddle.net/OliverJAsh2/qm7tbvso/1/
Note that the choice of margin
and padding
, and the direction in which these are applied, is significant.
If we used margins for our gutter items instead of padding:
- margin collapsing would break gutters when nesting gutter containers, e.g. https://jsfiddle.net/OliverJAsh2/Lwxyt07p/6/
- any width specified on the gutter item would not be inclusive of the gutter, e.g. https://jsfiddle.net/OliverJAsh2/p8e50c6m/1/
If we specified vertical gutters using top
instead of bottom
, previous content may be inaccessible due to overlap: https://jsfiddle.net/OliverJAsh2/xqm5h17r/6/.
- Surrounding
overflow: auto
always shows scroll bar https://jsfiddle.net/OliverJAsh2/f7r89gpy/1/
I came across this gist on caniuse.com after I was looking for a way to conditionally add support for flex gap. The biggest issue I'm predicting is what happens when support is available for flex gap, but we have no way to check for it? If we use any of the workarounds and support flex gap at the same time both with will be applied without a way to conditionally check for support.
I created a PostCSS flex gap polyfill which surprisingly does a lot without affecting much of the authoring process. There are a few limitations but with someone with more JavaScript knowledge than me, we may be able to implement some fixes to overcome these limitations.
It doesn't use any surplus wrapper divs and the author doesn't need to do anything special for it to work. However, I need to find a way to not apply it when flex gap is supported.
https://github.com/limitlessloop/flex-gap-polyfill
I would very much welcome your thoughts, ideas possible alternates to provide a more reliable solution to this. At the moment it's quite advanced and it will allow to even use nested containers with gaps applied, however to make it more production-ready I might be able to offer an option to enable/disable this.