- Fully fucking responsive
- Mobile first
- Infinitely nestable
- Reversible/reorderable
- With/without gutters, whatev
- Endless possible combinations
- Simple to understand, human-friendly classes, fuckin'-A!
- Option to keep classes out of your HTML
- Robust
- Simple
- No
.clear
or.last
shit - It just works, mofo
See Responsive grid systems; a solution? for a comprehensive overview of the principles of the grid system.
- Mad props go out to Harry Roberts and his csswizardry-grids project which is this "loosely" based on 😉 cuz he's a motherfucking CSS genius yo.
Simply fill in/adjust the relevant variables.
$responsive
is used to turn thug-grids's responsive features on and off. thug-grids is designed primarily for responsive builds but can also be used on non-responsive projects just as easily. Setting this to false will simply prevent Sass generating yourpalm
, etc. modifiers.$gutter
controls how much space there is between columns.$mobile-first
controls whether you would like unclassed grid items to initially adopt `width:100%;. This means that you won't need to add a class to force a grid item to take up the full width of its container.$use-silent-classes
tells thug-grids whether to go ahead and compile solid, traditional classes (e.g..one-whole
) or to create Sass 'silent' classes which only compile to CSS once explictly called.$lap-start
and$desk-start
tell thug-grids when to fire particular media queries to service those particular sizes. Note that thug-grids works out the ends of any other breakpoints by using these numbers.
thug-grids is incredibly simple to implement, its classes are all human-readable and follow the same pattern.
thug-grids's classes are based on a modified BEM syntax. Yo, BEM is the shit!
.grid
is a Block.grid__item
is an Element.grid--rev
is a Modifier
Classes include your breakpoint namespaces (e.g. .palm--one-half
, .desk--two-thirds
and so on); your push and pull classes (.push--one-third
, .pull--desk--one-quarter
and so on); your regular classes (.one-tenth
, .three-quarters
etc).
Knowing these patterns will allow you to create hundreds of different combinations. A few examples:
/**
* Sets an item to be one half across all breakpoints.
*/
.one-half{}
/**
* Pushes an item one third of the way to the right across all breakpoints.
*/
.push--one-third{}
/**
* Sets an item to be ten twelfths wide only at the desk breakpoint.
*/
.desk--ten-twelthfs{}
/**
* Pulls an item one half of the way to the left only at the palm breakpoint.
*/
.pull--palm--one-half{}
If you are using traditional classes then an example, basic usage might look like this:
<div class="grid">
<div class="grid__item lap--one-half desk--two-thirds">
...
</div>
<!--
-->
<div class="grid__item lap--one-half desk--one-third">
...
</div>
</div>
It's as simple as that!
Note the empty HTML comments. These are to remove whitespace caused by using
inline-block
.
If you'd rather not use HTML comments to remove the whitespace then you can set the $use-markup-fix
variable to false; this invokes a CSS hack that cannot be guaranteed. Always take care to check things over if using this method.
If you need to use thug-grids with a CMS, or data coming out of a loop, you will need to format your template something a little like this:
<div class="grid">
<!--
<?php
$items = array('foo', 'bar', 'baz');
foreach ($items as $item) {
?>
-->
<div class="grid__item one-third">
<?= $item ?>
</div>
<!--
<?php
}
?>
-->
</div>
Note the opening and closing comments before and after the loop, and the corresponding opening and closing comments facing outward from the .grid__item
element. Try pasting the above into the codepad code runner: items from a loop without the need for a counter :)
If you are using silent classes ($use-silent-classes: true;
) then your HTML
might look like this:
<div class="page">
<div class="content">
...
</div>
<!--
-->
<div class="sub-content">
...
</div>
</div>
...and your Sass, something like this:
.page {
@extend %grid;
}
.content,
.sub-content{
@extend %grid__item;
@extend %one-whole;
@extend %lap--one-half;
}
.content{
@extend %desk--two-thirds;
}
.sub-content{
@extend %desk--one-third;
}
thug-grids has the option to reverse a set of grids; this means that the order you write your source and the order it renders are total opposites, for example:
<div class="grid grid--rev">
<div class="main-content grid__item two-thirds">
I appear first in the markup, but render second in the page.
</div>
<!--
-->
<div class="sub-content grid__item one-third">
I appear second in the markup, but render first in the page.
</div>
</div>
This is handy if you want to lay out your page a certain way visually but it would be advantageous to order the source differently, for example to aid accessibility (getting a screenreader to read more important content first).
It may be desirable at times to have no gutter between your grid items; with thug-grids this is as simple as:
<div class="grid grid--full">
<div class="grid__item one-half">
Look, ma! No gutter!
</div>
<!--
-->
<div class="grid__item one-half">
Look, ma! No gutter!
</div>
</div>
Keep grids in their correct order, but have them flush right instead of left:
<div class="grid grid--right">
<div class="grid__item one-quarter">
I render first but start in the middle of the page.
</div>
<!--
-->
<div class="grid__item one-quarter">
I render second and appear at the very right edge of the page.
</div>
</div>
You can centrally align your grids by simply using the .grid--center
modifier:
<div class="grid grid--center">
<div class="grid__item one-half">
I'm in the middle!
</div>
</div>
You can vertically align your grids to each other by simply using the .grid--[middle|bottom]
modifiers:
<div class="grid grid--middle">
<div class="grid__item one-half">
I'm in the middle!
</div>
<div class="grid__item one-half">
I'm in the middle!
</div>
</div>
You can quickly alter the gutter size of your grids to half (.grid--narrow
) or double (.grid--wide
) by using the relevant modifiers.
<div class="grid grid--narrow">
<div class="grid__item one-half">
I'm a narrow-guttered grid.
</div>
<div class="grid__item one-half">
I'm a narrow-guttered grid.
</div>
</div>
If you have any trouble setting thug-grids up, or would like some help using and implementing it (or any questions about how it works) then please feel free to fire me a tweet or open an issue.
thug-grids's Sass can look a little daunting, but it's doing quite a lot of work behind the scenes to make it as simple as possible when it comes to implementation.