Objectifs : L'objectif de cette scéance de TP est de découvrir poursuivre la découverte des CSS au travers de petits exercices. L'accent sera tout particulièrement mis sur l'utilisation des flexboxes.
Pour comprendre l'utilisation des propriétés CSS étudiées dans ce TP, les liens étiquetés en vert vous renvoient vers la page correspondante dans le tutoriel du W3C consacré à CSS (http://www.w3schools.com/css), ceux en bleu vous renvoient vers MDN (Mozilla Developers Network) https://developer.mozilla.org/fr/
1: Comprendre le sélecteur *
Téléchargez la page page HTML TP03_exo1.html (pour télécharger la page effectuez un clic droit sur le lien et sélectionnez l'item Enregistrer la cible du lien) et affichez celle-ci dans votre navigateur. Par défaut (en l'absence de style) cette page s'affiche de la manière suivante:

Que se passe-t-il si vous associez à cette page le style CSS suivant ?
body {
font-family: Arial, Verdana, sans-serif;
color: blue;
}
Essayez, puis remplacez le sélecteur body
par le sélecteur *  
. Vous pouvez constater que vous obtenez
le même affichage. Mais est-ce vraiment la même chose ?
En conservant la règle
body {
font-family: Arial, Verdana, sans-serif;
color: blue;
}
Ajoutez une et une seule nouvelle règle de style de manière à ce que le contenu des articles soit affiché en italique et en rouge, comme indiqué sur l'image ci-dessous.

Quelle caractéristique des CSS avez-vous exploitée pour obtenir cet effet avec une seule nouvelle règle ?
Une règle qui permet de colorer le contenu des articles est la suivante:
article {
color: red;
}
Cette règle définit un style qui sera attaché à tous les éléments <article>
de
la page.
On utilise ici l'héritage des styles. Le style qui s'applique à un élément est celui défini au niveau de l'élément si il existe, ou en l'absence de définition celui de l'élément ancêtre le plus proche pour lequel un style est défini.
-
Si maintenant, si vous remplaciez le sélecteur
body
par le sélecteur*
tout en conservant la nouvelle règle qui vous a permis d'afficher les articles en rouge, pouvez-vous prédire quel résultat vous allez obtenir ? -
Effectuez ce remplacement et réaffichez votre page. Est-ce que le résultat obtenu correspond à ce que vous attendiez ?
On obtient le même résultat que pour la question 1 : la page est affichée entièrement en bleu y compris les articles.
-
Modifiez le sélecteur de la règle permettant d'afficher en rouge le contenu des articles afin d'obtenir un affichage identique à celui de la figure 2.
Une règle qui permet de colorer en rouge le contenu des articles est la suivante:
article * { color: red; }
Cette règle définit un style qui sera attaché à tous les éléments déscendant d'un élément
<article>
.
Maintenant que vous avez pu constater que l'utilisation du sélecteur *
n'avait pas le même effet que celle du sélecteur body
, pouvez-vous expliquer
cette différence de comportement ?
Le sélecteur *
applique un style à tous les éléments de la page (figure gauche) alors
qu'un sélecteur de balise (par exemple ici body
ou article
) associe
le style qu'aux éléments portant cette balise (figure de droite). Les autres éléments héritent du style de leur parent.

La règle
article * {
color: red;
}
peut être lue comme attacher la couleur rouge à tous les éléments descendant d'une balise article
.
2: Eléments flottants
Téléchargez et décompréssez le dossier ExempleFloats.zip puis ouvrez le fichier HTML qu'il contient. Vous devriez obtenir l'affichage suivant :

