Bird
Raised Fist0
SASSmarkup~5 mins

Responsive grid with breakpoints in SASS

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction

A responsive grid helps your website look good on all screen sizes by adjusting layout automatically.

You want your website to work well on phones, tablets, and desktops.
You need columns that stack on small screens but sit side-by-side on large screens.
You want to control how many items fit in a row depending on screen width.
You want to avoid horizontal scrolling on small devices.
You want a flexible layout that adapts without writing separate code for each device.
Syntax
SASS
@mixin breakpoint($point) {
  @if $point == small {
    @media (max-width: 599px) { @content; }
  } @else if $point == medium {
    @media (min-width: 600px) and (max-width: 899px) { @content; }
  } @else if $point == large {
    @media (min-width: 900px) { @content; }
  }
}

.grid {
  display: grid;
  grid-template-columns: repeat(1, 1fr);

  @include breakpoint(medium) {
    grid-template-columns: repeat(2, 1fr);
  }

  @include breakpoint(large) {
    grid-template-columns: repeat(4, 1fr);
  }
}

The @mixin breakpoint defines screen size rules.

Use @include breakpoint(name) to apply styles inside that screen size.

Examples
Defines a small screen breakpoint for screens up to 599px wide.
SASS
@mixin breakpoint($point) {
  @if $point == small {
    @media (max-width: 599px) { @content; }
  }
}
Starts with 1 column on small screens, changes to 2 columns on medium screens.
SASS
.container {
  display: grid;
  grid-template-columns: repeat(1, 1fr);

  @include breakpoint(medium) {
    grid-template-columns: repeat(2, 1fr);
  }
}
Adds 4 columns on large screens for more content side-by-side.
SASS
.container {
  display: grid;
  grid-template-columns: repeat(1, 1fr);

  @include breakpoint(medium) {
    grid-template-columns: repeat(2, 1fr);
  }

  @include breakpoint(large) {
    grid-template-columns: repeat(4, 1fr);
  }
}
Sample Program

This example creates a grid with 1 column on small screens, 2 columns on medium screens, and 4 columns on large screens. Each grid item is a blue box with white text. The layout changes automatically when you resize the browser.

SASS
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1" />
  <title>Responsive Grid Example</title>
  <style lang="scss">
    $breakpoints: (
      small: 599px,
      medium: 899px
    );

    @mixin breakpoint($point) {
      @if $point == small {
        @media (max-width: map-get($breakpoints, small)) {
          @content;
        }
      } @else if $point == medium {
        @media (min-width: #{map-get($breakpoints, small) + 1px}) and (max-width: map-get($breakpoints, medium)) {
          @content;
        }
      } @else if $point == large {
        @media (min-width: #{map-get($breakpoints, medium) + 1px}) {
          @content;
        }
      }
    }

    .grid {
      display: grid;
      gap: 1rem;
      grid-template-columns: repeat(1, 1fr);
      padding: 1rem;
    
      @include breakpoint(medium) {
        grid-template-columns: repeat(2, 1fr);
      }
    
      @include breakpoint(large) {
        grid-template-columns: repeat(4, 1fr);
      }
    }

    .item {
      background-color: #4a90e2;
      color: white;
      padding: 1rem;
      border-radius: 0.5rem;
      text-align: center;
      font-weight: bold;
      font-size: 1.25rem;
    }
  </style>
</head>
<body>
  <main>
    <section class="grid" aria-label="Responsive grid example">
      <div class="item">1</div>
      <div class="item">2</div>
      <div class="item">3</div>
      <div class="item">4</div>
      <div class="item">5</div>
      <div class="item">6</div>
    </section>
  </main>
</body>
</html>
OutputSuccess
Important Notes

Use gap in grid to add space between items instead of margins.

Always test your grid by resizing the browser or using device simulation in browser DevTools.

Use semantic HTML and ARIA labels for accessibility, like aria-label on the grid container.

Summary

A responsive grid adjusts columns based on screen size using breakpoints.

Use Sass mixins to write clean, reusable media queries for breakpoints.

Test responsiveness by resizing your browser or using DevTools device mode.

Practice

(1/5)
1. What is the main purpose of using breakpoints in a responsive grid with Sass?
easy
A. To add colors to the grid items
B. To disable the grid on small screens
C. To increase font size only
D. To change the number of columns based on screen size

Solution

  1. Step 1: Understand breakpoints in responsive design

    Breakpoints are screen widths where layout changes to fit device size better.
  2. Step 2: Role of breakpoints in grids

    They adjust the number of columns so content fits nicely on different screens.
  3. Final Answer:

    To change the number of columns based on screen size -> Option D
  4. Quick Check:

    Breakpoints adjust layout = B [OK]
Hint: Breakpoints change layout, not just colors or fonts [OK]
Common Mistakes:
  • Thinking breakpoints only change colors
  • Believing breakpoints disable grids
  • Assuming breakpoints only affect fonts
2. Which Sass syntax correctly defines a media query mixin for a breakpoint at 768px?
easy
A. @mixin breakpoint($size) { @media (min-width: $size) { @content; } }
B. @mixin breakpoint($size) { @media (max-width: $size) { @content; } }
C. @mixin breakpoint { @media (min-width: 768px) { @content; } }
D. @mixin breakpoint { @media (max-width: 768px) { @content; } }

