Thierry Michel
Passionné par l'optimisation et en quête du workflow idéal, je dresse des pixels chez @epicwebagency en tant que lead front-end developer.
CSS has no abstraction at all and is highly repetitive. While that simplicity was key to its adoption, it makes it unwieldy for us today.
Préface de Sass for web designers, par Chris Coyer
ou le coup de boule de Zinedine Zidane…
Programme qui procède à des transformations sur un code source, avant l'étape de traduction proprement dite (compilation ou interprétation).
Wikipédia
Sass est un métalangage, en amont de CSS,
à la syntaxe simplifiée et élégante
qui implémente diverses fonctionnalités utiles à la création et la gestion
des feuilles de styles.
Il est analysé et compilé en langage CSS classique, compréhensible par le navigateur.
Compilation…
Un petit dessin vaut parfois mieux qu'une longue définition…
Á noter également que @garcimor ne fait pas partie de la team…
Tu codes comme un flan en CSS, tu coderas comme un super flan en SASS !
➤ *Sache (Find Sass and Compass extensions)
le Terminal quoi...
Shut Up and Shell : ➤ The Command Line Crash Course
le Terminal quoi...
$ gem install sass
$ sass --watch style.scss:style.css
$ sass --watch dev:css
$ est un placeholder pour l'invite de votre terminal. Vous ne devez pas le saisir.
.doodle {
color: #d00dle;
}
.doodle
color: #d00d1e
nested (default)
expanded
compact
compressed
Quel que soit le format choisi,
ne jamais éditer directement les fichiers .css !!!
main.scss
@import 'normalize';
@import 'path/to/file.scss';
@import 'compass/layout';
@import 'partial'; /* nom du fichier : _partial.scss */
css “classique”
nav {
overflow: hidden;
}
nav li {
float: left;
}
nav li a {
display: block;
}
scss
nav {
overflow: hidden;
li {
float: left;
a { // nav ul li a = 4 niveaux !
display: block;
}
}
}
scss
a {
color: #dec0de;
&:hover { // & = a
color: #c0dec5;
}
}
output
a { color: #dec0de; }
a:hover { color: #c0dec5; }
scss
.nav {
a {
display: block;
.touch & { // & = .nav a
min-height: 44px;
}
}
output
.nav a { display: block; }
.touch .nav a { min-height: 44px; }
// n'apparaît pas à la sortie
/*
apparaît à la sortie
sauf si output style = compressed
*/
/*!
apparaît à la sortie
quel que soit le mode…
*/
scss
$width: 5em;
$color: #5a1ade;
main {
width: $width;
background-color: $color;
}
a {
color: $color;
}
output
main { width: 5em; background-color: #5a1ade; }
a { color: #5a1ade; }
Tout ce qui est susceptible d'être modifié => VARIABLE !
scss
$number: 10; // 10, 3.5, 2em
$string: "texte"; // "foo", 'bar', baz
$color: #f1a5c0; // black, #000, rgba(0,0,0,0.5)
$boolean: true; // true, false
$list: (a b c d); // ou ('a', 'b', 'c', 'd')
$map: (
key1: value1,
key2: value2
);
Différents opérateurs [+,-,*,/,%]
scss
$margin: 1em;
$color: #010203;
$wtf: "Comic Sans";
main {
margin-bottom: $margin * 2; // 2em
color: $color * 2; // #020406
background: $color + #102030; // #112233
font-family: $wtf + " MS"; // "Comic Sans MS"
}
css “classique”
h1, h2 {
font-weight: 700;
font-style: italic;
} // L32
…
aside .more { font-weight: 700; } // L468
…
.submit { font-weight: 700; text-transform: none; } // L1220
…
footer .note { font-weight: 700; font-size: 2em; } // L2675
…
css
h1, h2, aside .more, .submit, footer .note { font-weight: 700; } h1, h2 { font-style: italic; }
…
base/_typography.scss
h1, h2 {
font-weight: 700;
font-style: italic;
} // L2
…
aside .more { font-weight: 700; } // L14
…
.submit { font-weight: 700; } // L27
…
footer .note { font-weight: 700; } // L32
…
base/_typography.scss
.font-bold {
font-weight: 700;
}
h1, h2 {
@extend .font-bold;
font-style: italic;
}
…
output
.font-bold, h1, h2, aside .more, .submit, footer .note {
font-weight: 700;
}
h1, h2 {
font-style: italic;
}
base/_typography.scss
%font-bold {
font-weight: 700;
}
h1, h2 {
@extend %font-bold;
}
…
output
h1, h2, aside .more, label.error, .submit, footer .note {
font-weight: 700;
}
h1, h2 {
font-style: italic;
}
.button:hover {
-webkit-transform: scale(1.5);
-ms-transform: scale(1.5);
transform: scale(1.5);
}
header { margin: 0 auto; border-bottom: 1px solid #b4d455; …}
aside { margin: 0 auto; border-left: 1px solid #b4d455; …}
footer { margin: 0 auto; border-top: 1px solid #b0de6a; …}
scss
@mixin scale {
-webkit-transform: scale(1.5);
-ms-transform: scale(1.5);
transform: scale(1.5);
}
.button:hover {
@include scale;
}
output
.button:hover {
-webkit-transform: scale(1.5);
-ms-transform: scale(1.5);
transform: scale(1.5);
}
scss
@mixin scale {
-webkit-transform: scale(1.5);
-ms-transform: scale(1.5);
transform: scale(1.5);
}
@mixin scale2 {
-webkit-transform: scale(2);
-ms-transform: scale(2);
transform: scale(2);
}
@mixin scale32 {
-webkit-transform: scale(32);
-ms-transform: scale(32);
transform: scale(32);
}
scss
@mixin scale($value) {
-webkit-transform: scale($value);
-ms-transform: scale($value);
transform: scale($value);
}
.button:hover {
@include scale(1.5);
}
output
.button:hover {
-webkit-transform: scale(1.5);
-ms-transform: scale(1.5);
transform: scale(1.5);
}
scss
@mixin scale($value: 1.5) {
-webkit-transform: scale($value);
-ms-transform: scale($value);
transform: scale($value);
}
.button:hover {
@include scale();
}
output
.button:hover {
-webkit-transform: scale(1.5);
-ms-transform: scale(1.5);
transform: scale(1.5);
}
utils/_mixins.scss
@mixin set-border($side: top, $width: 1px, $color: black) {
border-#{$side}: $width solid $color;
}
utils/_helpers.scss
%center-block {
margin: 0 auto;
}
layout/_header.scss
header {
@extend %center-block;
@include set-border(bottom, $color: #b4d455);
}
layout/_footer.scss
footer {
@extend %center-block;
@include set-border(top, $color: #b0de6a);
}
@mixin button($color: #666) {
background: $color;
:hover {
background: lighten($color, 15%);
}
:active {
background: darken($color, 15%);
}
}
.confirm {
@include button(green);
}
.cancel {
@include button(red);
}
scss
@function rem($value, $base: 16) {
@return $value / $base * 1rem;
}
h1 {
font-size: rem(42);
}
.more {
font-size: rem(24);
}
output
h1 { font-size: 2.625rem; }
.more { font-size: 1.5rem; }
Sass permet l'imbrication, bien pratique, des règles @media
scss
.sidebar {
width: 100%;
@media screen and (min-width: 40em) {
width: 40%;
float: right;
}
}
output
.sidebar { width: 100%; }
@media screen and (min-width: 40em) {
.sidebar { width: 40%; float: right; }
}
scss
// définition des breakpoints*
$bp: (
small: 36em,
medium: 48em,
large: 62em
);
// et le mixin qui-va-bien…
@mixin mq($size) {
@media (min-width: map-get($bp, $size)) {
@content;
}
}
* les types “map” sont disponibles depuis la version 3.3 de Sass
scss
.sidebar {
width: 100%;
@include mq(small) {
width: 40%;
float: right;
}
}
output
.sidebar { width: 100%; }
@media screen and (min-width: 40em) {
.sidebar { width: 40%; float: right; }
}
$boolean: true;
@mixin display {
@if($boolean == true) {
display: block;
} @else {
display: none;
}
}
.foo {
@include display; // display: block;
}
scss
$slugs: small medium large !default;
@for $i from 1 through length($slugs) {
.#{nth($slugs, $i)} {
width: 20em * $i;
}
}
output
.small { width: 20em; }
.medium { width: 40em; }
.large { width: 60em; }
scss
$slug: span !default;
$width: 60px;
$margin: 20px;
@for $i from 1 to 4 {
.#{$slug}-#{$i} {
width: ($width + $margin) * $i - $margin;
}
}
output
.span-1 { width: 60px; }
.span-2 { width: 140px; }
.span-3 { width: 220px; }
scss
$colors: red blue green !default;
@each $color in $colors {
.#{$color} {
color: $color;
}
}
output
.red { color: red; }
.blue { color: blue; }
.green { color: green; }
scss
$colors: (
error: red,
info: blue,
success: green
) !default;
@each $label, $color in $colors {
.#{$label} {
color: $color;
}
}
output
.error { color: red; }
.info { color: blue; }
.success { color: green; }
Et bien d'autres choses ! ^^
Un petit dessin vaut parfois mieux qu'une longue définition…
Compass est une extension “CSS3” qui utilise Sass.
C'est une roue (parmi d'autres) que vous ne devez pas inventer.
C'est aussi un excellent moyen de mieux comprendre
et d'approfondir votre connaissance de Sass.*
* comme avec beaucoup d'autres frameworks…
installation
$ gem update --system
$ gem install compass
création projet
$ compass create <nom-de-mon-projet>
main.scss
@import "compass";
output
main.scss
@import "compass";
@import "compass/reset";
@import "compass/layout";
pour l'utilisation de ces modules.
La plupart des modules sont composés de sous-modules
qui peuvent être importés séparément
main.scss
// @import "compass";
@import "compass/css3";
@import "compass/typography";
…
main.scss
// @import "compass";
// @import "compass/css3";
@import "compass/css3/border-radius";
@import "compass/css3/font-face";
…
NB : Ces modules ne générant aucun code CSS, … hum…
Un petit exemple et puis…
scss
@import "compass";
a {
@include link-colors(#acce55, #1abe15);
@include border-radius(20px);
}
output
a {
color:#acce55;
-webkit-border-radius:20px;
-moz-border-radius:20px;
border-radius:20px;
}
a:hover { color:#1abe15 }
mode classique
$var: "foo";
$var: "bar"; // $var = "bar";
mode "par défaut"
$var: "foo";
$var: "bar" !default; // $var = "foo";
$var: "bar" !default; // $var = "bar";
$default-border-radius: 5px !default;
utils/_variables.scss
$default-border-radius: 20px;
main.scss
@import "utils/variables";
@import "compass"; // $default-border-radius = 20px
Allez, je craque quand même pour…
scss
@import "compass";
@import "social/*.png";
@include all-social-sprites;
output
.social-sprite, .social-github, .social-googleplus, … {
background-image: url('/img/social-s8ecd8521e9.png');
background-repeat: no-repeat;
}
.social-github {
background-position: 0 0;
}
.social-github:hover, .social-github.github-hover {
background-position: -64px 0;
}
.social-googleplus {
background-position: -128px 0;
}
…
Sass : boostez vos CSS | Frameworks CSS, démarrer avec Bootstrap | Responsive Web Design | Prototypage d'un site web
Stratégie UX, le web centré utilisateur | Mailchimp : outil d’e-mailing
Un email responsive, c’est possible | DRY, GIT, GRUNT, SMACSS … méthodologie et productivité | Se passer de jQuery | Intégrer les données du web via les APIs | Webapp, convertir son site web en application | NoSQL, plus de flexibilité dans vos projets | …
By Thierry Michel
Conf FEWEB | Bruxelles | 08 mai 2014
Passionné par l'optimisation et en quête du workflow idéal, je dresse des pixels chez @epicwebagency en tant que lead front-end developer.