SCSS • LEVEL 2 • LESSON 6 OF 9
0% Complete
← Back to Learning Path

🏗️ Lesson 6: Building Grid Systems

Combine everything you've learned to create a complete, production-ready grid system!

What is a Grid System?

A grid system is a complete set of utilities that makes building layouts easy and consistent. It includes:

💡 Real-World Impact:

Major frameworks like Bootstrap and Tailwind are built using these exact techniques. You're learning how to build your own framework!

Step 1: Configuration

Start with a configuration file defining your design tokens:

// _grid-config.scss
// ==================

// Grid columns
$grid-columns: 12;

// Breakpoints
$breakpoints: (
  sm: 640px,
  md: 768px,
  lg: 1024px,
  xl: 1280px,
  2xl: 1536px
);

// Spacing scale (in pixels)
$spacing: (
  0: 0,
  1: 4px,
  2: 8px,
  3: 12px,
  4: 16px,
  5: 20px,
  6: 24px,
  8: 32px,
  10: 40px,
  12: 48px,
  16: 64px,
  20: 80px
);

// Container max-widths
$containers: (
  sm: 640px,
  md: 768px,
  lg: 1024px,
  xl: 1280px,
  2xl: 1536px
);

Step 2: Helper Functions

// _grid-functions.scss
// ====================

// Get breakpoint value
@function breakpoint($name) {
  @return map-get($breakpoints, $name);
}

// Get spacing value
@function spacing($key) {
  @return map-get($spacing, $key);
}

// Calculate column width
@function col-width($span, $total: $grid-columns) {
  @return percentage($span / $total);
}

Step 3: Base Container

// _grid-container.scss
// ====================

.container {
  width: 100%;
  margin-left: auto;
  margin-right: auto;
  padding-left: spacing(4);
  padding-right: spacing(4);

  @each $name, $width in $containers {
    @media (min-width: breakpoint($name)) {
      max-width: $width;
    }
  }
}

.container-fluid {
  width: 100%;
  padding-left: spacing(4);
  padding-right: spacing(4);
}

Step 4: Grid Display Classes

// _grid-display.scss
// ==================

.grid {
  display: grid;
}

// Generate grid-cols-* classes
@for $i from 1 through $grid-columns {
  .grid-cols-#{$i} {
    grid-template-columns: repeat($i, 1fr);
  }
}

// Auto layout classes
.grid-cols-auto {
  grid-template-columns: auto;
}

.grid-cols-auto-fit {
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}

.grid-cols-auto-fill {
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
}

Step 5: Column Spanning

// _grid-columns.scss
// ==================

// Column span utilities
@for $i from 1 through $grid-columns {
  .col-span-#{$i} {
    grid-column: span $i / span $i;
  }
}

.col-span-full {
  grid-column: 1 / -1;
}

// Column start positions
@for $i from 1 through ($grid-columns + 1) {
  .col-start-#{$i} {
    grid-column-start: $i;
  }
  
  .col-end-#{$i} {
    grid-column-end: $i;
  }
}

// Auto column placement
.col-auto {
  grid-column: auto;
}

Step 6: Row Utilities

// _grid-rows.scss
// ===============

// Row span utilities
@for $i from 1 through 6 {
  .row-span-#{$i} {
    grid-row: span $i / span $i;
  }
}

.row-span-full {
  grid-row: 1 / -1;
}

// Row start/end positions
@for $i from 1 through 7 {
  .row-start-#{$i} {
    grid-row-start: $i;
  }
  
  .row-end-#{$i} {
    grid-row-end: $i;
  }
}

.row-auto {
  grid-row: auto;
}

Step 7: Gap Utilities

// _grid-gaps.scss
// ===============

// Generate gap utilities
@each $name, $size in $spacing {
  .gap-#{$name} {
    gap: $size;
  }
  
  .gap-x-#{$name} {
    column-gap: $size;
  }
  
  .gap-y-#{$name} {
    row-gap: $size;
  }
}

Step 8: Responsive Modifiers

// _grid-responsive.scss
// =====================

@each $bp-name, $bp-value in $breakpoints {
  @media (min-width: $bp-value) {
    
    // Grid columns
    @for $i from 1 through $grid-columns {
      .#{$bp-name}\:grid-cols-#{$i} {
        grid-template-columns: repeat($i, 1fr);
      }
      
      .#{$bp-name}\:col-span-#{$i} {
        grid-column: span $i / span $i;
      }
    }
    
    // Gaps
    @each $name, $size in $spacing {
      .#{$bp-name}\:gap-#{$name} {
        gap: $size;
      }
    }
    
    // Display
    .#{$bp-name}\:grid {
      display: grid;
    }
    
    .#{$bp-name}\:hidden {
      display: none;
    }
  }
}

✅ Usage Example:

Now you can write HTML like this:

<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">

Step 9: Master Import File

// grid-system.scss
// ================
// Import this file to get the complete grid system

@import 'grid-config';
@import 'grid-functions';
@import 'grid-container';
@import 'grid-display';
@import 'grid-columns';
@import 'grid-rows';
@import 'grid-gaps';
@import 'grid-responsive';

Complete Example: Real Layout

// HTML using your grid system
<div class="container">
  <div class="grid grid-cols-1 md:grid-cols-3 gap-6">
    
    <!-- Sidebar - spans 1 column on mobile, 1 on desktop -->
    <aside class="col-span-1">
      <!-- Sidebar content -->
    </aside>
    
    <!-- Main content - spans 1 column on mobile, 2 on desktop -->
    <main class="col-span-1 md:col-span-2">
      
      <!-- Nested grid for cards -->
      <div class="grid grid-cols-1 sm:grid-cols-2 gap-4">
        <div class="card">Card 1</div>
        <div class="card">Card 2</div>
        <div class="card">Card 3</div>
        <div class="card">Card 4</div>
      </div>
      
    </main>
  </div>
</div>

Advanced: Grid Template Areas

// _grid-areas.scss
// ================

// Mixin for named grid areas
@mixin grid-area($name) {
  grid-area: $name;
}

// Common layout patterns
.layout-holy-grail {
  display: grid;
  grid-template-areas:
    "header header header"
    "nav    main   aside"
    "footer footer footer";
  grid-template-columns: 200px 1fr 200px;
  grid-template-rows: auto 1fr auto;
  gap: spacing(4);
  min-height: 100vh;
}

.layout-header { @include grid-area(header); }
.layout-nav    { @include grid-area(nav); }
.layout-main   { @include grid-area(main); }
.layout-aside  { @include grid-area(aside); }
.layout-footer { @include grid-area(footer); }

Optimization Tips

🎯 Performance:

  • • Use PurgeCSS to remove unused utilities
  • • Only generate breakpoints you need
  • • Consider limiting spacing scale
  • • Minify compiled CSS in production

Level 2 Complete!

Congratulations! You've built a complete grid system using:

In Level 3, you'll learn expert techniques for optimization, theming, and advanced layout patterns!

📝 Quick Check (3 Questions)

1. What are the main components of a grid system?

2. Why use configuration files in grid systems?

3. What's the purpose of responsive modifiers like md:grid-cols-3?

← Previous Lesson