Leçon 11 : Modèle de boîte

Leçon Progress:

Avant d’expliquer ce fameux « modèle de boîte », il est impératif d’aborder une notion essentielle en HTML concernant le flux d’éléments, avec la façon qu’a le navigateur de découvrir les éléments HTML placés dans une page et de les afficher.

Flux

Le navigateur lit et interprète un document HTML pour l’afficher selon des mécanismes bien précis, définis par la norme, que tout navigateur doit respecter. Dans la structure du document, il y a deux dispositions qui vont influencer le rendu visuel :

  1. l’imbrication des éléments avec un conteneur : un élément peut contenir plusieurs enfants, soit des éléments, soit du texte
  2. la succession des éléments dans un conteneur : les éléments se suivent et sont donc « frères » entre-eux et fils du même conteneur

C’est ce qu’on appelle le « flux HTML », qui fait que le navigateur se dit (s’il pouvait parler !) « tient je vois un conteneur » ou « tient ces éléments se suivent ».

Boîtes

Pour afficher ces éléments, le navigateur considère chacun d’eux dans une boîte rectangulaire selon deux modalités :

  1. les boîtes « en ligne » pour tout ce qui touche au texte ; sont concernées les balises que nous avons qualifiées de « caractères » : b, i, u, etc, mais aussi les balises a et img (comme toutes les balises d’insertion d’objet, video par exemple)
  2. les boîtes « bloc » pour le reste notamment les balises p, h*, ul, li

L’imbrication est logiquement réglementée :

  1. Un élément en ligne ne peut contenir que du texte et des éléments de type en ligne
  2. Un élément bloc peut contenir n’importe quel élément ainsi que du texte

Donc pas de p dans un b, l’inverse étant possible.

Ces deux types de balises conditionnent l’affichage sur deux aspects essentiels : le positionnement et la dimension d’une boîte. Les éléments sont lus dans l’ordre du flux HTML et positionné selon leur type bloc ou en ligne. L’imbrication des éléments joue simplement sur la dimension des boîtes : un conteneur a ses limites fixées par ses enfants.

C’est sur le placement des boîtes que joue le type « en ligne » ou « bloc », et indirectement sur les dimensions. Voyons cela en détail.

En ligne

Positionnement

Le positionnement des éléments en ligne est dicté par le caractère textuel de leur contenu.

Les éléments en ligne qui se suivent sont afficher sur la même ligne, collés les uns aux autres, vers la droite dans l’ordre du flux.

Leur dimension, et surtout la largeur, ne dépend que du contenu textuel qui s’étire aux maximum, dans les limites bien sûr de la largeur du navigateur, auquel cas un retour à la ligne est provoqué.

Voici un exemple assez parlant, que nous avons déjà vu dans la leçon consacré à l’alignement vertical.

code
<a href="#">Lien</a>
<img src="tree-logo_opt.svg" width="100"/>
<span style="font-size:50px">La grande maison dans la prairie</span>
Petite en fait

Dans le rendu visuel correspondant, les éléments sont bien alignés, verticalement centrés sur la ligne de base (sauf pour les images alignés sur le bas).

rendu visuel
LienLa grande maison dans la prairie Petite en fait

Rappelons ici, grâce à cet exemple, le rôle de la balise span.

La balise en ligne span permet d’attribuer des styles à du texte. En l’absence de style explicitement écrit, elle n’a aucun effet visuel.

Dimensions

Pour la largeur, la règle est claire et logique, un élément en ligne a la largeur que son affichage lui donne, donc selon son contenu textuel. Pour la hauteur c’est un peu plus tordu. La hauteur déterminée par la taille de police qui s’applique à l’élément en ligne, c’est-à-dire la taille qui aura été définie dans un de ces ancêtres ou à défaut la taille paramétrée par l’utilisateur dans le navigateur. En voici un exemple très explicite :

code
<span style="border: 2px solid red">
   <a href="#">Lien</a>
   <span style="font-size:50px">
      La grande maison dans la prairie
   </span>
   Petite en fait
</span>