Question Dotez cette page d'une feuille de styles css afin d'obtenir l'affichage et le comportement montré sur la vidéo ci-dessous.
Les propriétés de styles utilisées pour effectuer la mise en page montrée sur la vidéo sont les suivantes :
margin-right: auto; width: 75%; clear:right; padding: 5px; float: left; margin-right: auto; margin-left: auto; float: right;
A vous de trouver les bons sélecteurs et de leur associer les propriétés ci-dessus.
Les styles CSS à définir sont :
#wrapper {
width: 75%;
margin-left: auto;
margin-right: auto;
}
img { /* style s'appliquant à toute les images */
padding: 5px; /* marge intérieure de 5 pixels */
}
.floatLeft { /* classe pour faire flotter un élément à gauche */
float: left;
}
.floatRight { /* classe pour faire flotter un élément à droite */
float: right;
}
.clearRight { /* classe pour empêcher l'élément auquel
elle s'applique de se se situer à droite d'un élément flottant*/
clear:right;
}
ils sont appliqués aux différentes images de la manière suivante :
...
<p>
<img src="images/loremIpsum.png" class="floatLeft" alt="lorem ipsum"/>
...
<p>
<p>
<img class="floatRight" src="images/li1.png" alt="lorem ipsum"/>
<img class="floatRight clearRight" src="images/li2.png" alt="lorem ipsum"/>
...
<p>
...
3: Flexboxes et média queries
Avec l'introduction des boites flexibles (flexboxes) dans les CSS3, le placement des éléments d'une page HTML a été grandement simplifié. La connaissance des propriétés CSS associées aux flexboxes est devenue un élément incontournable de la mise en page de documents HTML. Pour en savoir plus sur les flexboxes le tutorial w3schools CSS Flexbox
Exercice 1 : flexboxes
Soit le code HTML suivant
<!DOCTYPE html>
<html>
<head>
<title>TP03 exo2</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div class="container">
<div class="box" id="box-1">box 1</div>
<div class="box" id="box-2">box 2</div>
<div class="box" id="box-3">box 3</div>
</div>
</body>
</html>
En utilisant les flexboxes des CSS3 stylez cette page afin d'obtenir un affichage et un comportement identique à ceux montrés dans la vidéo ci-dessous.
Les propriétés de styles utilisées pour effectuer la mise en page montrée sur la vidéo sont les suivantes (celles suivies d'une icone verte et/ou d'une icone bleue, , en particulier celles relevant des flexboxes, vous redirigeront vers une page d'explication de w3schools et/ou de MDN) :
background-color: #0000FF; background-color: #00FF00; background-color: #FF0000; background-color: pink; color: white; display: flex;   flex: 1; flex-direction: column; font-family: sans-serif; font-size: 36px; height: 60px; min-height: 100vh; padding: 20px; text-align: center;
A vous de trouver les bons sélecteurs et de leur associer les propriétés ci-dessus (certaines peuvent être utilisées plusieurs fois)
body {
background-color: pink;
}
.container {
min-height: 100vh; /** pour en savoir plus lire
https://www.alsacreations.com/astuce/lire/51-hauteur-100-element.html
*/
display: flex; /* le div avec la classe container est un container flex */
flex-direction: column; /* le flex-items qu'il contient sont affichés en colonne */
}
.box {
text-align: center;
color: white;
font-family: sans-serif;
font-size: 36px;
padding: 20px;
}
#box-1 {
background-color: #00FF00; /* green */
height: 60px; /*hauteur fixe */
}
#box-2 {
background-color: #0000FF; /* blue */
flex: 1; /* l'élément est flexible il prendra toute
la place libre dans son conteneur */
}
#box-3 {
background-color: #FF0000; /* red */
height: 60px; /*hauteur fixe */
}
Sans toucher au code HTML, modifier vos styles de manière à obtenir l'affichage et le comportement suivants:
body {
background-color: pink;
}
.container {
min-height: 100vh;
display: flex;
flex-direction: row; /* on change la direction de l'axe principal */
}
.box {
text-align: center;
color: white;
font-family: sans-serif;
font-size: 36px;
padding: 20px;
}
#box-1 {
background-color: green;
width: 60px; /* on fixe une largeur plutôt qu'une hauteur */
}
#box-2 {
background-color: blue;
flex: 1;
}
#box-3 {
background-color: red;
width: 60px; /* on fixe une largeur plutôt qu'une hauteur */
}
Exercice 2: media-queries
De plus en plus souvent, les pages HTML sont ammenées à être affichées sur des dispositifs aux caractéristiques d'affichage très différentes (d'un écran HD 1920x1080 pixels à un écran de smartphone 320x480 pixels). Il devient essentiel d'adapter l'affichage en fonction de ces caractéristiques. Les media queries ont été introduites avec les CSS3 pour répondre à ce besoin.
Modifiez les styles de votre page pour que l'affichage s'adapte à la largeur de la fenêtre (voir la vidéo ci-dessous) :
-
Si celle ci est plus grande que 640 pixels, les boites box 1, box 2 et box 3 s'affichent côte à côte.
-
Si celle ci est plus petite que 640 pixels, les boites box 1, box 2 et box 3 s'affichent les unes au dessus des autres.
body {
background-color: pink;
}
.container {
min-height: 100vh;
display: flex;
flex-direction: row;
}
.box {
text-align: center;
color: white;
font-family: sans-serif;
font-size: 36px;
padding: 20px;
}
#box-1 {
background-color: green;
}
/* si la fenêtre a une largeur inférieure à 640px on affiche en les boites en
colonnes, c'est à dire les unes en dessus des autres */
@media screen and (max-width: 640px) {
#box-1, #box-3 { height: 60px; }
.container { flex-direction: column}
}
/* si la fenêtre a une largeur supérieure à 640px on affiche les boites
en lignes, c'est à dire les unes à côté des autres, il faut donc
fixer une largeur pour box-1 et box-2 */
@media screen and (min-width: 640px) {
#box-1, #box-3 {
width: 60px;
}
}
#box-2 {
background-color: blue;
flex: 1;
}
#box-3 {
background-color: red;
}
3: Aller plus loin avec les flexboxes
Pour aller plus loin avec les flexboxes et tester vos connaissances, jouez
au jeu "Flexbox Froggy": http://flexboxfroggy.com/.
En appliquant des css à l'élément d'id pond
(étang) qui correspond au conteneur flex,
aider les flex-items représentés par des grenouilles à atteindre les bons nénuphars. Si les premiers exercices
sont faciles, les derniers mettront à l'épreuve vos connaissance des flexboxes. Respect, si vous arrivez au bout!

