DEV Community

Adriansseur
Adriansseur

Posted on • Edited on

One Pager: Sass Tutorial for Beginners

In this post I share the knowledge I got from the video below. These are notes that helped me learn, not a transcript. Credit goes to freeCodeCamp.org and codeSTACKr.

Variables in CSS vs SCSS:

/* CSS */
body {
  --ocean-color: blue;
}

div {
  background: var(--ocean-color);
}
Enter fullscreen mode Exit fullscreen mode
/* SCSS */
$ocean-color: blue

div {
  background: $ocean-color;
}
Enter fullscreen mode Exit fullscreen mode

Map of values:

/* SCSS */
$font-weights: (
  "regular": 400,
  "medium": 500,
  "bold": 700
);

body {
  font-weight: map-get($font-weights, bold)
Enter fullscreen mode Exit fullscreen mode

No nesting in CSS vs Nesting in SCSS

/* CSS */
body {
  width: 80%;
}

body p {
  color: white;
}
Enter fullscreen mode Exit fullscreen mode
/* SCSS */
body {
  width: 80%;

  p {
    color: white;
  }
}
Enter fullscreen mode Exit fullscreen mode

& (ampersand)

& (ampersand) is a shortcut for "insert name of parent class here". The following are equal.

/* SCSS */
.container {
  width: 80%;

  .container-paragraph {
    background: black;
  }
Enter fullscreen mode Exit fullscreen mode
/* SCSS */
.container {
  width: 80%;

  &-paragraph {
    background: black;
  }
Enter fullscreen mode Exit fullscreen mode

Using just the & (ampersand) compiles (translates) this sass code:

/* SCSS */
.container {
  width: 80%;

  &-paragraph {
    background: black;
  }
Enter fullscreen mode Exit fullscreen mode

...into this css code:

/* CSS */
.container {
  width: 80%;
}

.container-paragraph {
  background: black;
}
Enter fullscreen mode Exit fullscreen mode

#{&} Interpolation

Wrapping the & in #{} (a process called interpolation) translates this sass code:

/* SCSS */
.container {
  width: 80%;

  #{&}-paragraph {
    background: black;
  }
Enter fullscreen mode Exit fullscreen mode

...into this css code:

/* CSS */
.container {
  width: 80%;
}

.container .container-paragraph {
  background: black;
}
Enter fullscreen mode Exit fullscreen mode

Partials (subfiles)

To break up your SCSS into subfiles you can name them like "_filename.scss". These subfiles are called partials. Then import them into your main file using:

/* SCSS */
/* No _ or .scss needed */
@import "./filename";
Enter fullscreen mode Exit fullscreen mode

Functions:

/* SCSS */
$font-weights: (
  "regular": 400,
  "medium": 500,
  "bold": 700
);

/* Instead of doing this: 
/* body { font-weight: map-get($font-weights, bold) } */

@function weight($weight-name) {
  @return map-get($font-weights, $weight-name);

body {
  font-weight: weight(bold);
Enter fullscreen mode Exit fullscreen mode

Mixins:

/* SCSS */
/* Define it once */
@mixin flexCenter {
  display: flex;
  justify-content: center;
  align-items: center;
}

/* Use everywhere */
.container1 {
  @include flexCenter;
}

.container2 {
  @include flexCenter;
}
Enter fullscreen mode Exit fullscreen mode

Mixins can take arguments:

/* SCSS */
/* Define it once */
@mixin flexCenter($direction) {
  display: flex;
  justify-content: center;
  align-items: center;
  direction: $direction;
}

/* Use everywhere */
.container1 {
  @include flexCenter(column);
}

.container2 {
  @include flexCenter(row);
}
Enter fullscreen mode Exit fullscreen mode

Mixins can contain JS-like logic:

/* SCSS */
@mixin theme($light-theme) {
  @if $light-theme {
    background: white;
    color: black;
  } @else {
    background: black;
    color: white;
}

.light {
  @include theme($light-theme: true);
}

.dark {
  @include theme($light-theme: false);
}
Enter fullscreen mode Exit fullscreen mode

Mixins can wrap a media query. @content is short for "everything defined when the mixing is called":

/* SCSS */
@mixin mobile {
  @media (min-width: 600px) {
    @content;
  }
}

body {
  @include mobile {
    display: flex;
    flex-direction: row;
  }
}
Enter fullscreen mode Exit fullscreen mode

@extend

Extend styles from one class to the other using @extend:

/* SCSS */
.main {
  #{&}-paragraph1 {
    background: blue;

    &:hover {
      color: yellow;
    }
  }

  #{&}-paragraph2 {
    @extend .main-paragraph1;

    /* Optionally override anything being extended */
}

Enter fullscreen mode Exit fullscreen mode

Calculations in CSS vs SCSS:

/* CSS */
body {
  width: calc(80% - 40%);
  /* mixing % with px works */ 
}
Enter fullscreen mode Exit fullscreen mode
/* SCSS */
body {
  width: 80% - 40%;
  /* mixing % with px DOES NOT work */ 
}
Enter fullscreen mode Exit fullscreen mode

The rest of the video shows the building of a real world example, a portfolio site. Check it out for more!

Top comments (0)