CSS est un langage en perpétuelle évolution, de nouvelles spécifications voient le jour tous les ans, ajoutant de nouvelles propriétés ou en faisant évoluer certaines déjà existantes.
Certaines propriétés récentes ne sont donc pas forcement supportés par d’ancienne version de navigateurs, ou avec une syntaxe prefixée et/ou différente.
Il est donc important de se référer à une documentation à jour, maintenu par une communauté, mais également de suivre l’évolution du langage et de ces bonnes pratiques en suivant quelques blogs spécialisés.
Tous les élements HTML d’une page possèdent des styles par défaut qui sont défini par le navigateur. Vous pouvez à l’aide de CSS définir des styles personnalisés pouvant les surclasser.
Il suffit de simplement créer un fichier avec une extension .css
Dans le <head> de votre page, ajoutez une balise <link> qui pointe vers votre fichier CSS :
<link rel="stylesheet" href="adresse/de-votre/fichier.css" />
selecteur { propriété : valeur; /* déclaration */ }/* Ceci est un commentaire, qui ne sera pas analysé par le navigateur */selecteur, selecteur { propriété : valeur1; propriété : valeur1 valeur2 valeur3 valeur4; propriété : valeur1, valeur2, etc. }
Vous pouvez sélectionner directement une balise HTML. Toutes les balises du même type seront stylés.
/* Titres niveau 1 */ h1 { color : red; }/* Paragraphes */ p { color : blue; }/* Listes */ ul { color: green; }
<div class="content">
<h1> Titre de mon article </h1>
<p> <strong>Premier</strong> paragraphe de mon article </p>
<p> Deuxième paragraphe de mon article </p>
</div>
div est l’élément parent de h1, les 2 p et stongh1, p et strong sont enfants de divp est parent de strongstrong est enfant du 1er p et de divLes balises se trouvant au même niveau (côte à côté) sont appelées frères.
p est frère de h1p est frère du 1er.Les enfants héritent de certains attributs de leur parents. Essentiellement les attributs typographiques. Ce qui permet de ne définir qu’une seule fois les caractéristiques typographiques d’un bloc en sachant que tous ces enfants auront ces mêmes caractéristiques.
div {
color : red;
}
Les enfants h1, p et strong auront tous la couleur rouge.
Voilà pourquoi il est de bonne pratique de définir les caractéristiques typographiques globales d’un document (couleur, polices, interlignage, taille du texte courant) sur l’élement body ou html
inheritinherit permet de récupérer la valeur calculé du même attribut de l’élément parent. Il est permis sur toutes les propriétés.
currentcolorLes feuilles de style peuvent donc avoir trois origines différentes : l’auteur (le webmaster par exemple), l’utilisateur (l’internaute) et l’agent utilisateur (le navigateur).
La cascade décrit la façon dont ces diverses feuilles de style sont assemblées pour générer une unique feuille de style “virtuelle” qui utilise toutes les règles (implicitement déclarées ou non) de toutes ces différentes sources. Les CSS “cascadent”, ou combinent toutes ces sources entre elles.
Lorsque plusieurs sélecteurs ciblent le même élément avec des propriétés identiques, c’est la propriété de sélecteur ayant le plus de poids qui va surclasser les autres.
Auteur, utilisateur, navigateur ?
Styles auteur > styles utilisateur > styles par défaut du navigateur.
Par contre, si un utilisateur a utilisé le mot clef @ dans une propriété, elle aura le dessus sur vos styles auteur.
Au sein de nos règles auteur
!important)Au sein de nos styles externes et internes.
Le poinds des sélecteurs est la concaténation de 3 nombres (A, B, C) et se calcule de cette manière (en CSS3):
Le selecteur
.inner > ul > li > a#toto
a une valeur de
1,1,3
important!le mot clef !important ajouté juste après la valeur d’une propriété (et avant le ; de fin de propriété) donnera un poids maximum (infini) par rapport à vos autres styles auteur.
color: red !important ;
Un block formatting context (contexte de formatage block), est un contexte spécifique où un élément de type block aura un comportement différent. En effet, pour les blocs qui rentrent dans ce contexte :
Un bloc rentre dans ce contexte si :
float : left ou right.position: absolute ou fixedinline-block ou table-cell ou table-captionoverflow différente de visibleCSS accepte beaucoup d’unités de longueur différentes (cm, mm, pt, . Seront présentés ici les unités les plus couramment utilisés pour un affichage sur écran.
<font-size> du selecteur. Sauf pour <font-size> lui même qui se réfère au <font-size du parent.<font-size> de l’élement html de la page% comme unité de longueur (border, box-shadow, …)em : 100% = 1em, 120% = 1.2emLa spec CSS4 définie 141 couleurs à l’aide de mots clés.
“Tomato” versus “#FF6347”—the tragicomic history of CSS color names
L’EM est l’unité la plus utilisée (la référence) pour gérer vos tailles et espaces typographiques.
<font-size> du selecteur, sauf pour <font-size> lui même, son unité se réfère au font-size calculé de son parent.p {
font-size: 1em;
line-height: 1.5em;
}
html { font-size : 100%; /* En mettant une taille de 100% à l'élement html, vous laissez l'utilisateur choisir la taille d'affichage qui lui convient (souvent 16px par défaut) */ }h1 { font-size: 3em; /* 3x plus grand que le texte standard, Si l'utilisateur a choisi 16px : 3x16 = 48px */ line-height: 1.5em; /* Soit 1,5x la font-size du selecteur. Soit 1,5x48 = 72px */ }p { font-size: 1em; /* 1x la taille héritée, soit 100% ou 16px si c'est la valeur choisi par l'utilisateur. */ }
color : redcolor : #A1A1A1color : hsl( 30, 50%, 40%)font-family : Arial, "Helvetica Neue", Helvetica, sans-serif;font-size : 1.5em;font-style : normal | italicfont-weight : normal | bold | bolder | lighter | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900letter-spacing : normal | <length>-0.5em<font-size> du selecteur et non pas celui de son parent ou ancêtre.line-height : normal | <number> | <length>line-height : 1.5 /* S'adapte au <font-size> de l'élement même si la valeur est héritée */line-height : 1.5emtext-align: | left | right | center | justifytext-indent : <length> | <percentage>text-transform : none | capitalize | uppercase | lowercaseLa propriété font permet de déclarer en 1 seule ligne
<font-style><font-width><font-size><line-height><font-family>font : <font-style> <font-width> <font-size>/<line-height> <font-family>font : 1.5em arial, sans-serif; /* Minimum syndicale */font : 100%/1.2 georgia, serif;font : italic 2em serif;<font-size> & <font-family> sont obligatoires.<line-height> doit suivre l’attribut <font-size>, les 2 valeurs étant séparés par un /.<font-style> et <font-width> sont optionnels et doivent être placés devant <font-size>.En CSS, chaque élément sélectionnable peut être considérer comme une boite possédant divers caractéristiques, modifiables et paramétrables.
image box modèle
Les types de boites sont définis par l’attribut display.
display : none | inline | block | list-item | inline-block | inline-table | table | table-cell | table-column | table-column-group | table-footer-group | table-header-group | table-row | table-row-group | flex | inline-flex | grid | inline-grid | run-in
Toutes les boites peuvent avoir un arrière plan background.
Un background peut être défini à l’aide de plusieurs caractéristiques :
background-color: <color><bg-image>none | url(adresse/de/image.png) | inheritbackground-image : <bg-image>, <bg-image>, … ;<bg-size>cover, contain, <lenght>, auto, inheritbackground-image : <lenght>; /* Une valeur = largeur de l’image, le hauteur sera autobackground-image : <lenght> <lenght>; (largeur) (hauteur) L’image peut être déformée.background-image : <bg-size>, <bg-size>, … ;<bg-repeat>repeat, repeat-x, repeat-y, no-repeat, inheritbackground-repeat : <bg-repeat>;background-image : <bg-repeat>, <bg-repeat>… ;<bg-position>top, bottom, left, right, center, <length>background-position : left top; /* valeurs par défaut */background-position : <lenght>; /*1 valeurs = left */background-position : <lenght> <lenght>; /* 2 valeurs = left top */background-position : right <lenght> bottom <lenght>; /* mot clé + valeur = ajouter un décalage par rapport à la position du mot clé*/background-image : <bg-position>, <bg-position>… ;<bg-attachment>fixed : l’image est fixé à l’écran et se positionne par rapport au viewport.scroll : (défaut) l’image est positionné par rapport à son bloc et scroll avec lui.background-attachment : <bg-attachment>;<bg-origine>background-attachment : scrolltop left est basé sur le padding top left de la boite.border-box, padding-box (défaut), content-boxbackground-position : <bg-origine>;<bg-clip>)<bg-clip>border-box : la zone comprend border + padding + content.padding-box : (défaut) la zone comprend padding + contentcontent-box : l’arrière plan s’étend uniquement sous la zone de contenu.background-clip : <bg-clip>;Les attributs width et height permettent de définir par défaut la taille du contenu d’une boite. Mais ce fonctionnement peut être modifié à l’aide de l’attribut box-sizing.
width : <length> | auto | inheritheight : <length> | auto | inheritL’attribut padding défini la marge intérieur d’une boite, l’espace entre la bordure et le contenu de la boite.
padding-top : <length>padding-bottom : <length>padding-left : <length>padding-right : <length>padding : <length> /* Applique la même valeur aux 4 paddings */padding : <length> <length> /* (top et bottom) (left et right) */padding : <length> <length> <length> /* (top) (left et right) (bottom) */padding : <length> <length> <length> <length> /* (top) (left) (bottom) (right) — sens horaire débutant en haut */backgroundLa bordure d’une boite peut avoir plusieurs caractéristiques :
border-width.border-style.border-color.border-radius.<br-width>thinmedium (default)thick<length> // sauf %inheritborder-top-width : <br-width>border-bottom-width : <br-width>border-left-width : <br-width>border-right-width : <br-width>border-width: <br-width> /* Applique la même valeur aux 4 bordures */border-width: <br-width> <br-width> /* (top & bottom) (left & right) */border-width: <br-width> <br-width> <br-width> /* (top) (left & right) (bottom) */border-width: <br-width> <br-width> <br-width> <br-width> /*(top) (left) (bottom) (right) — sens horaire débutant en haut*/%.<br-style>none (default)hiddendotteddashedsoliddouble /* necessite une taille de 3px minimum pour être visible */groove /* simule une bordure en relief */ridge /* simule une bordure en relief */inset /* simule une boute en relief */outset /* simule une boute en relief */border-top-style : <br-style>border-bottom-style : <br-style>border-left-style : <br-style>border-right-style : <br-style>border-style: <br-style> * Applique la même valeur aux 4 bordures */border-style: <br-style> <br-style> /* (top & bottom) (left & right) */border-style: <br-style> <br-style> <br-style> /* (top) (left & right) (bottom) */border-style: <br-style> <br-style> <br-style> <br-style> /*(top) (left) (bottom) (right) — sens horaire débutant en haut*/<br-color> la valeur par défaut est la couleur du texte<color>transparentinheritborder-top-color : <br-color>border-bottom-color : <br-color>border-left-color : <br-color>border-right-color : <br-color>border-color: <br-color> * Applique la même valeur aux 4 bordures */border-color: <br-color> <br-color> /* (top & bottom) (left & right) */border-color: <br-color> <br-color> <br-color> /* (top) (left & right) (bottom) */border-color: <br-color> <br-color> <br-color> <br-color> /*(top) (left) (bottom) (right) — sens horaire débutant en haut*/La propriété border permet de déclarer en 1 seule ligne la taille <br-width>, le style <br-style> et la couleur <br-color> qui sera appliqué à 1 ou aux 4 bordures.
border-top : <br-width> <br-style> <br-color>border-right : <br-width> <br-style> <br-color>border-bottom : <br-width> <br-style> <br-color>border-left : <br-width> <br-style> <br-color>border : <br-width> <br-style> <br-color><radius><lenght>Il est possible pour chaque angle de définir l’arrondi à travers 1 ou 2 <length>
<radius> 1 seul rayon : arrondi type cercle.<h-radius> <v-radius> : 2 rayons (rayon horizontal) (rayon vertical) : arrondi type elliptique.En donnant une valeur différente au rayon horizontal et vertical, vous créez un arrondi de type elliptique.
border-top-left-radius : <lenght>border-top-left-radius : <h-radius> <v-radius> 2 valeurs pour définir un arrondi de type elliptique.border-top-right-radius : <lenght>border-top-right-radius : <h-radius> <v-radius>border-bottom-right-radius : <lenght>border-bottom-right-radius : <h-radius> <v-radius>border-bottom-left-radius : <lenght>border-bottom-left-radius : <h-radius> <v-radius>border-radius : <radius> /* le même arrondi aux 4 coins */border-radius : <radius> <radius> /* (top-left & bottom-right) (top-right & bottom-left)border-radius : <radius> <radius> <radius> /* (top-left) (top-right & bottom-left) (bottom-right)border-radius : <radius> <radius> <radius> <radius> /* (top-left) (top-right) (bottom-left) (bottom-right)border-radius : <h-radius> / <v-radius> /* le même arrondi elliptique aux 4 coins */border-radius : <h-radius> <h-radius> / <v-radius> <v-radius> /* (top-left & bottom-right h-radius) (top-right & bottom-left h-radius) / (top-left & bottom-right v-radius) (top-right & bottom-left v-radius)border-radius : <h-radius> <h-radius> <h-radius> / <v-radius> <v-radius> <v-radius> /* (top-left h-radius) (top-right & bottom-left h-radius) (bottom-right h-radius) / (top-left v-radius) (top-right & bottom-left v-radius) (bottom-right v-radius)border-radius : <h-radius> <h-radius> <h-radius> <h-radius> / <v-radius> <v-radius> <v-radius> <v-radius> (top-left h-radius) (top-right h-radius) (bottom-right h-radius) (bottom-left h-radius) / (top-left v-radius) (top-right v-radius) (bottom-right v-radius) (bottom-left v-radius)L’attribut margin défini la marge extérieur d’une boite, elle permet d’espacer visuellement les boites les unes des autres.
Les valeurs des marges peuvent être négatives.
À savoir : les marges peuvent subirent des fusion entre elles.
<lenght>automargin-top : <length>margin-bottom : <length>margin-left : <length>margin-right : <length>margin : <length> /* Applique la même valeur aux 4 marges */margin : <length> <length> /* (top et bottom) (left et right) */margin : <length> <length> <length> /* (top) (left et right) (bottom) */margin : <length> <length> <length> <length> /* (top) (left) (bottom) (right) — sens horaire débutant en haut */Centrer le contenu d’un block horizontalement :
selector { width: <lenght> margin-left: auto; margin-right: auto; }selector { width: 960px margin: 0 auto; }
Le flux “normal” est le positionnement, par le navigateur, des boites dans la page au fur et à mesure des balises HTML rencontrées.
div, header, section, h1, h2 … p, ul, etc. sont des balises ayant la propriété display:block;.margin-top et margin-bottom) se rencontrent, seule la plus haute des 2 va être conservée.overflow ou float2 .span, em, strong, a, etc. sont des balises ayant la propriété diplay:inline;.1 www.alsacreations.com/article/lire/629-fusion-des-marges.html
2 Voir contexte de formatage block www.alsacreations.com/astuce/lire/1543-le-contexte-de-formatage-block-en-css.html
La propriété position permet d’extraire ou de modifier la position d’un élement du flux.
positionstatic // défautrelativeabsolutefixedElle fonctionne de paire avec les propriétés de positionnement top, bottom, left & right et la propriété z-index qui défini l’ordre des éléments superposés.
top, bottom, left, rightauto défaut<length>inheritz-indexauto<nombre>C’est la valeur par défaut, cela signifie que l’élément est calé dans le flux de la page. En position : static, les propriétés de positionnement ne s’appliquent pas.
Cette valeur permet de décaler la position d’un élément par rapport à celle qu’il occupe dans le flux. L’espace qu’il occupait dans le flux ne se libère pas et reste occupé, cela permet aux éléments voisins de ne pas être influencés par le décalage.
selector {
position : relative;
top: 3px;
}
Cette valeur permet d’extraire un élément du flux — l’espace qu’il devrait occuper n’existe plus — et de le positionner par rapport à un parent un containing block ou à défaut la fenêtre du navigateur (viewport). Il sera fixé à la fenêtre et ne sera plus influencé par le défilement.
selector {
position : fixed;
top: 0;
}
auto (ou non renseigné) correspondent au positionnement de l’élément qu’il aurait dans le flux.Cette valeur permet d’extraire un élément du flux — l’espace qu’il devrait occuper n’existe plus — et de le positionner par rapport à son parent positionné (autre que static) ou en containing block ou à défaut la page (viewport).
position : relative sans lui appliqué de propiété de positionnement.Un containing block est créé dans ces cas là:
Un élément avec width: 50% ne mesure donc pas toujours 50% de la taille de son parent. Par contre, il mesurera toujours 50% de la taille de son containing block.
Dans le cas d’une superposition de plusieurs éléments, suite à une manipulation de blocs à l’aide de la propriété position ou d’un jeu de marges négatives, Dans quel ordre se super-positionneront les blocs ?
z-index < 0 ;z-index: auto ou z-index: 0 ;z-index > 0Par défaut, votre page n’a qu’un contexte d’empilement, initié par html , les éléments vont donc suivre l’ordre d’empilement ci-dessus.
Mais de nouveaux contextes d’empilement seront définis à partir des blocs qui ont :
z-index ≠ 0 ou auto ;opacité > 1 ;transform ≠ none ;transform-style: preserve-3d ;filter ≠ none ;clip-path ou mask ;L’empilement de ces enfants seront donc contraints à ce nouveau contexte.
La propriété z-index n’est prise en compte que sur un élément positionné (relative @absolute@ ou fixed). Elle sera sinon ignorée.
La propriété float permet de faire _flotter _ une boite à droite ou à gauche dans son conteneur.
Une boite flottante quitte le flux normal, sa hauteur n’influence plus la hauteur de son parent (peut être rétabli à l’aide de clear) . Le contenu des boites suivantes va s’écouler autour du/des flottants précédents.
Cette propriété fonctionne de paire avec la propriété clear qui permet d’annuler l’influence des flottants précédent la cible et de la positionner sous ceux-ci.
floatleftrightnoneinheritclearleft // La boite ne sera pas influencé par les flottants à gauche précédentsright // La boite ne sera pas influencé par les flottants à droite précédentsboth // La boite ne sera pas influencé par les flottants précédents (doite et gauche)noneinheritselecteur { float: left; }selecteur { clear: left; }
float va implicitement faire basculer la boite ciblé en display:blockfloat est la première propriété à avoir été exploité pour construire des grilles de mise en pageEn basculant une boite dans le context de formatage block1 (utiliser overflow, float), elle se placera toujours à côté d’un flottant mais ne s’écoulera plus autour de celle-ci.
…
Un élément html table possède certaines caractéristiques qui lui sont propres et qui peuvent être appliqué à n’importe quelle balise grâce à la propriété display : table
Certaines propriétés sont spécifiques à ce contexte :
border-collapse bordures séparées ?separate (default), collapseborder-collapse: collapse;border-spacing Taille espace entre les borduresborder-collapse: separate;<lenght><lenght> <length> // horizontal verticalborder-spacing : 1.5em 1em;caption-side Position de la légende<caption> ou en display: table-caption au dessus ou au dessous du tableau.top (default), bottom.Flexbox est une nouvelles séries de propriétés adapté à la construction de layout (flex layout).
La propriété principale est display: flex qui va influencer/altérer le rendu (hauteur, largeur, ordre) de ces éléments enfants (items) pour les contraindre à occuper son espace.
Le flux par défaut de la page n’est plus pris en compte.
display : flex;<flex-direction>row (défaut), row-reverse, column, column-reverseflex-direction : column-reverse<flex-wrap><flex-direction>).nowrap défaut. Les items sont contenus sur 1 seule ligne/colonne.wrap La taille définie des items est conservé et ils se positionnent sur plusieurs lignes si besoin.wrap-reverse Idem à wrap, mais inverse (haut/bas, droite/gauche) l’ordre d’affichage des itemsinheritflex-wrap : wrap<justify-content>flex-start (défaut), flex-end, center, space-between, space-aroundjustify-content : space-between;<align-items>stretch (défaut), flex-start, flex-end, center, baseline.<align-content>stretch (défaut), flex-start, flex-end, center, space-between, space-around.<order><flex-basis>auto (defaut), <width>, inheritflex-basis : 25%<flex-grow><number>, 0 (défaut), pas de nb négatifs.<flex-shrink><number>, 0 (défaut), pas de nb négatifs.align-selfauto (défaut), flex-start, flex-end, center, baseline, stretch.align-self: flex-endAjouter des boites et du contenu qui n’existe pas dans le code…
perspective peut s’apliqué à 1 seul élément qui sera en même temps transformé à travers l’attribut transformtransform: perspective(600px) rotateY(60deg);perspective: 500px;La propriété transition permet simplement d’animer un élément d’une valeur de départ à une valeur d’arrivée d’une propriété lorsqu’un événement est déclenché ou class ajouté à la volée via javascript.
<transition-property>all (default), none @propriété@transition-property : color;propriété, propriété, …transition-property : color, border-color;<transition-duration>0 (default), <durée> ms, <durée> stransition-duration: 500ms<durée>, <durée>transition-duration: 500ms, 1s<transition-timing-function>ease (default), mot-clef, cubic-bezier(0.1, 0.7, 1.0, 0.1), steps(4, end)<transition-delay>0 (default), <durée> (idem <transition-duration>)<transtion><transition> = <transition-property> <transition-duration> <transition-timing-function> <transition-delay>transition : <transition-duration>; = transition : all <transition-duration> ease 0;transition : <transition-property> <transition-duration> <transition-timing-function> <transition-delay>;Il est possible d’effectuer des transitions sur des propriétés différentes. Et en jouant sur les <transition-duration> et <transition-delay> de les enchainer. Il suffit de séparer les différentes <transition> par une vigule
transition: <transition>, <transition>, [etc]transform plutôt que top, left, etc;transform: translateZ(0);voir www.alsacreations.com/astuce/lire/1565-acceleration-materielle-au-service-de-vos-animations-css.html
transitionendtransitionend permet de déclencher une fonction quand un transition est terminé.
ATTENTION, événement asynchrone. Et si la transition est interrompue ou qu’elle n’existe pas, la fonction se sera pas exécutée.
DomSelector.addEventListener(transitionend, function(), false);
Button et input[type=submit].padding et line-height imposés par le navigateurs.Conseils, bonnes pratiques et méthodologies pour une rédaction maintenable et évolutive de votre code CSS
h
Essayez au maximum de sélectionner un élément HTML à travers une class.
Le W3C impose une grammaire pour le nommage des sélecteurs. Certains caractères ne sont pas autorisés :
Les sélecteurs CSS (ids & classes) ne peuvent contenir que des caractères
[a-z A-Z 0-9], les carctères ISO 10646 (u+00A1 et supérieur), ainsi que le trait d’union – et l’underscore _ ; ils ne peuvent pas commencer par un chiffre ou un tiret suivi d’un chiffre.
Depuis CSS3, il est possible d’utiliser plus de caractères et même des émoticones à condition de les échapper avec un antislash ou à l’aide de la notation unicode.
Le but du concept OOCSS & SRT est d’encourager la réutilisation du code et, pour aboutir à des feuilles de style plus rapides, plus efficaces, plus faciles à ajouter et à maintenir.
Pour cela il est recommander de définir les caractéristiques communes à différents blocs et de créer un style par caractéristiques, de manière à appeler ce style dans votre code HTML, plutôt que de dupliquer les styles au sein de vos CSS.
DRY est un des principes de base en informatique. Les deux principaux outils qui permettent d’éviter de se répéter en informatique sont les variables et les fonctions.
La question se pose alors : comment penser DRY avec un langage qui n’a à la base ni variables ni fonctions ?
#footer h3]Concept très proche de OOCSS puisque basé sur les mêmes principes de programmation orientée objet : structurer son code de manière à n’avoir qu’un seul élément qui défini une seule caractéristique.
BEM est une méthode pour nommer et classifier vos sélecteurs CSS de façon à les rendre beaucoup plus strict, transparent et informatif.
Bloc__element.element--modificateur, bloc--modificateur.personne{}
.personne--femme{}
.personne__main{}
.personne__main--gauche{}
.personne__main--droite{}
visibility:hidden peut rester visible avec visibility: visible