La directive CSS border, que nous allons traiter dans le modèle de boîte juste après, permet d’encadrer l’élément de rouge pour visualiser sa boîte.

rendu visuel
LienLa grande maison dans la prairiePetite en fait

Explication : la police du conteneur span est par défaut de 16px, fixée par le navigateur (on suppose qu’aucun de ces parents n’a changé la taille de police). C’est la même taille qui sera appliqué au lien à l’intérieur et au texte « Petite en fait ». En revanche, le span intérieur voit ses caractères agrandis mais cela ne s’applique qu’à lui. La hauteur de l’élément en ligne conteneur n’est donc pas déterminée par son contenu.

C’est bon à savoir mais en pratique on ne va pas s’amuser à faire d’un élément en ligne un conteneur et à lui appliquer une bordure. Les éléments blocs sont là pour ça !

Blocs

Positionnement

Ces éléments là, comme un paragraphe ou un titre, prennent toute la largeur, peu importe leur contenu, et donc fort logiquement s’empilent sans jamais être côte-à-côte.

Notons que l’équivalent du span en élément bloc s’appelle div. Cette balise, très (trop !) utilisée permet d’avoir un conteneur de type bloc qui ne produit aucun effet visuel.

Dimensions

Les dimensions d’un bloc sont déterminées par son contenu. Pendant l’affichage de celui-ci, la boîte du bloc parent s’étire pour épouser les contours du contenu.

Je ne précise pas ce qui se passe lorsque l’on combine, soit par imbrication, soit pas succession, des éléments blocs et des éléments en ligne. C’est à vous d’essayer, en appliquant à cet exercice les principes que nous venons de voir.

Exercice 1

Dans cet exercice, nous présentons des structures HTML représentée sous forme d’arborescence où les éléments sont notés par une lettre. Le fond rouge désigne un élément de type en ligne, le blanc un élément bloc. Par exemple pour la structure n° 1, on peut imaginer que trois éléments qui se suivent, respectivement nommés A, B et C sont un h1, un b et un p, tous placés dans body.

Le but est de déterminer pour chaque situation comment s’affiche les boîtes dans une fenêtre de navigateur, en ne considérant que le positionnement (la dimension est inconnue car on ne sait pas ce que contiennent les éléments). Voici par exemple la solution pour la situation n°1, grossièrement dessinée :

Les blocs A et C prennent toute la largeur, l’élément en ligne B se place sur une ligne seul mais ne prend pas toute la largeur.

Faites de même pour les situations 2 à 4 au crayon sur du papier ou dans un logiciel de schéma.

Exercice 2

Vous allez procéder de même pour dessiner une composition de page mais cette fois plus précisément à partir d’un code HTML fourni. Vous devez représenter chaque boîte correspondant à un élément HTML avec son positionnement et ses dimensions approximatives. Voici le code, délibérément sous forme d’image pour ne pas être tenté de le tester dans un navigateur :

Voici un exemple de façon de présenter la solution, avec ici des dispositions complètement fausses :

Modèle de boîte

Une fois muni de ce principe de boîte dans laquelle s’affiche chaque élément HTML, selon deux modalités en ligne ou bloc, il reste à décrire comment « décorer » chaque boîte par des directives CSS : marges, bordures et dimensions. La norme CSS 2 a défini clairement ce modèle résumé par le schéma suivant :

Il est possible d’influer sur l’aspect d’une boîte par les propriétés CSS résumées dans ce schéma que nous allons décrire en détail. Certaines de ces propriétés ont des modalités d’applications différentes selon le type d’élément en ligne ou bloc.

Marges

Nous avons déjà vu les marges dans le chapitre précédent concernant les paragraphes. En fait la propriété CSS margin et ses dérivées s’appliquent à la boîte de tout élément. Elle permet d’espacer la boîte avec les boîtes qui seront disposées aux alentours, en désignant la distance minimale à respecter bord à bord.

