Le langage CSS vous permet d'appliquer des styles à vos éléments HTML à l'aide de propriétés. Il en existe une multitude qui permettent de modifier les tailles, les positions, les couleurs, les bordures, etc.
Vous pouvez attribuer des styles à un élément en utilisant l'attribut HTML style. La nomenclature consiste à séparer les propriétés par des point-virgules de la façon suivante propriete1: valeur; propriete2: valeur;
<p style="text-align: center; color: red;">
Lorem ipsum
</p>
En règle générale, on évite cependant au maximum d'appliquer des styles de cette façon afin de ne pas dupliquer inutilement du code.
La meilleure solution consiste à créer une feuille de style contenant des règles que l'on appliquera à des éléments du même type à l'aide de sélecteurs.
Une règle est construite de la façon suivante :
selecteur {
propriete: valeur;
}
Pour utiliser du CSS dans un document HTML, deux possibilités existent :
- Écrire toutes vos règles CSS à l'intérieur d'une balise
<style> dans l'élément <head> - Écrire le code CSS dans un fichier
.css et l'importer à l'aide d'une balise <link>
La deuxième solution est bien sûr recommandée puisqu'elle permet d'éviter de mieux organiser son code.
En admettant que votre fichier CSS se nomme style.css et qu'il soit situé dans le même répertoire que votre document HTML, il suffira d'ajouter la ligne suivante dans l'élément <head> de votre document :
<link rel="stylesheet" href="style.css">
Vous pouvez importer autant de feuilles de style que nécessaire en utilisant plusieurs éléments <link>.
Les sélecteurs
Pour définir une règle CSS, on commence par déterminer le(s) élément(s) ciblé(s) à l'aide d'un sélecteur.
Pour définir le style d'un élément HTML, par exemple une balise <p>, il suffit d'indiquer simplement le nom de l'élément p comme sélecteur.
Pour sélectionner une classe, on précédera son nom d'un point . et pour un identifiant, on précédera son nom d'un dièse #.
element .classe #identifiant
On peut ensuite combiner ces sélecteurs avec des opérateurs pour construire des règles plus précises.
Voici un tableau récapitulatif des sélecteurs les plus courants :
| Sélecteur | Exemple | Description | * | * | Sélectionne tous les éléments |
element | p | Sélectionne tous les éléments <p> |
element, element | h1, h2 | Sélectionne tous les éléments <h1> et les éléments <h2> |
element element | section h2 | Sélectionne tous les éléments <h2> se trouvant à l'intérieur d'un élément <section> |
element > element | section > h2 | Sélectionne tous les éléments <h2> se trouvant directement à l'intérieur d'un élément <section> |
element + element | p + h2 | Sélectionne tous les éléments <h2> se trouvant juste après un élément <p> |
.classe | .box | Sélectionne tous les éléments ayant la classe box |
.classe1.classe2 | .box.button | Sélectionne tous les éléments ayant à la fois la classe box et la classe button |
element.classe | a.button | Sélectionne tous les éléments <a> ayant la classe button |
#identifiant | #menu | Sélectionne l'élément ayant l'id menu |
On peut combiner ces opérateurs à l'infini et créer des règles complexes. On peut par exemple écrire cette règle :
#container div.box > a.button.is-primary {
}
Éléments <a> ayant les classes button et is-primary, directement à l'intérieur d'éléments <div> ayant la classe box, à l'intérieur de l'élément qui a l'identifiant container
Pour cibler un état spécifique d'un sélecteur, on peut se servir des pseudo-classes. Une pseudo-classe est un mot-clé précédé par deux-points : ajouté à la fin du sélecteur. Les pseudo-classes suivantes sont fréquemment utilisées :
| Sélecteur | Exemple | Description | :hover | a:hover | Sélectionne les éléménts <a> survolés par la souris |
:active | a:active | Sélectionne les éléménts <a> cliqués |
:checked | input:checked | Sélectionne les éléménts <input> cochés (pour les checkboxes) |
:disabled | input:disabled | Sélectionne les éléménts <input> désactivés |
:required | input:required | Sélectionne les éléménts <input> requis |
:focus | input:focus | Sélectionne les éléménts <input> actifs |
:first-child | p:first-child | Sélectionne les éléménts <p> qui sont en première position de leurs parents |
:last-child | p:last-child | Sélectionne les éléménts <p> qui sont en dernière position de leurs parents |
:only-child | p:only-child | Sélectionne les éléménts <p> qui sont seuls à l'intérieur de leurs parents |
:nth-child(n) | p:nth-child(4) | Sélectionne les éléménts <p> qui sont en 4ème position dans leurs parents |
:not(selecteur) | a:not(.button) | Sélectionne les éléménts <a> qui n'ont pas la classe button |
Les propriétés
Il existe une multitude de propriétés dont vous pouvez trouver la liste complète sur le site W3Schools.
Nous verrons ici les plus utiles et les plus communes d'entre elles.
Couleurs
La propriété color permet de changer la couleur du texte à l'intérieur d'un élément. La propriété background-color change la couleur de fond de l'élément.
Une couleur est définie par son code hexadécimal, RGB, RGBA, HSL, HSLA ou l'une des 140 couleurs nommées.
<div style="color: darkblue;">
darkblue
</div>
<div style="color: #EE964B;">
#EE964B
</div>
<div style="background-color: rgb(40,175,176); color: white;">
rgb(40,175,176)
</div>
<div style="background-color: hsl(334,91%,40%); color: white;">
hsl(334,91%,40%)
</div>
darkblue
#EE964B
rgb(40,175,176)
hsl(334,91%,40%)
Typographie
| Propriété | Valeurs possibles | Description | font-family | font | Nom de la police de caractères |
font-size | size | Taille de police |
font-weight | normal bold bolder lighter 100—900 | Graisse de police |
font-style | normal italic oblique | Style de police |
La propriété font-family permet d'indiquer plusieurs valeurs séparées par des virgules. La première police renseignée sera alors utilisée en priorité, et les autres seront désignées comme polices de "secours" au cas où la principale serait introuvable.
html {
font-family: Roboto, Arial, sans-serif;
}
Il convient de toujours indiquer serif ou sans-serif en dernier recours pour laisser le système utiliser sa police avec ou sans empattements par défaut.
La propriété font-weight dispose de valeurs prédéfinies. Vous pouvez également utiliser des multiples de 100 qui correspondent aux graisses suivantes :
- 100 : Thin
- 200 : Extra-Light
- 300 : Light
- 400 : Normal (valeur par défaut)
- 500 : Medium
- 600 : Semi-Bold
- 700 : Bold
- 800 : Extra-Bold
- 900 : Black
Les tailles de typographies peuvent utiliser différentes unités. Pour un usage web, l'unité de base est le pixel, symbolisé px.
Pour les typographies, une bonne pratique est d'utiliser les unités em et rem.
L'unité em est relative à l'élément parent tandis que rem est relative à la racine du document, soit l'élément <html>.
html {
font-size: 12px;
}
section {
font-size: 1.5rem;
}
section h2 {
font-size: 2em;
}
section p {
font-size: 1rem;
}
Il est préférable d'utiliser le rem pour éviter toute confusion. Vous n'aurez alors qu'à définir votre taille de texte courant pour l'élément html et utiliser des multiples de cette valeur partout ailleurs.
Texte
| Propriété | Valeurs possibles | Description | text-align | left center right justify | Alignement du texte |
text-decoration | none underline overline line-through | Soulignement du texte |
text-transform | none capitalize uppercase lowercase | Transformation du texte |
text-shadow | none x y blur color | Ombrage du texte |
Notez bien que la propriété text-align n'a d'effet que sur les éléments en ligne. Par conséquent, les enfants de types bloc ou flex ne seront pas affectés par l'alignement.
Marges, padding et bordures
| Propriété | Valeurs possibles | Description | margin | size auto | Marges extérieures |
padding | size | Marges intérieures |
border | size type color | Bordures |
border-radius | size | Arrondi de la bordure |
box-sizing | content-box border-box | Prise en compte du padding et des bordures dans la taille de l'élément |
La propriété margin détermine les marges extérieures autour d'un élement, la propriété padding détermine ses marges intérieures et la propriété border ses bordures.
Pour chacune de ces propriétés, on peut préciser un côté spécifique en ajoutant le suffixe -top, -left, -bottom ou -right.
Les propriétés margin, padding et border sont des raccourcis pour définir les valeurs pour les quatre côtés :
margin : margin-top margin-right margin-bottom margin-left padding : padding-top padding-right padding-bottom padding-left border : border-top border-right border-bottom margin-left
On peut utiliser ces raccourcis de plusieurs façons :
- Si une seule valeur est précisée, elle sera utilisée pour les quatre côtés
- Si deux valeurs sonts précisées, la première sera utilisée pour
top et bottom et la seconde pour left et right - Si les quatre valeurs sonts précisées, l'ordre sera le suivant :
top, right, bottom, left (sens des aiguilles d'une montre)
.box {
margin: 20px;
}
.box {
margin: 20px 0;
}
.box {
margin: 20px 0 10px 5px;
}
Les propriétés margin peuvent recevoir la valeur auto pour déterminer automatiquement les marges en fonction de l'espace disponible dans le bloc parent. Si la valeur auto n'a aucun effet en haut et en bas, elle est utilisée à gauche et à droite pour centrer l'élément à l'intérieur de son parent.
body {
border: 1px solid red;
}
.box {
width: 40px;
height: 40px;
background-color: blue;
margin: 20px auto;
}
Le padding fonctionne exactement pareil que les marges extérieures mais agira sur les marges intérieures.
La propriété border prend trois valeurs : l'épaisseur de la bordure, sa forme et sa couleur. Il s'agit en réalité d'un raccourci pour définir en une seule fois les propriétés border-width, border-style et border-color. Les deux règles suivantes sont ainsi identiques :
.box {
border: 2px solid #ffcc00;
}
.box {
border-width: 2px;
border-style: solid;
border-color: #ffcc00;
}
La propriété border est elle-même un raccourci pour spécifier en une seule fois les propriétés border-top, border-left, border-bottom et border-right.
Par défaut, si vous attribuez du padding ou des bordures à un élément de taille fixe, celles-ci s'ajouteront à la taille totale de votre élément. Pour éviter cela, vous devez utiliser la propriété box-sizing avec la valeur border-box.
Dans l'exemple ci-dessous, l'élément .box a une largeur de 100% et des marges intérieures de 20px. Par défaut, le padding est ajouté à la largeur du bloc qui est donc large de 100% + 40px. Par conséquent, le bloc dépasse de son conteneur.
body {
border: 1px solid red;
}
.box {
width: 100%;
background-color: lightblue;
padding: 20px;
}
En ajoutant la propriété box-sizing avec la valeur border-box, on indique que le padding doit être comptabilisé dans la largeur totale de l'élément.
body {
border: 1px solid red;
}
.box {
width: 100%;
background-color: lightblue;
padding: 20px;
box-sizing: border-box;
}
Positionnement
Par défaut, tous les éléments HTML sont positionnés de façon relative, les uns par rapport aux autres. La propriété position permet de modifier ce comportement.
| Valeur | Description | static | Valeur par défaut |
relative | Identique à la valeur static |
absolute | L'élément est positionné par rapport à son premier élément parent non statique |
fixed | L'élément est positionné par rapport à la fenêtre |
Un élément positionné avec les valeurs absolute ou fixed est indépendant du reste de la page. Les éléments qui le suivent dans le document ne prendront pas en compte ses dimensions et passeront en-dessous. Il pourra ensuite être positionné en utilisant les propriétés top, left, bottom et right.
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Position absolue - Exemple</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<section class="beige">
<p>Lorem ipsum dolor sit amet.</p>
</section>
<section class="pink">
<div class="square"></div>
</section>
</body>
</html>
Dans l'exemple ci-dessus, nous avons créé deux sections dont l'une contient un carré. En CSS, nous déclarons les règles suivantes pour donner au carré une largeur et une hauteur de 40px et une couleur de fond bleue :
section {
height: 150px;
}
section.beige {
background-color: beige;
}
section.pink {
background-color: pink;
}
.square {
width: 40px;
height: 40px;
background-color: blue;
}
Lorem ipsum dolor sit amet
Si l'on positionne le carré bleu de façon absolue avec des valeurs de 10px en haut et à gauche, celui-ci se positionnera par rapport à l'élément body, et non à l'élément <section> parent.
section {
height: 150px;
}
section.beige {
background-color: beige;
}
section.pink {
background-color: pink;
}
.square {
position: absolute;
top: 10px;
left: 10px;
width: 40px;
height: 40px;
background-color: blue;
}
Lorem ipsum dolor sit amet
Un élément positionné de façon absolue prend en effet pour référence son premier élément parent non statique. Pour que le carré soit placé à 10px en haut à gauche de la section rose, il faut définir cette dernière comme étant en position relative.
section {
height: 150px;
}
section.beige {
background-color: beige;
}
section.pink {
position: relative;
background-color: pink;
}
.square {
position: absolute;
top: 10px;
left: 10px;
width: 40px;
height: 40px;
background-color: blue;
}
Lorem ipsum dolor sit amet
La propriété display et les flexbox
La propriété display permet de modifier l'affichage d'un élément. Il existe une multitude de valeurs possibles mais retenez surtout les suivantes :
| Valeur | Description | block | Affiche l'élément comme un bloc |
inline | Affiche l'élément comme un élément en ligne |
flex | Affiche l'élément comme un conteneur flexible |
none | Masque l'élément |
La valeur flex indique que l'élément sélectionné est un conteneur flexible. Il sera alors possible d'utiliser les propriétés suivantes qui permettront d'indiquer comment ses enfants directs de placeront les uns par rapport aux autres :
| Propriété | Valeurs possibles | Description | flex-direction | row row-reverse column column-reverse | Direction des éléments |
flex-wrap | nowrap wrap wrap-reverse | Détermine si les éléments s'affichent sur une seule ligne ou s'ils retournent à la ligne quand l'espace manque |
justify-content | flex-start flex-end center space-between space-around space-evenly | Définit l'alignement des éléments par rapport à l'axe principal |
align-items | flex-start flex-end center stretch baseline | Définit l'alignement des éléments par rapport à l'axe secondaire |
align-content | flex-start flex-end center stretch baseline | Définit l'alignement des lignes d'éléments par rapport à l'axe secondaire lorsque les éléments sont sur plusieurs lignes |
Le site CSS Tricks a rédigé un article très détaillé et illustré sur l'utilisation des conteneurs flexibles.
Guide d'utilisation de Flexbox sur CSS Tricks
Les transitions
La propriété transition permet de créer des interpolations sur les changements de valeur de certaines propriétés d'un élément.
Les transitions sont souvent utilisées pour adoucir un changement de style lors du passage de la souris sur un élément. Dans ce cas précis, il suffit de définir les styles de base de l'élément et ceux au passage de la souris avec le sélecteur :hover, puis d'ajouter la propriété transition à l'élément avec pour valeur le nom de la propriété à interpoler suivi de la durée de la transition.
Voici un exemple très simple de transition sur la propriété background-color avec une durée d'une seconde :
.button {
display: inline-block;
background-color: pink;
padding: 5px 15px;
border-radius: 4px;
transition: background-color 1s;
}
.button:hover {
background-color: lightblue;
}
Vous pouvez attribuer des transitions sur plusieurs propriétés en les séparant par des virgules.
.button {
display: inline-block;
background-color: pink;
padding: 5px 15px;
border-radius: 4px;
transition: background-color 500ms, border-radius 2s;
}
.button:hover {
background-color: lightblue;
border-radius: 20px;
}
Plus simple encore, vous pouvez utiliser le mot-clé all pour interpoler toutes les propriétés altérées :
.button {
display: inline-block;
background-color: pink;
padding: 5px 15px;
border-radius: 4px;
transition: all 1s;
}
.button:hover {
background-color: lightblue;
padding: 5px 25px;
border-radius: 20px;
}
Certaines propriétés ne supportent pas les transitions. Par exemple, il est impossible d'interpoler un changement de display, de position, de font-family, etc.
Les media queries sont des instructions qui permettent d'associer des règles CSS à des supports. On peut par exemple les utiliser pour indiquer qu'un groupe de règles ne concerne que la version imprimée du document, ou bien qu'un autre groupe ne concerne que les écrans dont la taille est inférieure à 800px.
La définition d'une media query commence toujours par le mot-clé @media suivi du type de support ciblé. La plupart du temps, on utilisera le support screen à moins que l'on souhaite cibler une version imprimée (print) ou, encore moins fréquent, un téléviseur (tv).
@media print {
html {
font-family: 'Roboto', sans-serif;
font-size: 18px;
}
}
Dans cet exemple, on applique des styles typographiques uniquement pour le format imprimé
On peut ensuite ajouter des règles supplémentaires en utilisant l'opérateur and. Généralement, les media queries étant utilisées pour gérer le responsive, ces règles supplémentaires concernent des tailles d'écrans. On utilise pour cela min-width et max-width de la façon suivante :
.flex-container {
display: flex;
flex-direction: row;
}
@media screen and (max-width: 720px) {
.flex-container {
flex-direction: column;
}
}
Les éléments flex-container sont affichés en colonne sur les écrans de largeur inférieure à 720px
Le site Alsacréations a rédigé un article très détaillé au sujet des media queries.
Les media queries CSS3 sur Alsacréations