Body:Controlling cell growth and shrinkage
Another way of handling cell alignments is with grid cell stretch and shrink settings. By default, grid cells will both stretch and shrink as necessary but this can be overridden with the stretch, shrink, and resize settings. With the exception of grid--noStretch / $stretch: false, these generally do not feature legacy browser backups as they are features that are unique to flexbox. The grid is either all stretching or not stretching at all in IE8 and 9. In saying that, these are primarily just alternate ways of assigning flex-grow and flex-shrink properties.
In version 3 stretch was named grow. The name was changed to stretch in version 4 to align with the naming of CSS Grid's justify-items: stretch and justify-self: stretch properties.
Stretch classes
grid--noStretchwill prevent all cells in the grid from stretching.grid--stretchidentical togrid--align-stretch(stretches all grid cells).grid__cell--noStretchwill prevent only the cell that it is applied to from stretching.grid__cell--stretchwill allow a specific grid cell to stretch.
Shrink classes
grid--noShrinkwill prevent all cells in the grid from shrinking below theirmin-contentwidth.grid__cell--noShrinkwill prevent that specific cell from shrinking bellow it'smin-contentwidth.grid__cell--shrinkwill allow a specific grid cell to shrink.
Resize classes
grid--noResizea shortcut for applying bothgrid--noStretchandgrid--noShrinkclasses.grid__cell--noResizea shortcut for applying bothgrid__cell--noStretchandgrid__cell--noShrinkclasses.
$stretch: truewill allow all grid cells to stretch.$stretch: falsewill prevent all cells in the grid from stretching.$shrink: falsewill prevent all cells in the grid from shrinking below their content width.$resize: falsea shortcut for applying both$grow: falseand$shrink: falsesettings at the same time to all grid cells.- To apply resize settings to specific cells, just use the
flex-growandflex-shrinkcss properties.
This is the control example to show how the grid setup behaves with minimal settings. It has a block of content with a maximum width of 400px and a minimum width of 300px. It also has a small block holding only a single word.
<div class="grid grid--noWrap">
<div class="grid__cell -color-1">
<div class="wideBox -color-3" lang="zxx"></div>
</div>
<div class="grid__cell -color-2">
<div class="thinBox -color-4"></div>
</div>
</div>
<div class="mixin-39">
<div class="mixin__cell -color-1">
<div class="wideBox -color-3" lang="zxx"></div>
</div>
<div class="mixin__cell -color-2">
<div class="thinBox -color-4"></div>
</div>
</div>
.mixin-39 {
@include grid($wrap: false);
}
If grid--noStretch ($stretch: false) is applied, it is essentially the same as using grid--align-left ($align: left). In legacy mode, just like the align properties, turning stretching off also has the side effect of enabling wrapping. If you turn off wrapping explicitly using grid--noWrap or $wrap: false, modern browsers will stop wrapping however IE 8 and 9 will continue to wrap.
Adding grid--noStretch ($stretch: false) is essentially the same as using grid--align-left ($align: left).
<div class="grid grid--noWrap grid--noStretch">
<div class="grid__cell -color-1">
<div class="wideBox -color-3" lang="zxx"></div>
</div>
<div class="grid__cell -color-2">
<div class="thinBox -color-4"></div>
</div>
</div>
<div class="mixin-40">
<div class="mixin__cell -color-1">
<div class="wideBox -color-3" lang="zxx"></div>
</div>
<div class="mixin__cell -color-2">
<div class="thinBox -color-4"></div>
</div>
</div>
.mixin-40 {
@include grid($stretch: false, $wrap: false);
}
If grid__cell--stretch is applied, it will stretch only that grid cell. The mixin needs to be stretched manually with flex-grow: 1;.
<div class="grid grid--noWrap grid--noStretch">
<div class="grid__cell -color-1">
<div class="wideBox -color-3" lang="zxx"></div>
</div>
<div class="grid__cell -color-2 grid__cell--stretch">
<div class="thinBox -color-4"></div>
</div>
</div>
<div class="mixin-40">
<div class="mixin__cell -color-1">
<div class="wideBox -color-3" lang="zxx"></div>
</div>
<div class="mixin__cell -color-2 mixin__cell--stretch">
<div class="thinBox -color-4"></div>
</div>
</div>
.mixin-40 {
@include grid($stretch: false, $wrap: false);
}
.mixin__cell--stretch {
flex-grow: 1;
}
If grid--noShrink ($shrink: false) is applied, the grid cells will try their best not to shrink below the required width of the content inside them (you will need to resize your browser to a mobile sized view to see the difference)
<div class="grid grid--noWrap grid--noShrink">
<div class="grid__cell -color-1">
<div class="wideBox -color-3" lang="zxx"></div>
</div>
<div class="grid__cell -color-2">
<div class="thinBox -color-4"></div>
</div>
</div>
<div class="mixin-41">
<div class="mixin__cell -color-1">
<div class="wideBox -color-3" lang="zxx"></div>
</div>
<div class="mixin__cell -color-2">
<div class="thinBox -color-4"></div>
</div>
</div>
.mixin-41 {
@include grid($shrink: false, $wrap: false);
}
grid--noResize ($resize: false) is a shortcut for applying both grid--noShrink ($shrink: false) and grid--noStretch ($stretch: false) at the same time. This will turn on wrapping in legacy mode just like grid--noStretch will.
<div class="grid grid--noWrap grid--noResize">
<div class="grid__cell -color-1">
<div class="wideBox -color-3" lang="zxx"></div>
</div>
<div class="grid__cell -color-2">
<div class="thinBox -color-4"></div>
</div>
</div>
<div class="mixin-42">
<div class="mixin__cell -color-1">
<div class="wideBox -color-3" lang="zxx"></div>
</div>
<div class="mixin__cell -color-2">
<div class="thinBox -color-4"></div>
</div>
</div>
.mixin-42 {
@include grid($resize: false, $wrap: false);
}
Applying the grid__cell--noStretch class to only 1 of the grid cells (apply flex-grow: 0 manually if using the mixin system)
<div class="grid grid--noWrap">
<div class="grid__cell -color-1">
<div class="wideBox -color-3" lang="zxx"></div>
</div>
<div class="grid__cell grid__cell--noStretch -color-2">
<div class="thinBox -color-4"></div>
</div>
</div>
<div class="mixin-39">
<div class="mixin__cell -color-1">
<div class="wideBox -color-3" lang="zxx"></div>
</div>
<div class="mixin__cell mixin__noGrowth -color-2">
<div class="thinBox -color-4"></div>
</div>
</div>
.mixin-39 {
@include grid($wrap: false);
}
.mixin__noGrowth {
flex-grow: 0;
}
Applying the grid__cell--noShrink class to only 1 of the grid cells (apply flex-shrink: 0 manually if using the mixin system)
<div class="grid grid--noWrap">
<div class="grid__cell -color-1">
<div class="wideBox -color-3" lang="zxx"></div>
</div>
<div class="grid__cell grid__cell--noShrink -color-2">
<div class="thinBox -color-4"></div>
</div>
</div>
<div class="mixin-39">
<div class="mixin__cell -color-1">
<div class="wideBox -color-3" lang="zxx"></div>
</div>
<div class="mixin__cell mixin__noShrink -color-2">
<div class="thinBox -color-4"></div>
</div>
</div>
.mixin-39 {
@include grid($wrap: false);
}
.mixin__noShrink {
flex-shrink: 0;
}
Applying the grid__cell--noResize class to one of the grid cells prevents that grid cell from shrinking and stretching (apply flex-shrink: 0 and flex-grow: 0 manually if using the mixin system). This is very useful for listings with thumbnail images if you apply noResize to the thumbnail grid cell.
<div class="grid grid--noWrap">
<div class="grid__cell -color-1">
<div class="wideBox -color-3" lang="zxx"></div>
</div>
<div class="grid__cell grid__cell--noResize -color-2">
<div class="thinBox -color-4"></div>
</div>
</div>
<div class="mixin-39">
<div class="mixin__cell -color-1">
<div class="wideBox -color-3" lang="zxx"></div>
</div>
<div class="mixin__cell mixin__noResize -color-2">
<div class="thinBox -color-4"></div>
</div>
</div>
.mixin-39 {
@include grid($wrap: false);
}
.mixin__noResize {
flex-grow: 0;
flex-shrink: 0;
}
Mini grids
In order to function correctly most of the time, Gutter Grid assumes that the width of the grid is the full width of it's container. It enforces this behaviour with a min-width: 100% setting. To use Gutter Grid on elements that do not take up 100% of their parent's width, a mini setting needs to be enabled on the grid.
The mini setting allows a grid to take up less than 100% of it's parent's width.
grid--mini class applied on a grid set to 50% width
<figure>
<figcaption>Default grid set to 50% width</figcaption>
<div class="grid" style="width: 50%">
<div class="grid__cell -color-1"></div>
<div class="grid__cell -color-2"></div>
</div>
</figure>
<figure>
<figcaption><code>grid--mini</code> class applied on a grid set to 50% width</figcaption>
<div class="grid grid--mini" style="width: 50%">
<div class="grid__cell -color-1"></div>
<div class="grid__cell -color-2"></div>
</div>
</figure>
$mini: true setting applied on a grid set to 50% width
<figure>
<figcaption>Default grid set to 50% width</figcaption>
<div class="mixin-43">
<div class="mixin__cell -color-1"></div>
<div class="mixin__cell -color-2"></div>
</div>
</figure>
<figure>
<figcaption><code>$mini: true</code> setting applied on a grid set to 50% width</figcaption>
<div class="mixin-44">
<div class="mixin__cell -color-1"></div>
<div class="mixin__cell -color-2"></div>
</div>
</figure>
.mixin-43 {
@include grid;
width: 50%;
}
.mixin-44 {
@include grid($mini: true);
width: 50%;
}