propriété description valeur par défaut
margin-top
margin-bottom
margin-left
margin-right-
margin
  • distance bord-à-bord avec la boîte voisine respectivement en haut, en bas, à gauche et à droite
  • version abrégée margin qui a trois formes :
    • marginm : la même valeur pour les quatre marges
    • marginv h : la 1er valeur pour la marge verticale (haut et bas), la 2e valeur pour la marge horizontale (gauche et droite)
    • margintp rg bt lf : quatre valeurs dans l’ordre pour les marges haute, droite, basse et gauche
0

Il existe aussi la possibilité d’indiquer une « marge intérieure » entre le bord de la boîte et son contenu représenté par ses enfants, autres éléments ou bien texte. C’est une garantie d’espacement avec le contenu. La propriété est padding et les formes sont les mêmes que pour margin.

propriété description valeur par défaut
padding-top
padding-bottom
padding-left
padding-right-
padding
  • distance entre le bord haut, bas, gauche, droite avec le contenu
  • mêmes versions abrégées  quemargin
0

Fusion des marges

La fusion des marges extérieures (margin) fait que deux marges contiguës, dans le cas où deux éléments se suivent ou deux éléments sont imbriqués, s’affichent comme un espacement du maximum des deux marges. Les marges ne vont donc pas s’ajouter mais seule la plus grande des deux est retenue, la logique étant que l’espacement minimum demandé est assuré. Cette fusion obéit à des règles pas toujours simples à expliquer mais qui sont d’une logique implacable. Voyons des exemples à partir du code CSS suivant :

<style>
   body {
      margin: 0;
      border: 1px solid black;
   }

   header {
      margin: 40px;
      border: 1px solid blue;
      text-align: center;
   }

   article {
      margin: 20px;
      border: 1px solid red;
      text-align: center;
   }
</style>

1er cas : les deux éléments se suivent

Voici le code et le résultat.

code résultat
<header>
 Entête
</header>
<article>
 Article
</article>

L’entête a bien 40 pixels tout autour et l’article suit immédiatement, c’est-à-dire que la marge haute de 20 pixels de l’article est absorbée par la marge basse de l’entête (on a pas 60 pixels d’écart).

2è cas : les deux éléments sont imbriqués

Voici le code et le résultat.

code résultat
<header>
   <article>
      Article
   </article>
</header>

Ici, on voit bien les 40 pixels au-dessus de l’entête et les 20 pixels qui sépare le bord haut de l’entête du bord haut de l’article. La marge de l’article s’applique du fait de la présence d’une bordure pour les deux éléments.

Maintenant, copiez ce code, CSS et HTML dans une seule page et regarder le résultat dans le navigateur. Il est bien sûr conforme à ce qui est montré ici. Allez dans les outils du développeur et jouez sur l’invalidation (case à cocher dans la fenêtre des styles) des bordures pour observer le résultat.

Vous constaterez que les marges ne fusionnent plus si les deux bordures sont absentes.

Dernier petit test important. Dans le code précédent, remplacez article par h1 et supprimez les bordures et les marges. Vous remarquerez que la marge haute par défaut du titre h1 s’applique, même si celui-ci est placé dans un bloc (ici header). C’est logique, la marge demandée est respectée. C’est un point qui pourra vous jouer des tours dans le développement.

Application selon le type d’élément

Ce tableau résume les modalités d’application selon que l’élément est de type en ligne ou bloc. A connaître pour éviter les mauvaises surprises.

propriété en ligne bloc
marges hautes et basses NON OUI
marges droites et gauches OUI OUI

Bordures et couleurs de fond

Voici le résumé des propriétés de fond de boîte, pour remplir avec une couleur ou avec une image. Pour rappel, la couleur vert clair désigne les valeurs par défaut et une longueur en pourcentage est relative à la dimension du parent.

propriété description valeurs possibles
background-color Couleur de fond
transparent pas de fond
couleur code couleur
background-image Image de fond url donnée par le syntaxe url(adresse)

Par défaut l’image est placée dans le coin haut gauche et se répète, si la place est disponible, horizontalement et verticalement

background-position Emplacement de l’image de fond par rapport à la boîte.

Il y a un calcul assez savant pour aller de 0% qui désigne la distance bord-à-bord à gauche jusqu’à 100% à droite en passant par 50% qui centre l’image !

  • background-position: h
  • background-position: h v

