je ne comprends pas un code avec align-items: baseline;

a marqué ce sujet comme résolu.

Bonjour,

J’apprends flexbox et je ne comprends pas un code d’exemple que j’ai trouvé avec align-items: baseline, où j’ai deux div imbriquées avec un affichage baseline pour le texte de la deuxième div. C’est à dire pour un texte qui n’est pas un enfant direct du conteneur parent, mais un petit enfant.

Pourtant la propriété définie dans le CSS conteneur parent fonctionne sur le petit enfant..! Normalement cela ne devrait pas marcher puisqu’il n’y a pas d’héritage pour cette propriété. Pourtant ça marche… Pourquoi?

Voici le code

<!DOCTYPE html>
<html>					
  <head>				
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Exercices Flexbox</title>
    <style> 
         * {
            margin: 0;
            padding: 0;
         }       
         html {
            background-color:  white;
         }      
         body {
            border: 2px solid black;
            width: 40%; 
            height: 600px;
            margin: 50px auto 0;
            padding: 20px ;
            background-color:  #eeeeee; 
         }  
  	 #conteneur {
  	    width: 80%;
  	    height: 500px;
  	    margin:auto;
  	    border: 1px solid black; 
  	    display: flex;
  	    align-items: baseline;
  	    background-color:#cccccc;
  	    font-size: 2em;
 	 }
	 #conteneur div {
  	    flex: 1;
  	    border: 1px solid black;
  	    display: flex;
            align-items:center;
  	    font-weight: 900;
  	    background-color:white;
	  }
	  .un{
	    min-height:30px;"
	  }
   	   .deux{
	     min-height:170px;"
	  }
	   .trois{
	     min-height:450px;"
	  }
	   .quatre{
	     min-height:250px;"
          }
    </style>    
  </head>
  <body>
     <header>						
       <h1>Exercice flexbox..</h1>
       <br>
     </header>	
     <div id="conteneur">	
       <div class="un">Un</div>
       <div class="deux">Deux XXXX XXX</div>  
       <div class="trois">Trois XXX XXXXXXXXX XXXXXXXXX XXXX XXXXXXXX XXXXXXXXXX.</div>
       <div class="quatre">Quatre XXX XXXXXXX XXX XX.</div>
     </div>
  </body>
</html>

@Amaury — Mise en forme du code (modifie ton message pour voir comment on fait).

+0 -0

Hello,

J’ai du mal à voir de quel petit-enfant tu parles : ton #conteneur n’a qu’un seul niveau de descendance.

align-items sert à aligner les enfants de #conteneur selon leur baseline (ici la première ligne de texte que contient chacun de ces enfants), le résultat est donc prévisible.

Le texte n’est pas un élément mais du contenu, il n’est donc pas géré avec les mêmes propriétés.

Tu attendais quel résultat exactement ?


Pour ceux qui voudraient tester le résultat en live, j’ai mis ça sur un Codepen

Alors attention ! Les <div> dans ton conteneur sont alignés sur leur baseline (la ligne de texte, celle qui souligne le texte). Ils ne sont pas aligné sur la ligne de base du conteneur ! Mais bien sur celle des enfants

Techniquement, on calcul la ligne de base du conteur à partir de celles des enfants.

Cependant ! Le texte de chaque div est centré à cause de la présence de display: flex dans le CSS des div. Leur ligne de base sont décalées mais comme les conteurs parents sont alignés sur leur ligne de base alors l’alignement est correcte.

+1 -0

Merci viki et ache En fait je n’ai pas une seule div mais deux div imbriquées La div conteneur est le parent La div un, deux …etc sont certes des enfants du conteneur mais étant eux mêmes conteneurs, leur contenu n’est-il pas leur enfant et aussi le petit enfant de conteneur. Dans ce cas ce qui s’aligne avec baseline me semble non pas un enfant mais un petit enfant. Où est-ce que je me trompe? Ce qui me perturbe aussi c’est que j’ai deux align-items différents dans le CSS qui s’exécutent en même temps sur une même div une fois baseline et une fois center. Normalement cela devrait être l’un ou l’autre align-items et pas les deux à la fois non?

+0 -0

Les sélecteurs ne sont pas les mêmes entre baseline (#conteneur) et center (#conteneur div) :

  • l’un s’appliquera donc au conteneur pour aligner ses enfants directs
  • l’autre aux <div> descendantes (directes ou indirectes) de #conteneur pour aligner leurs enfants

Le texte n’est pas considéré comme un enfant par le CSS : tu ne peux pas le cibler avec un sélecteur1, c’est du contenu que tu peux mettre en forme avec des règles CSS par contre.

Comme l’a dit @ache, tes enfants on un align-items: center qui place le texte au centre des <div> qui ont des hauteurs forcées. Ensuite le parent de ces éléments a un align-items: baseline qui vient aligner la première ligne de texte de ces éléments, qui se retrouvent donc avec l’alignement que tu peux constater. Si tu mets un align-items: start sur #conteneur tu verras ce que ça donne pour aligner selon les bordures des éléments enfants plutôt de leur baseline.


  1. sauf quelques pseudo-sélecteurs spécifiques comme :first-letter, mais c’est anecdotique

Je comprends mieux Une autre question dans la foulée sur baseline. Quand on a plusieurs items à aligner avec baseline dans ce cas firstbaseline c’est la baseline du premier item sur laquelle s’alignent les autres items ou c’est la baseline qui se trouve le plus haut par rapport à n’importe quel item

Merci beaucoup viki Je viens de voir le lien CSS ça me semble vraiment pas simple, mais bon on va essayer de faire avec. Jusque là j’avais tout compris sur flexbox et j’étais content d’être arrivé au bout de l’étude. La baselaine était le dernier truc à éplucher et j’en avais fini, … et là je sais pas pourquoi je m’en mêle les pédales. Bon je peux m’en pâsser, j’en ai pas franchement besoin, mais c’est pour le principe j’aimerais vraiment tout comprendre Merci encore

je m’en mêle les pédales

En vérité la définition de la ligne de base d’un bloc est simple mais la définition de la baseline d’un bloc en flex à partir de l’alignement des lignes de bases de ses fils. 🤯
C’est pas que toi, la règle est vraiment complexe.

+2 -0

J’ai enfin compris mais j’en ai mis du temps…! En fait j’ai un peu modifié mon code ci-dessus, puis j’ai testé toutes les possibilités.

En résumé lorsqu’on a un des items qui n’a qu’une seule ligne et quelque soit la taille de sa boite l’alignement baseline, first baseline et end baseline se fait par rapport à lui.

Dans les autres cas l’alignement baseline ou first baseline se fait par rapport à l’item qui a le moins de lignes et dont l’affichage est par conséquent le plus haut.

Enfin avec last baseline l’item d’alignement sera celui qui a le texte le plus long et donc le plus bas. Une seule exception lorsqu’on a un item avec une ligne unique c’est lui qui sera pris en compte pour last baseline et non le texte le plus long.

Voila en résumé ce que j’en ai conclu Etes vous d’accord avec moi

Je regarde ça ce soir mais à priori ça correspond au modèle que j’ai en tête. Par-contre, il y a pleins d’exceptions je crois sur l’orientation et la lecture de droite à gauche.

Je veux pas te dire de bêtises, je vérifie.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte