Skip to content

@responsive

Creates media queries using your configured breakpoints.

Alias: @mq

Syntax

css
@responsive {breakpointQuery} {
  /* declarations */
}

Single Breakpoint

Targets one specific breakpoint range:

css
@responsive xs {
  .hero { padding: 20px; }
}

@responsive md {
  .hero { padding: 60px; }
}

Comparison Operators

Target ranges using >=, <=, >, <:

css
/* md and above */
@responsive >=md {
  .sidebar { display: block; }
}

/* Below md */
@responsive <md {
  .sidebar { display: none; }
}

/* sm and below */
@responsive <=sm {
  .nav { flex-direction: column; }
}

Multiple Breakpoints

Target specific breakpoints with / separator:

css
@responsive xs/sm {
  .card { flex-direction: column; }
}

@responsive md/lg/xl {
  .card { flex-direction: row; }
}

Breakpoint Collections

Use $-prefixed collection names from your config:

css
/* Config: breakpointCollections: { $mobile: 'xs', $desktop: 'md/lg/xl' } */

@responsive $mobile {
  .menu { position: fixed; }
}

@responsive $desktop {
  .menu { position: static; }
}

Custom Pixel Ranges

Define arbitrary ranges with the -> syntax:

css
/* Between 359px and 740px */
@mq 359px->740px {
  .element { font-size: 14px; }
}

/* 500px and above (open-ended) */
@mq 500px-> {
  .element { font-size: 16px; }
}

/* Up to 800px */
@mq ->800px {
  .element { font-size: 12px; }
}

Nesting

@responsive blocks can be nested inside selectors:

css
.card {
  padding: 20px;

  @responsive >=md {
    padding: 40px;
    display: grid;
    grid-template-columns: 1fr 1fr;
  }
}

Output

Given breakpoints { xs: '0', sm: '740px', md: '1024px' }:

css
/* Input */
@responsive sm {
  .box { padding: 30px; }
}

/* Output */
@media (min-width: 740px) and (max-width: 1023px) {
  .box { padding: 30px; }
}
css
/* Input */
@responsive >=sm {
  .box { padding: 30px; }
}

/* Output */
@media (width >= 740px) {
  .box { padding: 30px; }
}