Les valeurs h et v donne respectivement la position horizontale et verticale. Si seule h est fournie, la valeur pour v est center.

Valeurs possibles :

mot qui désigne l’alignement
left, right ou center pour h
top, bottom ou center pour v
longueur dans n’importe quelle unité CSS y compris en % (pour h, 0%=left, 50%=center, 100%=right)
background-size Taille de l’image de fond
auto l’image est affichée dans sa taille d’origine
w
w h
largeur (w) et hauteur (h, auto si absent) en unité fixe ou en pourcentage
cover l’image couvre toute la boîte, des bandes de même longueur ou hauteur sont coupées verticalement ou horizontalement au besoin
contain l’image contient entièrement dans la boîte, cela oblige éventuelle à ajouter un espacement verticalement ou horizontalement
background-repeat Défini si l’image est répétée pour remplir toute la boîte
repeat l’image est répétée dans les deux directions
repeat-x l’image se répète horizontalement
repeat-y l’image se répète verticalement
no-repeat l’image est affichée une seule fois
space les images répétées couvrent tout l’espace, avec des blancs de taille équilibrée entre les images, sans que les images ne soient tronquées
round les images répétées sont étirées pour ne laisser aucun espace vide
background-attachment
scroll L’image se déplace avec la page
fixed L’image ne se déplace pas avec la page
local L’image se déplace avec le contenu de l’élément

La norme CSS3 définit les propriétés background-clip et background-origin, moins utilisée, que vous pouvez découvrir sur W3school ou MDN.

A noter que background est une propriété résumé qui prend à la suite les valeurs de background-color, background-image, background-position/background-size, background-repeat, background-origin background-clip background-attachment, seules une partie des premières valeurs pouvant être fournie, le reste prenant les valeurs par défaut.

Venons en aux bordures.

propriété description valeurs possibles
border-width Largeur de la  bordure Une valeur de longueur fixe ou en pourcentage
border-style Style du trait de bordure
none pas de bordure
hidden idem
dotted
Test
dashed
Test
solid
Test
double
Test
groove
Test
ridge
Test
inset
Test
outset
Test
border-color Couleur de la bordure
transparent pas de fond
couleur code couleur
border Résumé prenant les valeurs border-width border-style border-color à la suite ex : border: 2px solid black

Toutes ces propriétés portent sur les quatre bordures. Il est possible d’en cibler une en particulier en ajoutant top, bottom, left ou right juste après border avec un tiret, par exemple border-bottom ou border-bottom-width.

Il est possible désormais de mettre une image en bordure grâce aux CSS 3 (consulter un site pour plus d’informations).

Largeur et hauteur

propriété description valeurs possibles
width Largeur de la boîte
auto Largeur par défaut (explication ci-après)
longueur dimension en fixe ou en pourcentage
height Hauteur de la boîte idem

Les dimensions d’une boîte, en largeur et hauteur, dépendent de son contenu et correspondent au comportement associé à la valeur par défaut auto. Dans tous les cas la boîte s’étire pour épouser les formes de son contenu une fois celui-ci affiché. A noter que les éléments sans contenu ont des comportements de dimension particuliers, comme l’image par exemple qui possède une dimension intrinsèque.

Rappelons à présent quelle sont les dimensions automatiques d’une boîte (valeur auto) et dans quel cas on peut les fixer par une valeur autre que auto.

propriété en ligne avec contenant bloc
largeur Le contenu textuel s’étale au maximum vers la droite puis ver le bas, limité en général par une largeur fixée pour un parent bloc ou par la fenêtre du navigateur.
Il n’est pas possible d’en fixer la valeur.
En automatique, la boîte occupe toute la largeur (équivalent à width:100%)
La largeur peut être fixée.
hauteur La hauteur est aussi déterminée par le contenu textuel qui s’étire vers le bas selon la largueur du parent (élément avec largeur fixé ou fenêtre  du navigateur) et n’inclue pas les marges intérieures et les bordures.
Il n’est pas possible d’en fixer la valeur.
En automatique, la hauteur épouse le contenu de la boîte, y compris les marges et les bordures.
La hauteur peut être fixée.

