compiled successfully

A word on Sass @extend

August 05, 2019

@extend is a powerful SASS tool that helps keep your code nice and dry, but it can have drawbacks if used incorrectly. Calling @extend on a class or placehodler will add the extended class to the extending class’ selector list. Take this example:

.message {
  border: 1px solid black;
  color: black;
  padding: 10px 5px;
}

.success {
  @extend .message;
  border-color: green;
}

.warn {
  @extend .message;
  border-color: yellow;
}

.fail {
  @extend .message;
  border-color: red;
}

We create a .message class, and extend it across a few more classes with only a change to the border-color. When compiled, we get:

.message,
.success,
.warn,
.fail {
  border: 1px solid black;
  color: black;
  padding: 10px 5px;
}

.success {
  border-color: green;
}

.warn {
  border-color: yellow;
}

.fail {
  border-color: red;
}

Great! We’ve got an extremely effecient, dry output. However, using @extend improperly can leave a massive trail of selectors you just don’t need. For example:

.foo {
  .bar {
    .message {
      color: black;
      border: 1px solid black;
      padding: 10px 5px;
    }
  }
}

.baz {
  .buzz {
    .error {
      @extend .message;
      border-color: red;
    }
  }
}

Will result in:

.foo .bar .message,
.foo .bar .baz .buzz .error,
.baz .buzz .foo .bar .error {
  color: black;
  border: 1px solid black;
  padding: 10px 5px;
}

.baz .buzz .error {
  border-color: red;
}

Yikes. Is it even worth the trouble?

The real answer is…maybe? If you’re running into selector issues, consider using a mixin instead. But if you totally understand how @extend works, and there’s a use-case that stands out, great! Go for it! Otherwise, it may not be worth forcing into a stylesheet just for the sake of using it.


Ian Gloude

A blog written by Ian Gloude, who works on Flipgrid @ Microsoft.
Twitter | Instagram