SCSS Grid System
Learn how to create a flexible and powerful grid system using SCSS.
Basic Grid Structure
Create a responsive 12-column grid system with containers, rows, and columns.
// SCSS
// Grid variables
$grid-columns: 12;
$grid-gutter: 30px;
$grid-breakpoints: (
xs: 0,
sm: 576px,
md: 768px,
lg: 992px,
xl: 1200px,
xxl: 1400px
);
$container-max-widths: (
sm: 540px,
md: 720px,
lg: 960px,
xl: 1140px,
xxl: 1320px
);
// Container
.container {
width: 100%;
margin-right: auto;
margin-left: auto;
padding-right: $grid-gutter / 2;
padding-left: $grid-gutter / 2;
@each $breakpoint, $width in $container-max-widths {
@media (min-width: map-get($grid-breakpoints, $breakpoint)) {
max-width: $width;
}
}
&-fluid {
width: 100%;
padding-right: $grid-gutter / 2;
padding-left: $grid-gutter / 2;
margin-right: auto;
margin-left: auto;
}
}
// Row
.row {
display: flex;
flex-wrap: wrap;
margin-right: -$grid-gutter / 2;
margin-left: -$grid-gutter / 2;
&--no-gutters {
margin-right: 0;
margin-left: 0;
> [class*="col-"] {
padding-right: 0;
padding-left: 0;
}
}
}
Column System
Generate responsive column classes for different breakpoints.
// SCSS
// Column base styles
[class*="col-"] {
position: relative;
width: 100%;
padding-right: $grid-gutter / 2;
padding-left: $grid-gutter / 2;
}
// Generate column classes
@mixin make-col($size) {
flex: 0 0 percentage($size / $grid-columns);
max-width: percentage($size / $grid-columns);
}
@mixin make-grid-columns($breakpoint: "") {
$infix: if($breakpoint == "", "", "-#{$breakpoint}");
@for $i from 1 through $grid-columns {
.col#{$infix}-#{$i} {
@include make-col($i);
}
}
}
// Generate columns for each breakpoint
@each $breakpoint, $width in $grid-breakpoints {
@if $breakpoint == xs {
@include make-grid-columns();
} @else {
@media (min-width: $width) {
@include make-grid-columns($breakpoint);
}
}
}
Usage Example:
<div class="container">
<div class="row">
<div class="col-12 col-md-6 col-lg-4">Column 1</div>
<div class="col-12 col-md-6 col-lg-4">Column 2</div>
<div class="col-12 col-md-12 col-lg-4">Column 3</div>
</div>
</div>
Grid Utilities
Additional grid features like offset, ordering, and alignment.
// SCSS
// Offset classes
@mixin make-grid-offsets($breakpoint: "") {
$infix: if($breakpoint == "", "", "-#{$breakpoint}");
@for $i from 0 through ($grid-columns - 1) {
.offset#{$infix}-#{$i} {
margin-left: if($i > 0, percentage($i / $grid-columns), 0);
}
}
}
// Order classes
@mixin make-grid-orders($breakpoint: "") {
$infix: if($breakpoint == "", "", "-#{$breakpoint}");
.order#{$infix}-first { order: -1; }
.order#{$infix}-last { order: $grid-columns + 1; }
@for $i from 0 through $grid-columns {
.order#{$infix}-#{$i} { order: $i; }
}
}
// Alignment classes
.row {
&--align {
&-start { justify-content: flex-start; }
&-center { justify-content: center; }
&-end { justify-content: flex-end; }
&-around { justify-content: space-around; }
&-between { justify-content: space-between; }
&-items {
&-start { align-items: flex-start; }
&-center { align-items: center; }
&-end { align-items: flex-end; }
}
}
}
// Generate utilities for each breakpoint
@each $breakpoint, $width in $grid-breakpoints {
@if $breakpoint == xs {
@include make-grid-offsets();
@include make-grid-orders();
} @else {
@media (min-width: $width) {
@include make-grid-offsets($breakpoint);
@include make-grid-orders($breakpoint);
}
}
}
Usage Example:
<div class="container">
<div class="row row--align-center">
<div class="col-6 offset-md-3">Centered Content</div>
</div>
<div class="row">
<div class="col-6 order-2 order-md-1">First on Desktop</div>
<div class="col-6 order-1 order-md-2">Second on Desktop</div>
</div>
</div>
Auto-layout Columns
Create flexible columns that automatically size themselves.
// SCSS
.col {
flex-basis: 0;
flex-grow: 1;
max-width: 100%;
&-auto {
flex: 0 0 auto;
width: auto;
max-width: 100%;
}
}
// Equal-width multi-row
.row-cols {
@for $i from 1 through 6 {
&-#{$i} > * {
flex: 0 0 percentage(1 / $i);
max-width: percentage(1 / $i);
}
}
// Responsive variants
@each $breakpoint, $width in $grid-breakpoints {
@if $breakpoint != xs {
@media (min-width: $width) {
@for $i from 1 through 6 {
&-#{$breakpoint}-#{$i} > * {
flex: 0 0 percentage(1 / $i);
max-width: percentage(1 / $i);
}
}
}
}
}
}
Usage Example:
<div class="container">
<div class="row">
<div class="col">Auto Width</div>
<div class="col">Auto Width</div>
<div class="col-auto">Content-width</div>
</div>
<div class="row row-cols-2 row-cols-md-4">
<div>Equal 1</div>
<div>Equal 2</div>
<div>Equal 3</div>
<div>Equal 4</div>
</div>
</div>
Best Practices
- Use semantic class names for better maintainability
- Keep grid configurations in variables for easy customization
- Use mixins to generate grid classes efficiently
- Consider using CSS Grid for complex layouts
- Maintain consistent breakpoints across your project
- Use auto-layout columns when possible for flexibility
- Test grid layouts across different screen sizes
- Document grid system usage for team collaboration