ADVANCED
Sass basics in short
- Syntatically Awesome stylesheets
- Extension language that compiles into plain CSS
- Sass is for developers, CSS for browsers
- Install it with an application, using the command line or clone it of gitHub
Advanced nesting
- Nesting makes code complicated
- The Inception Rule: don’t go more than four levels deep
- Style in a modular way
- Consider if removing it could simplify your code
- Possible to use selectors:
- &:hover
- &:focus
- &::before
/* SCSS */
.element {
&:hover {
color: blue;
}
}
/* CSS */
.element:hover {
color: blue;
}
/* SCSS */
.element {
&hover {
color: blue;
}
}
/* CSS */
.elementhover {
color: blue;
}
/* SCSS */
.element {
& .hover {
color: blue;
}
}
/* CSS */
.element .hover {
color: blue;
}
/* SCSS */
.element {
&-hover {
color: blue;
}
}
/* CSS */
.element-hover {
color: blue;
}
/* SCSS */
.element {
&.hover {
color: blue;
}
}
/* CSS */
.element.hover {
color: blue;
}
/* SCSS */
.element {
&:hover & {
color: blue;
}
}
/* CSS */
.element:hover .element {
color: blue;
}
/* SCSS */
.element {
&:hover {
& {
color: blue;
}
}
}
/* CSS */
.element:hover {
color: blue;
}
Mixins
- @mixin
- Can obtain full CSS rules
- Define styles that can be re-used without needing non-semantic classes
- Can take arguments which allows you to produce a wide variety of styles with very few mixins
- May contain:
- selectors, possibly mixed with properties
- parent references
/* SASS EXAMPLE */
@mixin corners($radius, $color) {
border-radius: $radius;
border-top-right-radius: $radius * 2;
border-top-right-radius: $radius * 2;
border-bottom-left-radius: $radius * 2;
a {
color: $color;
}
}
.block1 {
@include corners(2px, green);
}
.block2 {
@include corners(5px, red);
background: #00f;
}
/* CSS OUTPUT */
.block1 {
border-radius: 2px;
border-top-right-radius: 4px;
border-bottom-left-radius: 4px;
}
.box a {
color: green;
}
.block2 {
border-radius: 5px;
border-top-right-radius: 10px;
border-bottom-left-radius: 10px;
background: #00f;
}
.button a {
color: red;
}
Extend
- Written as @extend
- Allows you to extend attributes from a class or id onto another selector
/* SASS EXAMPLE */
%bar {
height: 14px;
font-size: 10px;
> div {
float: left;
clear: none;
}
}
.menu {
@extend %bar;
background: #333;
}
.nav {
@extend %bar;
}
/* CSS OUTPUT */
.menu, .nav {
height: 14px;
font-size: 10px;
}
.menu > div, .nav > div {
float: left;
clear: none;
}
.menu {
background: #333;
}
Sass libraries
- Help you to build your project faster & cleaner
- If you use a library, stick to its conventions
- UI frameworks:
- Bootstrap
- Foundation CSS
- Focussed on tools to write better Sass:
- Bourbon
- Compass
Functions
- Works with a value of a style attribute
- Possible to use inbuild functions or to create them
- Portable for next projects
- Best practice:
- Use short names
- Use functions to calculate values
- No camelCase or snake_case
@function function-name($arg1, $arg2) {
@return $arg1 + $arg2
}
.element {
padding: function-name(20px, 15px);
}
Create a function
.element {
padding: 35px;
}
Output in CSS
Add function to element & add values
Media queries
- Nest your media queries
- Always add them to the bottom
- It's possible to use variables
/* SASS EXAMPLE */
.container {
.left {
background: #000;
color: #fff;
margin: 5px;
float: left;
width: 100px;
a {
display: block;
color: #fff;
}
@media (max-width: 480px) {
width: 95%;
a {
display: inline;
color: #333;
}
}
}
.content {
margin: 5px;
background: #eee;
display: inline-block;
width: 60%;
@media (max-width: 480px) {
width: 95%;
background: #00f;
}
}
}
/* CSS OUTPUT */
.container .left {
background: #000;
color: #fff;
margin: 5px;
float: left;
width: 100px;
}
.container .left a {
display: block;
color: #fff;
}
@media (max-width: 480px) {
.container .left {
width: 95%;
}
.container .left a {
display: inline;
color: #333;
}
}
.container .content {
margin: 5px;
background: #eee;
display: inline-block;
width: 60%;
}
@media (max-width: 480px) {
.container .content {
width: 95%;
background: #00f;
}
}
Interpolation and if/else loops
- Interpolation: slotting values into other values
- Built in Ruby, which uses #{} for expression substitution
- @if statement can be followed by several @else if statements and one @else statement
/* SASS EXAMPLE */
@mixin color-class($color) {
.#{$color}.color {
color: $color;
background-image: url("images/#{$color}.jpg");
@if $color == red {
border: 5px solid red;
}
}
}
@mixin block($width) {
@if $width > 100px {
padding: 0px;
} @else if $width == 100px {
padding: 15px;
.heading {
content: "Dis man";
}
} @else {
padding: 10px;
}
}
div {
@include block(100px);
}
@include color-class(blue);
@include color-class(red);
/* CSS OUTPUT */
div {
padding: 15px;
}
div .heading {
content: "Dis man";
}
.blue.color {
color: blue;
background-image: url("images/blue.jpg");
}
.red.color {
color: red;
background-image: url("images/red.jpg");
border: 5px solid red;
}
Loops with @for and @each
- @for repeatedly outputs a set of styles. For each repetition, a counter variable is used to adjust the output.
- @each sets $var to each item in the list or map, then outputs the styles it contains using that value of $var.
/* SASS EXAMPLE */
.block {
width: 100%;
height: 10px;
}
@each $member in vishu, effi, ian {
.company.#{$member} {
background: url("images/#{$member}.jpg")
}
}
@for $i from 1 through 3 {
.block:nth-child(#{$i}) {
background: darken(white, $i);
}
}
/* CSS OUTPUT */
.block {
width: 100%;
height: 10px;
}
.company.vishu {
background: url("images/vishu.jpg");
}
.company.effi {
background: url("images/effi.jpg");
}
.company.ian {
background: url("images/ian.jpg");
}
.box:nth-child(1) {
background: #fcfcfc;
}
.box:nth-child(2) {
background: #fafafa;
}
.box:nth-child(3) {
background: #f7f7f7;
}
Mixin, variables, interpolation
and @each loop
/* SASS EXAMPLE */
@mixin block($size: 15px, $color: red, $display: block) {
width: $size;
height: $size;
background: $color;
display: $display;
}
.block {
@include block($display: inline);
}
@mixin company($department, $members...) {
@each $member in $members {
.#{$department}.#{$member} {
background: url("images/#{$department}/#{$member}.jpg")
}
}
}
@include company(development, maria, victoria, geordy);
@include company(systems, daniel);
/* CSS OUTPUT */
.block {
width: 15px;
height: 15px;
background: red;
display: inline;
}
.development.maria {
background: url("images/development/maria.jpg");
}
.development.victoria {
background: url("images/development/victoria.jpg");
}
.development.geordy {
background: url("images/development/geordy.jpg");
}
.systems.daniel{
background: url("images/systems/daniel.jpg");
}
Any questions?
Sass advanced
By Kim Massaro
Sass advanced
Introduction to the more advanced way of using Sass.
- 914