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:

aaffichage par défaut (sans styles)
Figure 1: affichage par défaut (sans styles).
Question 1:

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 ?

Question 2:

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.

affichage des articles en rouge
Figure 2: affichage du contenu des articles en rouge.

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.

Question 3:
  1. 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 ?

  2. 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.

  3. 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>.

Question 4:

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.

aaffichage par défaut (sans styles)
Association des styles dans l'arbre DOM.

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 :

Affichage par défaut sans styles CSS

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>
Question 1

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 */
            }
Question 2:

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.

Question 1:

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!

affichage des articles en rouge
Figure 3: les flexyfrogs !

/* 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
}