Advanced sass
Estimated reading time: 8 minutesEmbrace Placeholders
Sass supports a special type of selector called a “placeholder selector”. These look like class and id selectors, except the # or .
is replaced by %
.
` %foo represent Placeholders selector . and then
@extend`
Lists
Lists are the Sass equivalent of arrays, which we can find almost any programming language. They are a data structure containing one or several values, possibly including lists, leading to nested lists. but sass list start from 1 / non-zero
..
https://www.sitepoint.com/sass-reference/lists/
- List Delimiters : Two Delimiters space or comma.
$list: 'foo' 'bar';
$type: type-of($list); // list
$separator: list-separator($list); // space
$list: 'foo', 'bar';
$type: type-of($list); // list
$separator: list-separator($list); // comma
$item: nth($list, 1); // 'foo'
$count: length($list); // 0
$list: append($list, 'test'); // ('foo' 'bar' 'test')
$list: join('test', $list, 'comma'); // ('test', 'foo' 'bar');
@function
It is possible to define your own functions in sass and use them in any value or script context
$grid-width: 40px;
$gutter-width: 10px;
@function grid-width($n) {
@return $n * $grid-width + ($n - 1) * $gutter-width;
}
#sidebar { width: grid-width(5); }
Becomes:
#sidebar {
width: 240px; }
@if
/@else
The @if
directive takes a SassScript expression and uses the styles nested beneath it if the expression returns anything other than false or null:
$type: monster;
p {
@if $type == ocean {
color: blue;
} @else if $type == matador {
color: red;
} @else if $type == monster {
color: green;
} @else {
color: black;
}
}
@for
The @for
directive repeatedly outputs a set of styles. For each repetition, a counter variable is used to adjust the output. The directive has two forms: @for $var from <start> through <end>
and @for
$var from
The @for
statement sets $var
to each successive number in the specified range and each time outputs the nested styles using that value of $var
. For the form from … through, the range includes the values of
@for $i from 1 through 3 {
.item-#{$i} { width: 2em * $i; }
}
is compiled to:
.item-1 {
width: 2em; }
.item-2 {
width: 4em; }
.item-3 {
width: 6em; }
@each
The @each
directive usually has the form @each $var in . $var can be any variable name, like $length or `$name`, and`
`is a SassScript expression that returns a list or a map.
The @each
rule sets $var to each item in the list or map, then outputs the styles it contains using that value of $var. For example:
@each $animal in puma, sea-slug, egret, salamander {
.#{$animal}-icon {
background-image: url('/images/#{$animal}.png');
}
}
is compiled to:
.puma-icon {
background-image: url('/images/puma.png'); }
.sea-slug-icon {
background-image: url('/images/sea-slug.png'); }
.egret-icon {
background-image: url('/images/egret.png'); }
.salamander-icon {
background-image: url('/images/salamander.png'); }
@content
@mixin button() {
display: block;
font-size: 20px;
text-decoration: none;
@content;
}
.alert {
@include button {
color: #F00;
}
}
.cancel {
@include button {
border: solid 1px #999;
}
}
output:
.alert {
display: block;
font-size: 20px;
text-decoration: none;
color: #F00;
}
.cancel {
display: block;
font-size: 20px;
text-decoration: none;
border: solid 1px #999;
}
Maps
key
and value
$map: (key1: value1, key2: value2, key3: value3);
/* Define the Sassy Map called $icons */
$icons: (
checkmark: a,
plus: b,
minus: c
);
/* For each key in the map, created an own class */
@each $name, $value in $icons {
.icon--#{$name} {
content: $value;
}
}
output
/* Define the Sassy Map called $icons */
/* For each key in the map, created an own class */
.icon--checkmark {
content: a;
}
.icon--plus {
content: b;
}
.icon--minus {
content: c;
}
- multiple map
// _m-buttons.scss
$buttons: (
error: (#d82d2d, #666),
success: (#52bf4a, #fff),
warning: (#c23435, #fff)
);
.m-button {
display: inline-block;
padding: .5em;
background: #ccc;
color: #666;
@each $name, $colors in $buttons {
$bgcolor: nth($colors, 1);
$fontcolor: nth($colors, 2);
&--#{$name} {
background-color: $bgcolor;
color: $fontcolor;
}
}
}
output
.m-button {
display: inline-block;
padding: .5em;
background: #ccc;
color: #666;
}
.m-button--error {
background-color: #d82d2d;
color: #666;
}
.m-button--success {
background-color: #52bf4a;
color: #fff;
}
.m-button--warning {
background-color: #c23435;
color: #fff;
}
Comments
Sass supports standard multiline CSS comments with /* Multi comment */
, as well as single-line comments with //single comment
.