Solution

  1. Step 1: Understand mixin with parameter

    Mixin should accept a size parameter to be reusable for any breakpoint.
  2. Step 2: Correct media query syntax

    Use min-width for breakpoints that apply styles at or above the size.
  3. Final Answer:

    @mixin breakpoint($size) { @media (min-width: $size) { @content; } } -> Option A
  4. Quick Check:

    Mixin with parameter and min-width = A [OK]
Hint: Use parameters for flexible breakpoints in mixins [OK]
Common Mistakes:
  • Forgetting to add parameter for size
  • Using max-width instead of min-width incorrectly
  • Not including @content inside media query
3. Given the Sass code below, what will be the number of columns on a screen 800px wide?
@mixin breakpoint($size) {
  @media (min-width: $size) {
    @content;
  }
}

.grid {
  display: grid;
  grid-template-columns: repeat(1, 1fr);
  @include breakpoint(600px) {
    grid-template-columns: repeat(2, 1fr);
  }
  @include breakpoint(900px) {
    grid-template-columns: repeat(3, 1fr);
  }
}
medium
A. 2 columns
B. No columns, grid disabled
C. 3 columns
D. 1 column

Solution

  1. Step 1: Check screen width against breakpoints

    Screen is 800px wide, which is >= 600px but < 900px.
  2. Step 2: Determine applied grid-template-columns

    At 600px breakpoint, columns become 2; 900px breakpoint not reached yet.
  3. Final Answer:

    2 columns -> Option A
  4. Quick Check:

    800px between 600 and 900 = 2 columns [OK]
Hint: Compare screen width to breakpoints in order [OK]
Common Mistakes:
  • Choosing 3 columns thinking 800px is above 900px
  • Choosing 1 column ignoring breakpoint overrides
  • Assuming grid disables at certain widths
4. Identify the error in this Sass code for a responsive grid:
@mixin breakpoint($size) {
  @media min-width: $size {
    @content;
  }
}

.grid {
  display: grid;
  grid-template-columns: repeat(1, 1fr);
  @include breakpoint(768px) {
    grid-template-columns: repeat(2, 1fr);
  }
}
medium
A. grid-template-columns syntax is invalid
B. Missing parentheses around media query condition
C. Wrong mixin name
D. No error, code is correct

Solution

  1. Step 1: Check media query syntax in mixin

    Media queries require parentheses around conditions, e.g., (min-width: 768px).
  2. Step 2: Identify missing parentheses

    Code has @media min-width: $size without parentheses, causing syntax error.
  3. Final Answer:

    Missing parentheses around media query condition -> Option B
  4. Quick Check:

    Media query needs parentheses = C [OK]
Hint: Always wrap media query conditions in parentheses [OK]
Common Mistakes:
  • Omitting parentheses in @media
  • Confusing mixin name with media query
  • Thinking grid-template-columns syntax is wrong
5. You want a grid that shows 1 column on small screens, 2 columns on medium (≥600px), and 4 columns on large (≥1200px). Which Sass code correctly implements this using a breakpoint mixin?
hard
A. @mixin breakpoint($size) { @media (min-width: $size) { @content; } } .grid { display: grid; grid-template-columns: repeat(4, 1fr); @include breakpoint(600px) { grid-template-columns: repeat(2, 1fr); } @include breakpoint(1200px) { grid-template-columns: repeat(1, 1fr); } }
B. @mixin breakpoint($size) { @media (max-width: $size) { @content; } } .grid { display: grid; grid-template-columns: repeat(4, 1fr); @include breakpoint(600px) { grid-template-columns: repeat(2, 1fr); } @include breakpoint(1200px) { grid-template-columns: repeat(1, 1fr); } }
C. @mixin breakpoint($size) { @media (min-width: $size) { @content; } } .grid { display: grid; grid-template-columns: repeat(1, 1fr); @include breakpoint(600px) { grid-template-columns: repeat(2, 1fr); } @include breakpoint(1200px) { grid-template-columns: repeat(4, 1fr); } }
D. @mixin breakpoint($size) { @media (max-width: $size) { @content; } } .grid { display: grid; grid-template-columns: repeat(1, 1fr); @include breakpoint(600px) { grid-template-columns: repeat(4, 1fr); } @include breakpoint(1200px) { grid-template-columns: repeat(2, 1fr); } }

Solution

  1. Step 1: Understand breakpoint directions

    Use min-width to apply styles at or above the breakpoint size.
  2. Step 2: Check column counts for each breakpoint

    Default 1 column, 2 columns at ≥600px, 4 columns at ≥1200px matches @mixin breakpoint($size) { @media (min-width: $size) { @content; } } .grid { display: grid; grid-template-columns: repeat(1, 1fr); @include breakpoint(600px) { grid-template-columns: repeat(2, 1fr); } @include breakpoint(1200px) { grid-template-columns: repeat(4, 1fr); } }.
  3. Final Answer:

    @mixin breakpoint($size) { @media (min-width: $size) { @content; } } .grid { display: grid; grid-template-columns: repeat(1, 1fr); @include breakpoint(600px) { grid-template-columns: repeat(2, 1fr); } @include breakpoint(1200px) { grid-template-columns: repeat(4, 1fr); } } -> Option C
  4. Quick Check:

    min-width with increasing columns = A [OK]
Hint: Use min-width and increase columns with larger breakpoints [OK]
Common Mistakes:
  • Using max-width instead of min-width
  • Setting default columns incorrectly
  • Reversing column counts at breakpoints