/* 1 */
#pond {
display: flex;
justify-content: flex-end;
}
/*2 */
#pond {
display: flex;
justify-content: center;
}
/*3 */
#pond {
display: flex;
justify-content: space-around;
}
/*4 */
#pond {
display: flex;
justify-content: space-between;
}
/* 5 */
#pond {
display: flex;
align-items:flex-end;
}
/* 6 */
#pond {
display: flex;
justify-content: center;
align-items: center;
}
/* 7 */
#pond {
display: flex;
justify-content: space-around;
align-items: flex-end;
}
/* 8*/
#pond {
display: flex;
flex-direction: row-reverse;
}
/* 9*/
#pond {
display: flex;
flex-direction: column;
}
/* 10*/
#pond {
display: flex;
flex-direction: row-reverse;
justify-content: flex-end
}
/* 11*/
#pond {
display: flex;
flex-direction: column;
justify-content: flex-end;
}
/* 12*/
#pond {
display: flex;
flex-direction: column-reverse;
justify-content: space-between
}
/* 13*/
#pond {
display: flex;
flex-direction: row-reverse;
justify-content: center;
align-items: flex-end;
}
/* 14 */
.yellow {
order: 1;
}
/** 15 */
.red {
order: -1;
}
/* 16 */
.yellow {
align-self: flex-end;
}
/* 17 */
.yellow {
order: 1;
align-self: flex-end;
}
/* 18 */
#pond {
display: flex;
flex-wrap: wrap;
}
/*19 */
#pond {
display: flex;
flex-direction: column;
flex-wrap: wrap;
}
/*20 */
#pond {
display: flex;
flex-flow: column wrap;
}
/*21 */
#pond {
display: flex;
flex-wrap: wrap;
align-content: flex-start
}
/*22 */
#pond {
display: flex;
flex-wrap: wrap;
align-content: flex-end
}
/*23 */
#pond {
display: flex;
flex-wrap: wrap;
flex-direction: column-reverse;
align-content: center
}
/*24 */
#pond {
display: flex;
flex-flow: column-reverse wrap-reverse;
justify-content: center;
align-content: space-between
}