Bienvenue sur le CSS Style guide de la société SLEEDE. L'objectif de ce document est de présenter les outils et les bonnes pratiques de l'intégrateur web au sein de l'agence. C'est avant tout une compilation d'outils et de pratiques que nous utilisons tous les jours. Vous pourrez facilement l'adapter à votre équipe!
- Bonnes pratiques: un code lisible et maintenable
- Sass et Compass
- Les méthodes de travail
- Outils et veille technologiques
- Nom de classe en minuscule avec tiret:
name, name-header
. - Choisir des noms de classe explicite.
- Indenter le code avec 2 espaces.
- Indenter les relations entre les sélecteurs (parent > enfant).
- Classer les propriétés par type:
- Boîte
- Bordure
- Fond
- Texte
- Autres
- Indenter les valeurs CSS3 complexes si besoin
- Utiliser les raccourcis CSS:
border, margin, padding, font, list-style, background
. - Commenter le code pour:
- Détailler un usage particulier
- Expliquer les bogues corrigés
- Signaler une modification
- Utiliser majoritairement les class pour le CSS, et les ID pour le JS.
- Garder une spécificité basse dans votre code: éviter par exemple
#id .class #id2
- Utiliser les micro données et les micro formats
- Exemple: indenter et espacer correctement le code:
.element-simple { margin: 0; } .element-alpha, .element-simple { margin: 0; } #header .element { top: 0; right: 0; bottom: 0; left: 0; margin: 1em; }
<!--[if lt IE 7]> <html class="ie6"> <![endif]-->
<!--[if IE 7]> <html class="ie7"> <![endif]-->
<!--[if IE 8]> <html class="ie8"> <![endif]-->
<!--[if IE 9]> <html class="ie9"> <![endif]-->
<!--[if gt IE 9]><!--> <html> <!--<![endif]-->
- Utiliser le script Modernizr.js pour détecter les capacités du navigateur.
<html lang="fr" class="js no-touch postmessage history multiplebgs no-boxshadow opacity cssanimations csscolumns cssgradients csstransforms csstransitions fontface localstorage sessionsstorage svg inlinesvg blobbuilder bloburls download formdata">
.box { box-shadow: #999 0 0 5px; } .no-boxshadow .box { border: 1px solid #ddd; }
- Déclencher le mode compatibilité le plus élevé d'Internet Explorer
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
- Utiliser l'encodage Unicode
<meta charset="utf-8" />
- Utiliser un reset CSS sélectif
- Bien ranger ses fichiers et fragmenter le code > 500 lignes (reset, typo, form, grid, layout, global, application, pages, print, ie...)
- Ajouter une css pour le média Print.
- Récapitulatif de l'entête d'une page html
<!DOCTYPE html> <!--[if lt IE 7]> <html class="ie6"> <![endif]--> <!--[if IE 7]> <html class="ie7"> <![endif]--> <!--[if IE 8]> <html class="ie8"> <![endif]--> <!--[if IE 9]> <html class="ie9"> <![endif]--> <!--[if gt IE 9]><!--> <html> <!--<![endif]--> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <!-- Meta Charset (à placer avant title pour des raisons de sécurité) --> <meta charset="utf-8" /> <title>Titre de la page</title> <!-- Un seul fichier css minifiée et sans @import dedans --> <link href="styles.css" media="screen,projection" rel="stylesheet" /> <link href="print.css" media="print" rel="stylesheet" /> <!-- A charger dans le head, après les CSS, pour éviter un "Flash of unstyled content" --> <script src="modernizr.js"></script> </head>
- L'amélioration progressive
/* Par défaut, on affiche le contenu de l'accordéon */ .accordeon-contenu { display: block; } /* Si JavaScript est activé, on masque le contenu de l'accordéon */ .js .accordeon-contenu { display: none; }
- La dégradation gracieuse (ou tolérance à l'erreur)
/* Par défaut, on masque le contenu de l'accordéon */ .accordeon-contenu { display: none; } /* Si JavaScript n'est pas activé, on affiche le contenu de l'accordéon */ .no-js .accordeon-contenu { display: block; }
- Tester encore et encore
- Tester pendant le prototypage, et à la fin.
- Réaliser un styles guide (gros projet) et le tester.
- Utiliser les outils de diagnostics (Debugger, CSS Lint, Grep ...)
- Utiliser des machines virtuelles ou des outils de tests (type Litmus).
- Utiliser des frameworks si besoin
OOCSS permet de séparer la structure (dimensions, marges, position) de l'apparence (bordures, couleurs, images). L'apparence est décrit par la classe et non par le tag.
- Voici un exemple de boutons sans OOCSS
<a class="primary-action">Envoyer le message</a> <a class="secondary-action">Annuler</a>
.primary-action { padding: .5em 1em; display: inline-block; line-height: 1.5em; height: 1.5em; border-radius: 10px; margin: 0 5px 0 0; background: black; color: #fff; font-weight: bold; box-shadow: #000 0 0 5px; } .secondary-action { padding: .5em 1em; display: inline-block; line-height: 1.5em; height: 1.5em; border-radius: 10px; margin: 0 5px 0 0; background: #eee; border: 1px solid #ddd color: #555; padding: 0.25em 1em; text-shadow: #fff 0 1px 0; }
- Avec OOCSS
<a class="button primary-action">Envoyer le message</a> <a class="button secondary-action">Annuler</a>
/* Structure */ .button { padding: .5em 1em; display: inline-block; line-height: 1.5em; height: 1.5em; border-radius: 10px; margin: 0 5px 0 0; } /* habillage */ .primary-action { background: black; color: #fff; font-weight: bold; box-shadow: #000 0 0 5px; } .secondary-action { background: #eee; border: 1px solid #ddd color: #555; padding: 0.25em 1em; text-shadow: #fff 0 1px 0; }
- Exemple de code à éviter:
Les styles relatifs à #sidebar h2 ne seront pas réutilisable et h2 ne pourra être déplacé ou devenir un h1. Préférez:
#sidebar h2 { ... }
.en-tete { ... }
- OOCSS prend toute sa mesure sur des projets plus important avec de nombreux gabarits. Plus d'informations: Documentation OOCSS
- Utiliser de manière simplifié une checklist (type OpQuast)
- Ne pas rechercher la perfection sémantique (dans le doute, on utilise
div
). - Accepter (et faire accepter) un rendu différent sur certains navigateurs tout en assurant un contenu toujours accessible.
- Utiliser l'unité `em dans des contextes relatifs mais pas à outrance.
- Règles imbriqués: attention à ne pas en abuser, spécialisation importante des sélecteurs
- Exemple de code mauvais généré:
body#homepage #navigation #home-link { ... }
- Règle de l'inception: 4 niveaux max d'imbrication.
- Exemple de code mauvais généré:
- Référencer le sélecteur courant ou parent avec &
/* Référencer le sélecteur courant */ .bouton { /* Propriétés du bouton */ &.rechercher { /* Propriétés du bouton de recherche */ &:hover { /* Propriétés du bouton de recherche survolé */ } } } /* Référencer le sélecteur parent Code en sortie: .ie7 .element { ... } */ .element { .ie7 & { margin-left: 5px; } }
- Les commentaires
/* Commentaire apparent dans la source après compilation */ // Commentaire Sass, ne sera pas compilé
- Les variables
$links: #08F; a { color: $links }
- Les mixins
@mixin mon-mixin { color: red; } .ma-regle { @include mon-mixin; }
- Les Mixin avec arguments
@mixin box-shadow($arguments: none) { -moz-box-shadow: $arguments; // Firefox -webkit-box-shadow: $arguments; // WebKit box-shadow: $arguments; // Standard } .button { @include box-shadow(1px 1px 3px red); }
- Attention aux volumes de code css générés!
- Etendre une class:
@extend
.rounded { -webkit-border-radius: 5px; -moz-border-radius: 5px; -border-radius: 5px; } .button { @extend .rounded; } input[type="text"] { @extend .rounded; } /* CSS compilée: les propriétés n'apparaissent plus qu'une seule fois dans le code. */ .rounded, .button, input[type="text"] { -webkit-border-radius: 5px; -moz-border-radius: 5px; -border-radius: 5px; }
- Import de partial (_partial.scss) avec la directive
@import 'partial'
- Utilisation du module de couleurs:
rgba, transparentize, opacify, saturate, lighten, darken
Les avantages à utiliser compass:
- Reset embarqué
- Helper images, urls ...
- CSS3 sans préfixes
- Data URI
- Génération de sprites
- Effets CSS3 plus facile
- Utiliser des variables
- Définir des jeux de polices (stack-fonts)
- Créer des mixins
- Etendre des classes (@extend)
- Mieux, une combinaison de mixin avec @extend
- Gestion des navigateurs particuliers avec les sélecteurs parents (ie)
- Compresser le css (avec Least par exemple)
- Communiquer avec:
- Le graphiste (typo, css3, design mobile, hover, js, bande passante)
- Ajuster la maquette graphique en amont afin de détecter:
- Les images trop lourdes
- Un comportement non natif (ex formulaire)
- Une Structure incompatible avec le SEO
- Trop de teintes ou de typographies différentes.
- Ajuster la maquette graphique en amont afin de détecter:
- Le dev (qu'est ce que je peux modifier sans risques ?)
- Le graphiste (typo, css3, design mobile, hover, js, bande passante)
- Documenter son code(commentaire, style guide ...)
- Faire des commits intelligibles (Git)
- S'inspirer des bonnes pratiques (pattern)
- Créer des objets simple, facile à combiner / comprendre.
- Favoriser le code simple et compréhensible
- Ne pas documenter
- Réinventer la roue
- Factoriser trop tôt le code
- Ne pas tester
- Utiliser des techniques derniers cris
- Varier les conventions
- Ne pas communiquer au sein de l'équipe
- Ne pas versionner son code
- Ne pas faire de veille.
- Rechercher la perfection
- Repousser le nettoyage de son code
- Utiliser des styles inline et des !important
- Sur spécifier les propriétés
- Multiplier les propriétés (couleurs, tailles, margin 0, padding 0)
- Etudier le design (cahier des charges, maquettes ...)
- Déduire des motifs récurrents (boîtes, menus, éléments dynamiques, boutons ...)
- Définir une base typographique
- Coder la structure générale (Header, menu, colonnage, footer)
- Coder les modules
- Coder les exceptions (par pages): ex 1 page = 1 class (utilisation du body)
- Valider le code
- Rechercher une solution dans les moteurs
- Isoler le problème dans un environnement contrôlé (reduced test)
- Demander de l'aide (JS Fiddle, forum Alsacréation, Stack overflow, doctype, dabblet ...)
- Communiquer la résolution du problème (blog, twitter)
Il ne s'agit pas d'une activité pour se tenir au courant, mais d'une activité intrinsèque à notre métier, inscrite dans nos missions. Cela comporte de nombreux avantanges:
- Anticiper les avancées technologiques
- Améliorer la qualité et la productivité
- Créer d'avantages
- Ne pas réinventer la roue
- Augmenter ses compétences
- Diffuser l'information à l'équipe
Mise en place:
## Références & docs- Simple as Milk
- Clearleft.com
- Smashing magazine
- A list apart
- Alsacréation
- Pompage.net
- Openweb
- wdfriday.com
- 24ways
- Css4design
- Blogs & twitters
- CSS Lint: diagnostic en ligne
- Litmus: tester vos pages et vos e-mails
- HTML5 Boilerplate: boîte à outils de l'intégrateur
- styleneat: ordonner les propriétés CSS
- Least: imbriquer vos sélecteurs automatiquement
- W3C Checklink: validateur de liens
- Colour Contrast Check: analyseur de contrastes
- GTmetric: analyse des performances