Le point en gras pour la hauteur des éléments en ligne, peut s’avérer important pour la pagination. En voici l’illustration :

code résultat
<!DOCTYPE html>
<html lang="fr">
   <head>
      <title>Inline</title>
      <meta charset="utf-8">
      <style>
         .spe {
            padding: 5px;
            border: 1px solid red;
         }
      </style>
   </head>

   <body>
      <div style="width:12em">
         Lorem ipsum dolor sit amet,
         <span class="spe">consectetur</span>
         adipiscing <span class="spe">elit</span>.
         Aenean tortor felis, imperdiet in auctor
         <span class="spe">elit veled</span> vel, laoreet 
      </div>
   </body>
</html>

Que se passe-t-il si la largeur ou la hauteur fixé pour un élément est inférieure à celle de son contenu ?

Il y a débordement, le contenu est toujours affiché, débordant de sa boîte. Toutefois la boîte garde la taille qui lui est fixée, en particulier sa bordure s’affiche selon cette taille. Mais les éléments qui suivent la boîte dans le flux HTML seront poussés par le contenu qui déborde.

En voici un exemple plus parlant que toute explication.

<!DOCTYPE html>
<html lang="fr">
   <head>
      <title>Ma page</title>
      <meta charset="utf-8">
      <style>
         div {
            width: 250px;
            height: 250px;
            border: 2px solid red;
         }
         div>div {
            border: 1px solid black;
            width: 100px;
            height: 100px;
         }
      </style>
   </head>
   <body>
      <div>
         <div></div>
         <div></div>
         <div></div>
         La suite
      </div>
   </body>
</html>

Le résultat visuel est clair :

C’est la propriété CSS overflow qui détermine le rendu visuel de ce débordement.

propriété description valeurs possibles
overflow Comportement si le contenu déborde de sa boîte
visible Le contenu est affiché et déborde de son conteneur
hidden Tout ce qui déborder est effacé et n’affecte pas l’affichage
scroll Ce qui déborde est masqué mais accessible par un ascenseur affiché en toute circonstance
auto Comme scroll mais l’ascenseur n’est affiché que s’il y a du contenu masqué

En CSS 3, overflow-x et overflow-y ont été introduites pour cibler le débordement horizontal ou vertical.

C’est fini ! Leçon très longue mais essentielle pour la suite avec la mise en page, où nous verrons de nombreuses situations concrètes pour mettre en œuvre ces propriétés de boîte.

Terminons donc pas un bel exercice de synthèse.

Exercice 3

L’exercice consiste à créer des déclarations CSS dans la feuille boite_synthese.css, sans toucher au code HTML de boite_synthese.html de façon à obtenir le rendu du fichier PDF fourni. Voici les consignes pour obtenir ce résultat :

  1. Le fond de la page est occupé par l’image fournie qui doit se répéter si nécessaire et être fixe (le fond ne bouge pas lorsqu’on fait défiler la page)
  2. Les trois blocs de titre et de section occupe en largeur 70% de la fenêtre, sont centrés, sont séparés entre eux de 80 pixels et ont un bord de 3 pixels noir
  3. Les espacements à l »intérieur des blocs sont : 10 pixels pour tous les titres, 20 pixels pour les paragraphes à gauche et en bas (on remarque qu’ils sont collés au bloc à droite)
  4. Les paragraphes de section ont une hauteur de 200 pixels et un ascenseur vertical s’affiche si nécessaire pour donner accès au texte tronqué
  5. Le texte des titres est centré, le grand titre a une taille de 60 pixels et les titres de section de 22 pixels
  6. Les trois blocs ont un fond blanc à 50% transparent (ça on ne l’a pas vu, c’est un bonus qu’il faut trouver sur Internet !)

TypeNomTaille

html
Boite Synthese 1.9k

pdf
Boite Synthese 1.5M

jpg
Star Clusters 525.9k

A retenir

 

Ressources utiles
Téléchargements
Pour aller plus loin

Laisser un commentaire