Les éléments de style
Ils définissent l'aperçu de notre site ou app
Très important pour l'opinion de clients ou utilisateurs
Approche "artisanale"
- Guides de style
- Patterns UI
- Mais comment réutiliser notre code ?
CSS
Language en cascade avec des prioritées
Modularité réduite
De moins en moins simple
style > id >attributs et pseudo-classes > éléments noms et pseudoéléments
@import url("mystyle.css"); //Au niveau du projet
.classes // Au niveau du code
- media queries
- animations
- transitions
- ...
SASS
Qu'est-ce que c'est SASS
- Préprocesseur
- Super ensemble de CSS3
- Deux syntaxes
- SCSS
- SASS
SASS
Fonctionnalités
- Imports et partials
- Variables
- Nesting
- Mixins, fonctions, extends
- Contrôle de flux
SASS
Partials et imports
Partials : chargés seulement si importés
Import : un seul fichier, une seule requête
@import 'my-partial';
_nom-fichier.scss
SASS
Variables
- Numbers
- Strings
- Colors
$n : 20;
$v : 50em;
$sum : $n + 10; // + - * / %
$mod : $v % 10; // < > <= >=
$min : $n - 10px; // Différentes unités
$mul : $v * $v; // Aime pas em * em
_________________________________________
$str1 : "Viva" ;
$str2 : Vegas ;
$str3 : $str1 + "las" + $str2;
.class-#{$str1} { border: 0; }
_________________________________________
$red : #f00;
$blue : rgba(0,0,255,1);
$magenta : $red + $blue;
SASS
Variables
- Boolean, null
- Lists
- Maps
$b: true;
$null: null;
_________________________________________
$list: "a" "b" "c";
$list: (
("1.1", "1.2", "1.3"), // length, index
("2.1", "2.2", "2.3"), // nth, set-nth
("3.1", "3.2", "3.3") // join, ...
);
_________________________________________
map: (
cle1: #valeur1, // get, merge,
cle2: #valeur1, // remove, values,
cle3: #valeur1, // has-key, ...
)
SASS
Nesting
.aside{
padding: 5px;
@media (screen) and (min-width: 40em) { // Media query imbriquée
padding: 0px;
}
&-right { float:right; } // Sélecteur père
.button {
padding: 2px;
a:hover { color: red;}
}
}
.aside {
padding: 5px; }
@media (screen) and (min-width: 40em) {
.aside {
padding: 0px; } }
.aside-right {
float: right; }
.aside .button {
padding: 2px; }
.aside .button a:hover {
color: red; }
SASS
Modularité
- Mixin
- Function
- Extend
@mixin border($c, $s){
border-color: $c;
border-size: $s; }
@function mult($a, $b:3){
@return $a + $b; }
.nav{ @include border(red, 3px); }
.nav-big {
@extend %nav;
border-size: mult(4);
font-size: 120%;
}
________________________________________
.nav, .nav-big {
border-color: red;
border-size: 3px;
border-type: solid; }
.nav-big {
border-line: 7;
font-size: 120%; }
SASS
Contrôle de flux
p {
@if 1 + 1 == 2 { border: 1px solid; }
@if 5 < 3 { border: 2px dotted; }
}
p {
border: 1px solid; }
@If
SASS
@for $i from 1 through 3 {
.item-#{$i} { width: 2em * $i; }
}
.item-1 {
width: 2em; }
.item-2 {
width: 4em; }
.item-3 {
width: 6em; }
@for
Contrôle de flux
SASS
@each $animal in puma, sea-slug, egret, salamander {
.#{$animal}-icon {
background-image: url('/images/#{$animal}.png');
}
}
.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"); }
@each
Contrôle de flux
SASS
$i: 6;
@while $i > 0 {
.item-#{$i} { width: 2em * $i; }
$i: $i - 2;
}
.item-6 {
width: 12em; }
.item-4 {
width: 8em; }
.item-2 {
width: 4em; }
@while
Contrôle de flux
SASS
Best practices
SASS
Best practices
.l-elements {
...
@media (min-width: 30em) { //media queries
padding: 5px;
}
&Huge { ... } // Sous classes
& > .l-element { ... } // Descendents liés
.a { ... // Eléments afficheés toujours pareil
&:visited { ... } // Pseudo-états, pseudo-classes, attributs, ...
}
Nesting : oui mais pas beaucoup
Pas plus de 3, 4 niveaux de profondeur ?
SASS
Best practices
.table-download .not-avaliable, .table-download
.table-download .link.active, .wrap-timer, .wra
.wrap-timer h4 span, .wrap-timer h4 a, .timer,
.btn, .btn.second, .btn span, .btn:hover, .btn:
.btn.subscribe, .btn.active, .btn.active span,
.download-ready, .ico-first, .ico-discount, .ic
.box-bottom, .box-bottom ul, .box-bottom ul li,
.box-bottom ul li a, .box-bottom ul li a:hover,
.agree label, .footer, .footer .in, .footer p,
.footer ul li, .footer ul li:first-child, .foot
.footer ul li a:hover, .file-manager-panel, .fi
.file-manager-panel a span, .filesystem-index,
.filesystem-index .selected-info .selected-ico,
.filesystem-index .selected-info .folder-ico,
Attention aux extend
Code moche
Fragmentation
SASS
Best practices
Mixins are fine
Répétition de code
Pas très grave Styles "possédés" par le sélécteur
SASS
Best practices
Continuer à faire des CSSs
Rester proche de la filosophie du language
Logique et automatisation oui, mais...
Examiner les styles générés
SASS
Best practices
Sémantique
HTML : lié aux contenus
SASS : lié aux contenus et aux éléments de design
<header>
...
<img class="logo" ... />
<nav class="mainNav">...</nav>
...
</header>
.mainNav {
%extend %clearfix;
@include l-grid(4);
@include border($big);
& > .link {
@include hover($primary, large);
@extend %font-nav; }
}
SASS
Ressources
La doc
The Sass Way
Compass
Plugins SASS: susy, breakpoint, ...
SASS
SMACSS
Scalable and Modular Architecture for CSS
SMACSS
"SMACSS is more style guide than rigid framework. [...] SMACSS is a way to examine your design process and as a way to fit those rigid frameworks into a flexible thought process."
-Jonathan Snook
Pour quoi?
Complexité croissante Réduction de temps Réutilisation Cohérence DRY
SASS
Catégorisation
Catégorisation
Base Layout Module State Theme
Base
Éléments, descendants, fils Pas de classes ou d'Ids
Styles globaux
Resets
body, form {
margin: 0;
padding: 0;
}
a {
color: $color-1;
&:hover {
color: $color-2;
}
}
Layout
Majeures : zoning de la page
Layout
#header, #article, #footer {
width: 960px;
margin: auto;
}
Majeures : zoning de la page Modificateurs : préférences d'affichage
#article {
float: left;
.l-flipped & {
float: right;
}
}
Layout
Mineures : arrangement des éléments
Layout
div#products ul { // Seulement une grille de produits par page
margin: 0; // Notre HTML sera toujours une liste
padding: 0;
list-style-type: none;
li {
float: left; // Les éléments de la liste flottent à gauche
margin: 0 0 10px 10px;
}
}
.l-grid { // Pas lié à une structure particulière
margin: 0; // Selecteurs peu spécifiques
padding: 0;
list-style-type: none;
& > .l-grid-item { // Profondeur réduit : 2 niveaux
display: inline-block;
margin: 0 0 10px 10px;
}
}
Mineures : arrangement des éléments
Layout
- Ids #header, #footer
- Classes .header, .footer
- Éléments HMTL5 header, footer, ...
Quels sélecteurs utiliser
Cohérence dans le projet
Valeur sémantique des balises
Modules
Les composants de notre page
Modules
- Carrousel
- Dialogue
- Formulaire de login
- ...
Les composants de notre page
Réutilisables : utiliser des classes
Indépendants du HTML : éviter les sélecteurs d'éléments
Modules
Référencer des descendants directs
Définir sémantiquement la structure du module
.mod {
color: blue;
h1 { // :)
color: red;
}
span { // :(
color: white;
}
& > img { // Périmètre reduit
border-radius: 3px;
}
.mod-body { // Un sous élément
padding: 10px;
}
}
Modules
Déclinaison des modules et sous modules
.mod {
&Inversed {
color: red;
h1 {
color: blue;
}
}
&Mini {
widht: 50%;
}
}
<div class="mod modInversed" ...> ... </div>
<div class="mod modMini modInversed" ...> ... </div>
States
Règles qui augmentent et "overrident" les styles d'unélément :
Applicables à layouts et modules
Liés à une dépendence JS : interaction UI
States
Règles qui augmentent et "overrident" les styles d'un élément :
// Générales
.is-hidden {
display: none;
}
.is-error {
border-color: red!important;
}
// Liés à un module
.module {
...
.is-&-collapsed {
...
}
}
Themes
Détails qui conforment le "look and feel" de notre page
Applicables à layouts, modules et states
Customisation et theming
Internationalisation
Themes
Définis globalement, liés à des composants, ...
.button {
border: 1px solid;
}
.theme-dark button {
border-color: white;
}
.theme-steel.button {
border-color: grey;
}
< ... class ="theme-dark" ... >
...
<a class="button">...</a>
...
<a class="{{theme}} button" ..>...</a>
Comment...
Comment ... ?
Guide de style et normes de developpement
Commencer par des cibles précises et bien identifiables
Intégrer les styles existants dans le projet et migrer au fur et à mesure
Comment ... ?
Architecture simple
Comment ... ?
Architecture complèxe
Ippevent
By brei
Ippevent
- 39