Sass emerged when plain CSS had no variables, nesting, or functions — a huge productivity gain at the time. Modern CSS has since absorbed many of those features natively, narrowing the gap considerably.
$primary: #3858e9;
@mixin button-base {
padding: 0.5rem 1rem;
border-radius: 4px;
border: none;
}
.card {
border: 1px solid #eee;
.title { // nesting: compiles to .card .title
color: $primary;
}
&:hover { // parent selector reference
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}
}
.btn-primary {
@include button-base;
background: $primary;
}
What Plain CSS Now Has Natively
Custom properties (variables), native nesting, and calc() cover a lot of what once required Sass. What plain CSS still lacks: real mixins with logic, functions beyond calc(), and loops for generating repetitive rules — genuine reasons Sass still earns its place in larger projects.