Quickly build a simple grid with Sass

Categories:  

All you need are some variables and loops. Granted, some may argue for readability, but as long as what you’re doing is well documented, it can save you a lot of time. Especially if you want to add/remove breakpoints.

The end result should be a simple class list that is responsible for the width of your column. I’m using a seperate class to take care of floats and padding.

For my purposes, I’m using .layout__item and .g-1-12, .g-2-12… etc

.layout__item will contain the following:

.layout__item {
    padding-left: 15px;
    padding-right: 15px;
    float: left;
}

Starting off, I need a formula for calculating width based off a fraction of how many columns I want.

Say I wanted a column to extend 4/12 of the page, I’d use:

(4 / 12) * 100%

In Sass, this would return 33.33333%. Happy days, so let’s keep that in a function.

@function percentage-width($span, $columns) {
  @return ($span / $columns) * 100%;
}

I’m then going to keep my colums in a variable.

$grid-column: 12;

Next, I’m going to use a for loop to iterate through my number of columns, and use the percentage-width function.

@for $i from 1 through $grid-columns {
  .u-#{$i}-#{$grid-columns} {
    width: percentage-width($i, $grid-columns);
  }
}

This yields the following:

.u-1-12 {
  width: 8.33333%; }

.u-2-12 {
  width: 16.66667%; }

.u-3-12 {
  width: 25%; }

etc…


So what about breakpoints? The above example would surely serve well as a mobile-first starting point.

Let’s throw in another variable, a map:

$grid-breakpoints: (
  medium: 768px,
  large: 960px
);

We can use the above loop again, but modify it slightly to include medium and large in the class name.

// Loop breakpoints to generate screen-specific grids
@each $key, $val in $grid-breakpoints {
  @media (min-width: #{$val}) {
    @for $i from 1 through $grid-columns {
      .u-#{$i}-#{$grid-columns}--#{$key} {
        width: percentage-width($i, $grid-columns);
      }
    }
  }
}

It’s the same loop, but repeated for every breakpoint defined in $grid-breakpoints, resulting in:

@media (min-width: 768px) {
  .u-1-12--medium {
    width: 8.33333%; }
  .u-2-12--medium {
    width: 16.66667%; }

And so on.

You can grab the source and see a small example on CodePen.

See the Pen Simple grid with Sass by T.J. Fogarty (@tjFogarty) on CodePen.