<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Pierre Giraud</title>
	<atom:link href="https://www.pierre-giraud.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.pierre-giraud.com/</link>
	<description>Cours et tutoriels HTML, CSS, JavaScript, PHP - Apprendre à coder</description>
	<lastBuildDate>Tue, 18 May 2021 04:56:01 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://www.pierre-giraud.com/wp-content/uploads/2020/04/cropped-logo512-pierre-giraud3-1-32x32.png</url>
	<title>Pierre Giraud</title>
	<link>https://www.pierre-giraud.com/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Balise HTML ul – L’élément de liste non ordonnée</title>
		<link>https://www.pierre-giraud.com/balise-html-ul-element/</link>
					<comments>https://www.pierre-giraud.com/balise-html-ul-element/#respond</comments>
		
		<dc:creator><![CDATA[Pierre GIRAUD]]></dc:creator>
		<pubDate>Wed, 18 Dec 2019 07:00:01 +0000</pubDate>
				<category><![CDATA[HTML / CSS]]></category>
		<guid isPermaLink="false">https://www.pierre-giraud.com/?p=13248</guid>

					<description><![CDATA[<p>Définition L’élément ul représente une liste non ordonnée, c’est-à-dire une liste composée d’éléments sans hiérarchie ni ordre logique apparent ou qu’on souhaite faire ressortir. Chaque élément d’une liste non ordonnée est représenté par un élément HTML li. Ces éléments de liste possèdent des marqueurs qui prennent la forme de puces par défaut. On peut cependant ... <a title="Balise HTML ul – L’élément de liste non ordonnée" class="read-more" href="https://www.pierre-giraud.com/balise-html-ul-element/" aria-label="En savoir plus sur Balise HTML ul – L’élément de liste non ordonnée">Lire plus</a></p>
<p>L’article <a href="https://www.pierre-giraud.com/balise-html-ul-element/">Balise HTML ul – L’élément de liste non ordonnée</a> est apparu en premier sur <a href="https://www.pierre-giraud.com">Pierre Giraud</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="grille2lp">
<article class="ctn2lp">
<h2>Définition</h2>
<p>L’élément <code>ul</code> représente une liste non ordonnée, c’est-à-dire une liste composée d’éléments sans hiérarchie ni ordre logique apparent ou qu’on souhaite faire ressortir.</p>
<p>Chaque élément d’une liste non ordonnée est représenté par un élément HTML <code>li</code>. </p>
<p>Ces éléments de liste possèdent des marqueurs qui prennent la forme de puces par défaut. On peut cependant modifier l’apparence de ces marqueurs en utilisant la propriété CSS <code>list-style-type</code>.</p>
<p>&nbsp;</p>
<h2>Attributs</h2>
<p>L’élément <code>ul</code> ne possède pas d’attribut particulier. Il supporte les attributs universels comme l’ensemble des éléments HTML.</p>
<p>Pour rappel, les attributs universels sont des attributs qui peuvent être ajoutés à tous les éléments HTML. Quelques exemples d’attributs universels communs : <code>class</code>, <code>id</code>, <code>lang</code>, <code>style</code>, <code>title</code>…</p>
<p>&nbsp;</p>
<h2>Exemples d’utilisation</h2>
<p>Dans l&rsquo;exemple suivant, on crée deux listes non ordonnées. On modifie le style des marqueurs de la deuxième liste grâce à la propriété CSS <code>list-style-type</code>. </p>
<p class="codepen" data-height="572" data-theme-id="default" data-default-tab="html,result" data-user="pierregiraud" data-slug-hash="gObwmwW" style="height: 572px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Balise HTML ul">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/gObwmwW"><br />
  Balise HTML ul</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>&nbsp;</p>
<h2>Compatibilité navigateurs</h2>
<p>Ces informations sont tirées du site <a href="https://caniuse.com/#search=html%20element%3A%20ul" target="_blank" rel="noopener noreferrer">caniuse.com</a>. Les cases vertes indiquent que le navigateur supporte l’élément. Les cases grises indiquent que le support est inconnu. Les cases rouges indiquent que l’élément n’est pas supporté. Le chiffre dans chaque case correspond à la version du navigateur concernée.</p>
<p><img fetchpriority="high" decoding="async" src="https://www.pierre-giraud.com/wp-content/uploads/2019/12/ul-html-support-navigateur.png" alt="Element HTML ul support navigateur" width="1125" height="150" class="alignnone size-full wp-image-13264" srcset="https://www.pierre-giraud.com/wp-content/uploads/2019/12/ul-html-support-navigateur.png 1125w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/ul-html-support-navigateur-300x40.png 300w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/ul-html-support-navigateur-400x53.png 400w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/ul-html-support-navigateur-1024x137.png 1024w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/ul-html-support-navigateur-768x102.png 768w" sizes="(max-width: 1125px) 100vw, 1125px" /></p>
<p>&nbsp;</p>
<h2>Extraits de la documentation officielle</h2>
<p>Ces informations sont extraites de la <a href="https://www.w3.org/TR/html53/grouping-content.html#the-ul-element" target="_blank" rel="noopener noreferrer">spécification officielle (W3C)</a></p>
<p><img decoding="async" src="https://www.pierre-giraud.com/wp-content/uploads/2019/12/ul-html-reference-w3c.png" alt="Element HTML ul reference documentation officielle" width="700" height="562" class="alignnone size-full wp-image-13265" srcset="https://www.pierre-giraud.com/wp-content/uploads/2019/12/ul-html-reference-w3c.png 700w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/ul-html-reference-w3c-300x241.png 300w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/ul-html-reference-w3c-400x321.png 400w" sizes="(max-width: 700px) 100vw, 700px" /><br />
</article>
<nav>
<h2>Eléments HTML</h2>
<ul style="list-style-type: none; margin: 0px;">
<li><a href="https://www.pierre-giraud.com/balise-html-div-element/">div</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-p-element/">p</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-ul-element/">ul</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-ol-element/">ol</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-li-element/">li</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-dl-element/">dl</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-pre-element/">pre</a></li>
<li><a href=""></a></li>
<li><a href=""></a></li>
<li><a href=""></a></li>
</ul>
</nav></div>
<p>L’article <a href="https://www.pierre-giraud.com/balise-html-ul-element/">Balise HTML ul – L’élément de liste non ordonnée</a> est apparu en premier sur <a href="https://www.pierre-giraud.com">Pierre Giraud</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.pierre-giraud.com/balise-html-ul-element/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Balise HTML pre – L’élément de formatage du texte</title>
		<link>https://www.pierre-giraud.com/balise-html-pre-element/</link>
					<comments>https://www.pierre-giraud.com/balise-html-pre-element/#respond</comments>
		
		<dc:creator><![CDATA[Pierre GIRAUD]]></dc:creator>
		<pubDate>Tue, 17 Dec 2019 07:00:00 +0000</pubDate>
				<category><![CDATA[HTML / CSS]]></category>
		<guid isPermaLink="false">https://www.pierre-giraud.com/?p=13247</guid>

					<description><![CDATA[<p>Définition L’élément HTML pre permet de conserver le formatage effectué sur des texte avant l’affichage dans le navigateur, c’est-à-dire lors de la création du code dans l’éditeur de texte. Cet élément est généralement utilisé pour afficher du texte possédant un formatage particulier ou pour afficher tout simplement des exemples de code. On peut notamment l’utiliser ... <a title="Balise HTML pre – L’élément de formatage du texte" class="read-more" href="https://www.pierre-giraud.com/balise-html-pre-element/" aria-label="En savoir plus sur Balise HTML pre – L’élément de formatage du texte">Lire plus</a></p>
<p>L’article <a href="https://www.pierre-giraud.com/balise-html-pre-element/">Balise HTML pre – L’élément de formatage du texte</a> est apparu en premier sur <a href="https://www.pierre-giraud.com">Pierre Giraud</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="grille2lp">
<article class="ctn2lp">
<h2>Définition</h2>
<p>L’élément HTML <code>pre</code> permet de conserver le formatage effectué sur des texte avant l’affichage dans le navigateur, c’est-à-dire lors de la création du code dans l’éditeur de texte. </p>
<p>Cet élément est généralement utilisé pour afficher du texte possédant un formatage particulier ou pour afficher tout simplement des exemples de code. On peut notamment l’utiliser pour améliorer le rendu d’un tableau de données récupérées en PHP dans une base MySQL.</p>
<p>Si cet élément s’avère parfois pratique, attention à ne pas l’utiliser de manière abusive en remplacement du CSS car cela est une mauvaise pratique. On se souviendra qu’il convient de toujours utiliser, dans la mesure du possible, le CSS plutôt que le HTML pour la mise en forme.</p>
<p>En termes d’accessibilité, on fournira toujours une description alternative dans le cas où on utilise un élément <code>pre</code> pour créer des « dessins » (comme ceci par exemple : </p>
<pre>(o_O)</pre>
<p>) à partir d’éléments de texte.</p>
<p>&nbsp;</p>
<h2>Attributs</h2>
<p>L’élément <code>pre</code> ne possède pas d’attribut particulier. Il supporte les attributs universels comme l’ensemble des éléments HTML.</p>
<p>Pour rappel, les attributs universels sont des attributs qui peuvent être ajoutés à tous les éléments HTML. Quelques exemples d’attributs universels communs : <code>class</code>, <code>id</code>, <code>lang</code>, <code>style</code>, <code>title</code>…</p>
<p>&nbsp;</p>
<h2>Exemples d’utilisation</h2>
<p class="codepen" data-height="428" data-theme-id="default" data-default-tab="html,result" data-user="pierregiraud" data-slug-hash="zYxKZBQ" style="height: 428px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Balise HTML pre">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/zYxKZBQ"><br />
  Balise HTML pre</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>&nbsp;</p>
<h2>Compatibilité navigateurs</h2>
<p>Ces informations sont tirées du site <a href="https://caniuse.com/#search=html%20element%3A%20pre" target="_blank" rel="noopener noreferrer">caniuse.com</a>. Les cases vertes indiquent que le navigateur supporte l’élément. Les cases grises indiquent que le support est inconnu. Les cases rouges indiquent que l’élément n’est pas supporté. Le chiffre dans chaque case correspond à la version du navigateur concernée.</p>
<p><img decoding="async" src="https://www.pierre-giraud.com/wp-content/uploads/2019/12/pre-html-support-navigateur.png" alt="Element HTML pre support navigateur" width="1123" height="150" class="alignnone size-full wp-image-13261" srcset="https://www.pierre-giraud.com/wp-content/uploads/2019/12/pre-html-support-navigateur.png 1123w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/pre-html-support-navigateur-300x40.png 300w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/pre-html-support-navigateur-400x53.png 400w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/pre-html-support-navigateur-1024x137.png 1024w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/pre-html-support-navigateur-768x103.png 768w" sizes="(max-width: 1123px) 100vw, 1123px" /></p>
<p>&nbsp;</p>
<h2>Spécification officielle</h2>
<p>Ces informations sont extraites de la <a href="https://www.w3.org/TR/html53/grouping-content.html#the-pre-element" target="_blank" rel="noopener noreferrer">spécification officielle (W3C)</a></p>
<p><img loading="lazy" decoding="async" src="https://www.pierre-giraud.com/wp-content/uploads/2019/12/pre-html-reference-w3c.png" alt="Element HTML pre reference documentation officielle" width="700" height="514" class="alignnone size-full wp-image-13262" srcset="https://www.pierre-giraud.com/wp-content/uploads/2019/12/pre-html-reference-w3c.png 700w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/pre-html-reference-w3c-300x220.png 300w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/pre-html-reference-w3c-400x294.png 400w" sizes="auto, (max-width: 700px) 100vw, 700px" /><br />
</article>
<nav>
<h2>Eléments HTML</h2>
<ul style="list-style-type: none; margin: 0px;">
<li><a href="https://www.pierre-giraud.com/balise-html-div-element/">div</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-p-element/">p</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-ul-element/">ul</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-ol-element/">ol</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-li-element/">li</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-dl-element/">dl</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-pre-element/">pre</a></li>
<li><a href=""></a></li>
<li><a href=""></a></li>
<li><a href=""></a></li>
</ul>
</nav></div>
<p>L’article <a href="https://www.pierre-giraud.com/balise-html-pre-element/">Balise HTML pre – L’élément de formatage du texte</a> est apparu en premier sur <a href="https://www.pierre-giraud.com">Pierre Giraud</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.pierre-giraud.com/balise-html-pre-element/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Flexbox CSS &#8211; Flexible Box Layout : Le Guide Complet</title>
		<link>https://www.pierre-giraud.com/flexbox-css/</link>
					<comments>https://www.pierre-giraud.com/flexbox-css/#respond</comments>
		
		<dc:creator><![CDATA[Pierre GIRAUD]]></dc:creator>
		<pubDate>Mon, 16 Dec 2019 07:00:34 +0000</pubDate>
				<category><![CDATA[HTML / CSS]]></category>
		<guid isPermaLink="false">https://www.pierre-giraud.com/?p=13217</guid>

					<description><![CDATA[<p>Le flexbox ou modèle des boites flexibles est un des modèles de disposition CSS les plus puissants que l’on va pouvoir manipuler. Le flexbox va nous permettre de créer des dispositions complexes pour nos documents HTML. Ce modèle se compose d’un conteneur flexible et d’éléments flexibles dont la principale caractéristique va d’être… flexibles, c’est-à-dire de ... <a title="Flexbox CSS &#8211; Flexible Box Layout : Le Guide Complet" class="read-more" href="https://www.pierre-giraud.com/flexbox-css/" aria-label="En savoir plus sur Flexbox CSS &#8211; Flexible Box Layout : Le Guide Complet">Lire plus</a></p>
<p>L’article <a href="https://www.pierre-giraud.com/flexbox-css/">Flexbox CSS &#8211; Flexible Box Layout : Le Guide Complet</a> est apparu en premier sur <a href="https://www.pierre-giraud.com">Pierre Giraud</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="grille2pr">
<article class="ctn2pr">
Le flexbox ou modèle des boites flexibles est un des modèles de disposition CSS les plus puissants que l’on va pouvoir manipuler.</p>
<p>Le flexbox va nous permettre de créer des dispositions complexes pour nos documents HTML. Ce modèle se compose d’un conteneur flexible et d’éléments flexibles dont la principale caractéristique va d’être… flexibles, c’est-à-dire de posséder une taille qui va s’adapter en fonction de l’espace disponible. </p>
<p>La déclaration d’un conteneur flexible crée automatiquement un nouveau contexte d’empilement ce qui signifie que les descendants directs d’un élément définir comme conteneur flexibles deviendront immédiatement des éléments flexibles auxquels on va pouvoir appliquer les propriétés du flexbox. </p>
<p>Le flexbox est, à la différence du modèle des grilles, un modèle de disposition principalement unidimensionnel : nous allons devoir définir un axe principal et un axe secondaire et la majorité du positionnement et de l’alignement des éléments flexibles va se faire selon l’axe principal. </p>
<p>A noter : Les propriétés <code>float</code>, <code>clear</code> et <code>vertical-align</code> n’ont aucun effet sur les éléments flexibles.</p>
<p>&nbsp;</p>
<h2>Création d’un conteneur flexible</h2>
<p>Pour utiliser les propriétés du flexbox, nous allons déjà devoir définir un conteneur flexible. On va pour cela appliquer un <code>display : flex</code> ou <code>display : inline-flex</code> à un élément.</p>
<p>Cela crée automatiquement un nouveau contexte de formatage pour les éléments descendants directs de l’élément conteneur flexible.</p>
<p>Notez que <code>display : flex</code> va créer un conteneur flexible de niveau bloc tandis que <code>display : inline-flex</code> va créer un conteneur flexible de niveau inline. </p>
<p>Un conteneur avec <code>display : flex</code> occupera donc tout l’espace disponible dans son parent et se placera sur sa propre ligne tandis qu’un conteneur avec <code>display : inline-flex</code> n’occupera que l’espace nécessaire à son contenu dans son parent et pourra se placer à côté d’autres éléments. </p>
<p>Vous pouvez voir la différence de comportement entre <code>display : flex</code> et <code>display : inline-flex</code> avec l’exemple suivant code HTML puis code CSS puis résultat) :</p>
<p class="codepen" data-height="648" data-theme-id="default" data-default-tab="html" data-user="pierregiraud" data-slug-hash="vYELdGM" data-preview="true" style="height: 648px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Flexible Box Layout #1 : display: flex &amp;amp; display: inline-flex">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/vYELdGM"><br />
  CSS Flexible Box Layout #1 : display: flex &amp; display: inline-flex</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="360" data-theme-id="default" data-default-tab="css" data-user="pierregiraud" data-slug-hash="vYELdGM" data-preview="true" style="height: 360px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Flexible Box Layout #1 : display: flex &amp;amp; display: inline-flex">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/vYELdGM"><br />
  CSS Flexible Box Layout #1 : display: flex &amp; display: inline-flex</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="265" data-theme-id="default" data-default-tab="result" data-user="pierregiraud" data-slug-hash="vYELdGM" data-preview="true" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Flexible Box Layout #1 : display: flex &amp;amp; display: inline-flex">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/vYELdGM"><br />
  CSS Flexible Box Layout #1 : display: flex &amp; display: inline-flex</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>Ici, on utilise 4 éléments <code>div class="container"</code> et <code>div class="inline-container"</code> qu’on définit comme conteneurs flexibles. Les éléments à l’intérieur de ces conteneurs (les <code>div class="item"</code>) deviennent de facto des éléments flexibles. </p>
<p>On voit bien que les deux premiers conteneurs flexibles, qui sont de type bloc, occupent toute la largeur dans leur élément conteneur (le <code>body</code> de la page) tandis que les deux derniers qui sont de niveau inline n’occupent que la place nécessaire à leur contenu et se placent côte-à-côte et non pas sur une nouvelle ligne. </p>
<p>&#038;nbsp ;</p>
<h2>Définir la direction du placement des éléments flexibles : flex-direction</h2>
<p>Le flexbox est un modèle principalement unidimensionnel. Cela implique qu’on va devoir définir un axe principal selon lequel nos éléments flexibles vont venir s’écouler. En termes physiques, l’axe principal peut être soit horizontal, soit vertical. </p>
<p>On utilise la propriété <code>flex-direction</code> pour définir la direction et le sens de l’axe principal utilisé par le conteneur flexible pour placer les éléments flexibles. </p>
<p>Cette propriété accepte les valeurs suivantes : </p>
<ul>
<li><code>row</code> (valeur par défaut) : L’axe principal aura la même orientation que l’axe en ligne tel qu’il a été défini par la propriété <code>writing-mode</code>. Le début de l’axe sera là où le texte commence et la fin sera là où il va (si le texte est horizontal et va de gauche à droite, le début de l’axe est physiquement le coin gauche et la fin le coin droit) ;</li>
<li><code>row-reverse</code> : L’axe principal aura la même orientation que l’axe en ligne tel qu’il a été défini par la propriété <code>writing-mode</code> ou <code>direction</code>. La fin de l’axe correspond au côté où le texte démarre et inversement ;</li>
<li><code>column</code> : L’axe principal aura la même orientation que l’axe de bloc tel qu’il a été défini par la propriété <code>writing-mode</code>. Le début de l’axe correspond au côté lié au début de l’axe de bloc et la fin de l’axe au côté lié à la fin de l’axe de bloc. Dans un mode où les blocs s’empilent verticalement et de haut vers le bas, le début de l’axe correspond physiquement au bord supérieur et la fin au bord inférieur ;</li>
<li><code>column-reverse</code> : L’axe principal aura la même orientation que l’axe de bloc tel qu’il a été défini par la propriété <code>writing-mode</code>. La fin de l’axe correspond au côté lié au début de l’axe de bloc et inversement.</li>
</ul>
<p>Attention : retenez bien que le résultat produit par ces valeurs dépend des valeurs définies pour la propriété <code>writing-mode</code>. </p>
<p>La propriété <code>writing-mode</code> permet d’indiquer si les lignes de texte sont disposées horizontalement ou verticalement et la direction dans laquelle les blocs progressent. </p>
<p>Par défaut, les blocs vont s’empiler verticalement de haut en bas et le texte va s’écouler horizontalement, de gauche à droite. Dans ce cas-là, l’axe de bloc sera physiquement l’axe vertical et le début physique de l’axe sera le haut. L’axe en ligne sera physiquement l’axe horizontal et le début sera à gauche.</p>
<p>Pour en savoir plus à ce sujet, n’hésitez pas à consulter mon article sur les valeurs logiques et les modes d’écriture en CSS.</p>
<p>Prenons immédiatement un premier exemple d’utilisation de <code>flex-direction</code> avec <code>writing-mode : horizontal-tb</code> :</p>
<p class="codepen" data-height="559" data-theme-id="default" data-default-tab="html" data-user="pierregiraud" data-slug-hash="vYEGrRM" data-preview="true" style="height: 559px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Flexible Box Layout #2 : flex-direction">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/vYEGrRM"><br />
  CSS Flexible Box Layout #2 : flex-direction</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="370" data-theme-id="default" data-default-tab="css" data-user="pierregiraud" data-slug-hash="vYEGrRM" data-preview="true" style="height: 370px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Flexible Box Layout #2 : flex-direction">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/vYEGrRM"><br />
  CSS Flexible Box Layout #2 : flex-direction</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="284" data-theme-id="default" data-default-tab="result" data-user="pierregiraud" data-slug-hash="vYEGrRM" data-preview="true" style="height: 284px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Flexible Box Layout #2 : flex-direction">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/vYEGrRM"><br />
  CSS Flexible Box Layout #2 : flex-direction</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>Dans cet exemple, on crée trois conteneurs flexibles. Le mode d’écriture est défini par <code>writing-mode</code> qui va appliquer sa valeur par défaut qui est <code>horizontal-tb</code>. Cette valeur signifie que les blocs s’empilent verticalement, de haut en bas. Le mode d&rsquo;écriture et le mode typographique sont horizontaux. </p>
<p>On passe un <code>flex-direction : row</code> à notre premier conteneur. L’axe principal du conteneur va avoir la même orientation que l’axe en ligne tel qu’il a été défini par la propriété <code>writing-mode</code> et le début de l’axe sera le côté ou commence le texte.</p>
<p>Avec <code>writing-mode : horizontal-tb</code>, les blocs s’empilent verticalement. L’axe de bloc est donc l’axe vertical et l’axe en ligne est l’axe horizontal. La direction de l’écriture est de gauche ) droite pour moi ; le début de l’axe se situe donc physiquement à gauche. </p>
<p>L’axe principal du conteneur sera donc physiquement l’axe horizontal et le début de l’axe sera ) gauche. Les éléments flexibles vont venir se placer selon cet axe, donc en ligne et de gauche à droite.</p>
<p>On passe un <code>flex-direction : row-reverse</code> à notre deuxième conteneur. L’axe principal sera donc également physiquement l’axe horizontal et le début de l’axe correspondra au côté où arrive la texte, c’est-à-dire physiquement à droite pour moi. </p>
<p>Finalement, on passe un <code>flex-direction : column</code> à notre troisième conteneur. L’axe principal du conteneur aura donc la même orientation que l’axe de bloc tel qu’il a été défini par la propriété <code>writing-mode</code>. Ce sera donc ici physiquement l’axe vertical. Le début de l’axe correspond au côté lié au début de l’axe de bloc, c’est-à-dire dans une disposition de haut en bas au côté supérieur. </p>
<p>Les éléments flexibles de ce conteneur vont donc être disposés en colonne, de haut en bas. </p>
<p>Changeons maintenant de mode d’écriture afin de voir l’impact sur les valeurs de <code>flex-direction</code>. On peut par exemple choisir des <code>writing-mode : vertical-lr</code> et <code>writing-mode : sideways-lr</code>.</p>
<p>Dans le cas d’un <code>writing-mode : vertical-lr</code>, les blocs s’empilent horizontalement, de droite à gauche et le mode d&rsquo;écriture et le mode typographique sont verticaux. L’axe de bloc est donc physiquement l’axe horizontal.</p>
<p>Dans le cas d’un <code>writing-mode : sideways-lr</code>, les blocs s’empilent horizontalement, de gauche à droite. Le mode d&rsquo;écriture est vertical, tandis que le mode typographique est horizontal. L’axe de bloc est donc physiquement l’axe horizontal.</p>
<p class="codepen" data-height="775" data-theme-id="default" data-default-tab="html" data-user="pierregiraud" data-slug-hash="mdyPjEV" data-preview="true" style="height: 775px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Flexible Box Layout #3 : flex-direction &amp;amp; writing-mode">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/mdyPjEV"><br />
  CSS Flexible Box Layout #3 : flex-direction &amp; writing-mode</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="405" data-theme-id="default" data-default-tab="css" data-user="pierregiraud" data-slug-hash="mdyPjEV" data-preview="true" style="height: 405px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Flexible Box Layout #3 : flex-direction &amp;amp; writing-mode">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/mdyPjEV"><br />
  CSS Flexible Box Layout #3 : flex-direction &amp; writing-mode</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="425" data-theme-id="default" data-default-tab="result" data-user="pierregiraud" data-slug-hash="mdyPjEV" data-preview="true" style="height: 425px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Flexible Box Layout #3 : flex-direction &amp;amp; writing-mode">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/mdyPjEV"><br />
  CSS Flexible Box Layout #3 : flex-direction &amp; writing-mode</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>&nbsp;</p>
<h2>Contrôler le passage à la ligne des éléments flexibles : flex-wrap</h2>
<p>La propriété <code>flex-direction</code> permet de définir quel axe est l’axe principal du conteneur flexible et la direction du placement des éléments flexibles dans cet axe. </p>
<p>La propriété <code>flex-wrap</code> permet d’indiquer si les éléments flexibles ont le droit de passer à la ligne ou pas (c’est-à-dire si le conteneur flexible peut être multilignes ou pas) ainsi que la direction des éléments dans laquelle les lignes doivent être empilées (c’est-à-dire la direction de l’axe secondaire). </p>
<p>A noter : </p>
<ol>
<li>On entend par « ligne » une ligne dans la direction de l’axe principal : une « ligne » peut être une rangée si l’axe principal est horizontal ou une colonne si l’axe principal est l’axe vertical ;</li>
<li>L’axe secondaire est défini automatiquement lorsqu’on définit l’axe principal : si l’axe principal est l’axe horizontal, l’axe secondaire sera l’axe vertical et inversement.</li>
</ol>
<p>Par défaut, il faut savoir que les conteneurs flexibles sont monoligne (les éléments flexibles n’ont pas le droit de passer à la ligne). Cela peut poser un problème lorsqu’un conteneur flexible possède beaucoup d’éléments flexibles (ou que ceux-ci possèdent des tailles explicites) puisqu’ils risquent alors de dépasser du conteneur. </p>
<p>La propriété <code>flex-wrap</code> va nous permettre de modifier ce comportement et de permettre aux éléments d’aller se placer sur la ligne (rangée ou colonne) suivante plutôt que de dépasser du conteneur flexible. Cette propriété supporte les valeurs suivantes : </p>
<ul>
<li><code>nowrap</code> (valeur par défaut) : Les éléments n’ont pas le droit d’aller à la ligne ;</li>
<li><code>wrap</code> : Les éléments vont se placer à la ligne plutôt que de dépasser du conteneur. L’axe secondaire aura la même direction que l’axe en ligne ou l’axe de bloc (selon l’axe principal choisir) défini par <code>writing-mode</code> ;</li>
<li><code>wrap-reverse</code> : Les éléments vont se placer à la ligne plutôt que de dépasser du conteneur. La direction de l’axe secondaire sera inversée par rapport à celle de l’axe en ligne ou l’axe de bloc (selon l’axe principal choisir) définie par <code>writing-mode</code>.</li>
</ul>
<p>Imaginons qu’on ait défini un <code>writing-mode : horizontal-tb</code>. Le texte va donc s’écouler physiquement de gauche à droite puis de haut en bas. </p>
<p>Si on a également défini un conteneur flexible avec <code>flex-direction : row</code>, alors l’axe principal est l’axe physique horizontal et le contenu s’écoule de gauche à droite. En ajoutant <code>flex-wrap : wrap</code>, les éléments qui dépassent vont venir se placer sous les premiers (les lignes vont s’empiler du haut vers le bas). En ajoutant <code>flex-wrap : wrap-reverse</code>, en revanche, les éléments qui dépassent vont venir se placer au-dessus des premiers (les lignes vont s’empiler du bas vers le haut). </p>
<p>Si on a plutôt défini un conteneur flexible avec <code>flex-direction : column</code>, alors l’axe principal est l’axe physique vertical et le contenu s’écoule de haut en bas. En ajoutant <code>flex-wrap : wrap</code>, les éléments qui dépassent vont venir se placer à droite des premiers (les lignes vont s’empiler de la gauche vers la droite). En ajoutant <code>flex-wrap : wrap-reverse</code>, en revanche, les éléments qui dépassent vont venir se placer à gauche des premiers (les lignes vont s’empiler de la droite vers la gauche). </p>
<p>Regardez plutôt l’exemple suivant : </p>
<p class="codepen" data-height="727" data-theme-id="default" data-default-tab="html" data-user="pierregiraud" data-slug-hash="PowNBOp" data-preview="true" style="height: 727px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Flexible Box Layout #4 : flex-wrap">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/PowNBOp"><br />
  CSS Flexible Box Layout #4 : flex-wrap</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="495" data-theme-id="default" data-default-tab="css" data-user="pierregiraud" data-slug-hash="PowNBOp" data-preview="true" style="height: 495px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Flexible Box Layout #4 : flex-wrap">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/PowNBOp"><br />
  CSS Flexible Box Layout #4 : flex-wrap</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="581" data-theme-id="default" data-default-tab="result" data-user="pierregiraud" data-slug-hash="PowNBOp" data-preview="true" style="height: 581px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Flexible Box Layout #4 : flex-wrap">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/PowNBOp"><br />
  CSS Flexible Box Layout #4 : flex-wrap</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>Note : Dans cet exemple, j’ajoute des tailles explicites à mes éléments flexibles afin que la taille totale des éléments flexibles soit plus grande que celle du conteneur dans son axe principal (en largeur si l’axe principal est horizontal ou en hauteur si l’axe principal est vertical). Je fais cela plutôt que d’ajouter beaucoup d’éléments pour ne pas que mon code d’exemple soit trop long.</p>
<p>Si aucun passage à la ligne n’est autorisé, les éléments vont par défaut essayer de rétrécir pour rentrer dans le conteneur. C’est la raison pour laquelle vous ne voyez aucun élément dépasser. Cependant, si vous essayez d’ajouter des éléments dans le conteneur, vous allez voir qu’ils vont dépasser à partir du moment où la somme des largeurs des contenus sera plus importante que la taille du conteneur.</p>
<p>&nbsp;</p>
<h2>La propriété raccourcie flex-flow</h2>
<p>La propriété <code>flex-flow</code> est une propriété raccourcie qui permet de définir les valeurs de <code>flex-direction</code> et de <code>flex-wrap</code> en une seule fois. </p>
<p>&nbsp;</p>
<h2>Contrôler la flexibilité des éléments flexibles avec flex</h2>
<p>L’un des intérêts principaux du flexbox est de définir des éléments flexibles et de pouvoir contrôler leur flexibilité, c’est-à-dire leur capacité à rétrécir si le conteneur a besoin d’espace ou au contraire de s’étendre si il reste de l’espace dans le conteneur flex à distribuer. </p>
<h3>Contrôler la faculté des éléments flexibles à s’étendre avec flex-grow</h3>
<p>La propriété <code>flex-grow</code> permet de définir le facteur d’agrandissement d’un élément flexible. </p>
<p>Ce facteur d’agrandissement détermine la quantité d’espace disponible qui sera absorbée par cet élément flexible par rapport aux autres éléments flexibles. La valeur par défaut est <code>flex-grow : 0</code> qui signifie que les éléments flexibles n’ont pas le droit de grandir.</p>
<p>Imaginons un conteneur flexible avec <code>flex-direction : row</code> qui fait 1000px de large et qui contient 3 éléments qui font chacun 200px de large. Il reste donc 1000 – (3 * 200) = 400px d’espace disponible en largeur.</p>
<p>On définit un <code>flex-grow : 2</code> au premier élément flexible et un <code>flex-grow : 1</code> aux deux autres. Le premier élément va grandir de manière à absorber deux fois plus d’espace que les autres. Il va donc absorber 200px sur les 400 restants tandis que les deux autres éléments vont absorber 100px chacun.</p>
<p class="codepen" data-height="637" data-theme-id="default" data-default-tab="html" data-user="pierregiraud" data-slug-hash="jOErrrL" data-preview="true" style="height: 637px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Flexible Box Layout #5 : flex-grow">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/jOErrrL"><br />
  CSS Flexible Box Layout #5 : flex-grow</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="377" data-theme-id="default" data-default-tab="css" data-user="pierregiraud" data-slug-hash="jOErrrL" data-preview="true" style="height: 377px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Flexible Box Layout #5 : flex-grow">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/jOErrrL"><br />
  CSS Flexible Box Layout #5 : flex-grow</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="426" data-theme-id="default" data-default-tab="result" data-user="pierregiraud" data-slug-hash="jOErrrL" data-preview="true" style="height: 426px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Flexible Box Layout #5 : flex-grow">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/jOErrrL"><br />
  CSS Flexible Box Layout #5 : flex-grow</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<h3>Contrôler la faculté des éléments flexibles à rétrécir avec flex-shrink</h3>
<p>La propriété <code>flex-shrink</code> permet de définir le facteur de rétrécissement d’un élément flexible. </p>
<p>Ce facteur de rétrécissement détermine la capacité des éléments à se compresser pour faire de la place dans le conteneur lorsque la taille de l’ensemble des éléments flexibles est supérieure à celle du conteneur. </p>
<p>La valeur par défaut est <code>flex-shrink : 1</code>, ce qui signifie que les éléments vont par défaut se compresser au besoin. C’est la raison pour laquelle ils ne dépassaient pas du conteneur dans l’exemple donné pour illustrer le comportement de la propriété <code>flex-wrap</code>. </p>
<p class="codepen" data-height="643" data-theme-id="default" data-default-tab="html" data-user="pierregiraud" data-slug-hash="xxbOOXe" data-preview="true" style="height: 643px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Flexible Box Layout #6 : flex-shrink">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/xxbOOXe"><br />
  CSS Flexible Box Layout #6 : flex-shrink</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="377" data-theme-id="default" data-default-tab="css" data-user="pierregiraud" data-slug-hash="xxbOOXe" data-preview="true" style="height: 377px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Flexible Box Layout #6 : flex-shrink">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/xxbOOXe"><br />
  CSS Flexible Box Layout #6 : flex-shrink</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="442" data-theme-id="default" data-default-tab="result" data-user="pierregiraud" data-slug-hash="xxbOOXe" data-preview="true" style="height: 442px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Flexible Box Layout #6 : flex-shrink">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/xxbOOXe"><br />
  CSS Flexible Box Layout #6 : flex-shrink</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<h3>Définir la taille de base des éléments flexibles avant distribution de l’espace restant</h3>
<p>La propriété <code>flex-basis</code> permet de définir la taille de base des éléments flexibles avant distribution de l’espace restant ou rétrécissement. La taille définie sera la largeur si l’axe principal est horizontal ou la hauteur si l’axe principal est vertical.</p>
<p>La propriété <code>flex-basis</code> accepte des valeurs de type longueur absolue (px par exemple) ou relative (% par exemple) ainsi que les valeurs <code>auto</code> (valeur par défaut) et <code>content</code>. </p>
<p>La valeur <code>auto</code> indique que la propriété <code>flex-basis</code> devra se référer à la valeur définie par <code>width</code> ou <code>height</code> si elle a été définie (ou sera égale à <code>content</code> si rien n’a été défini). </p>
<p>La valeur <code>content</code> indique que la taille de l’élément flexible sera relative à celle de son contenu. Attention, cette valeur est encore peu supportée (elle n’est notamment pas supportée par Chrome ni par Safari). </p>
<p class="codepen" data-height="390" data-theme-id="default" data-default-tab="html" data-user="pierregiraud" data-slug-hash="VwYjjxL" data-preview="true" style="height: 390px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Flexible Box Layout #7 : flex-basis">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/VwYjjxL"><br />
  CSS Flexible Box Layout #7 : flex-basis</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="386" data-theme-id="default" data-default-tab="css" data-user="pierregiraud" data-slug-hash="VwYjjxL" data-preview="true" style="height: 386px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Flexible Box Layout #7 : flex-basis">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/VwYjjxL"><br />
  CSS Flexible Box Layout #7 : flex-basis</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="202" data-theme-id="default" data-default-tab="result" data-user="pierregiraud" data-slug-hash="VwYjjxL" data-preview="true" style="height: 202px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Flexible Box Layout #7 : flex-basis">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/VwYjjxL"><br />
  CSS Flexible Box Layout #7 : flex-basis</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<h3>La propriété raccourcie flex</h3>
<p>La propriété <code>flex</code> est une propriété raccourcie qui permet de définir les valeurs de <code>flex-grow</code>, <code>flex-shrink</code> et <code>flex-basis</code> d’un seul coup. </p>
<p>On peut soit passer les valeurs des propriétés <code>flex-grow</code>, <code>flex-shrink</code> et <code>flex-basis</code> à la suite à <code>flex</code>, soit lui passer les mots clefs suivants :</p>
<ul>
<li><code>flex : initial</code> qui est l’équivalent de <code>flex : 0 1 auto</code> ;</li>
<li><code>flex : auto</code> qui est l’équivalent de <code>flex : 1 1 auto</code> ;</li>
<li><code>flex : none</code> qui est l’équivalent de <code>flex : 0 0 auto</code>.</li>
</ul>
<p>&nbsp;</p>
<h2>Gérer l’alignement des éléments flexibles selon l’axe principal : justify-content</h2>
<p>La propriété <code>justify-content</code> va nous permettre de gérer l’alignement des éléments flexibles selon l’axe principal choisi pour le conteneur flex. On va appliquer <code>justify-content</code> au conteneur flex.</p>
<p>Si l’axe principal est l’axe horizontal, on va par exemple pouvoir aligner (grouper) les éléments à gauche, à droite, au centre ou encore faire en sorte qu’ils soient répartis équitablement dans l’axe, etc. </p>
<p>La propriété <code>justify-content</code> supporte les valeurs suivantes : </p>
<ul>
<li><code>flex-start</code> (valeur par défaut) : Les éléments sont groupés au début de l’axe principal ;</li>
<li><code>flex-end</code> : Les éléments sont groupés à la fin de l’axe principal ;</li>
<li><code>center</code> : Les éléments sont groupés au centre de l’axe principal ;</li>
<li><code>space-between</code> : Les éléments sont distribués régulièrement dans l’axe, ce qui signifie qu’il y aura le même espace entre chaque élément. Le début du premier élément est collé contre le début du conteneur et la fin du dernier élément est collée contre la fin du conteneur ;</li>
<li><code>space-around</code> : Les éléments sont distribués régulièrement dans l’axe, ce qui signifie qu’il y aura le même espace entre chaque élément. L’espace entre le début du premier élément et le début du conteneur et entre la fin du dernier élément et la fin du conteneur est égal à la moitié de l’espace entre deux éléments.</li>
</ul>
<p class="codepen" data-height="978" data-theme-id="default" data-default-tab="html" data-user="pierregiraud" data-slug-hash="oNgLoLO" data-preview="true" style="height: 978px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Flexible Box Layout #8 : justify-content">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/oNgLoLO"><br />
  CSS Flexible Box Layout #8 : justify-content</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="459" data-theme-id="default" data-default-tab="css" data-user="pierregiraud" data-slug-hash="oNgLoLO" data-preview="true" style="height: 459px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Flexible Box Layout #8 : justify-content">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/oNgLoLO"><br />
  CSS Flexible Box Layout #8 : justify-content</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="657" data-theme-id="default" data-default-tab="result" data-user="pierregiraud" data-slug-hash="oNgLoLO" data-preview="true" style="height: 657px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Flexible Box Layout #8 : justify-content">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/oNgLoLO"><br />
  CSS Flexible Box Layout #8 : justify-content</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>Dans cet exemple, on crée cinq conteneurs flexibles avec un axe principal horizontal et trois conteneurs flexibles avec un axe principal vertical qui contiennent chacun trois éléments flexibles. Chacun des éléments flexibles possède un <code>flex : 0 0 20%</code> afin de s’assurer qu’il reste de l’espace dans l’axe principal du conteneur (condition nécessaire pour observer l’effet de <code>justify-content</code>). On applique ensuite la propriété <code>justify-content</code> avec des valeurs différentes à chaque conteneur.</p>
<p>&nbsp;</p>
<h2>Gérer l’alignement des éléments flexibles selon l’axe secondaire : align-items et align-self</h2>
<p>La propriété <code>justify-content</code> permet d’aligner les éléments flexibles selon l’axe principal du conteneur flex. La propriété <code>align-items</code> permet elle d’aligner les éléments flexibles selon l’axe secondaire du conteneur flex. </p>
<p>Si l’axe principal est l’axe horizontal, la propriété <code>align-items</code> va donc gérer l’alignement des éléments dans l’axe vertical et inversement. </p>
<p>La propriété <code>align-self</code> permet quant à elle de régler l’alignement des éléments flexibles de manière individuelle. </p>
<p>Nous allons appliquer <code>align-items</code> au conteneur et <code>align-self</code> aux différents éléments flexibles. Notez que si <code>align-items</code> et <code>align-self</code> sont définies pour un élément, la valeur retenue pour l’élément flexible sera celle de <code>align-self</code>.</p>
<p>Les propriétés <code>align-items</code> et <code>align-self</code> supportent les valeurs suivantes :</p>
<ul>
<li><code>auto</code> (uniquement supportée par <code>align-self</code>) : L’alignement des éléments flexibles dans l’axe secondaire du conteneur est contrôlé par la valeur de <code>align-items</code> du parent de l’élément ;</li>
<li><code>flex-start</code> : Les éléments flexibles vont se grouper au début de l’axe secondaire ;</li>
<li><code>flex-end</code> : Les éléments flexibles vont se grouper à la fin de l’axe secondaire ;</li>
<li><code>center</code> : Les éléments flexibles vont se grouper au centre de l’axe secondaire ;</li>
<li><code>baseline</code> : Les éléments vont s’aligner dans l’axe secondaire de telle manière à ce que leur ligne de base soit alignée ;</li>
<li><code>stretch</code> : Les éléments flexibles vont s’étendre pour occuper toute la place dans l’axe secondaire du conteneur flex.</li>
</ul>
<p>A noter que la valeur par défaut de <code>align-items</code> est <code>stretch</code> tandis que celle de <code>align-self</code> est <code>auto</code>.</p>
<p class="codepen" data-height="981" data-theme-id="default" data-default-tab="html" data-user="pierregiraud" data-slug-hash="dyPXZXE" data-preview="true" style="height: 981px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Flexible Box Layout #9 : align-items &amp;amp; align-self">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/dyPXZXE"><br />
  CSS Flexible Box Layout #9 : align-items &amp; align-self</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="475" data-theme-id="default" data-default-tab="css" data-user="pierregiraud" data-slug-hash="dyPXZXE" data-preview="true" style="height: 475px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Flexible Box Layout #9 : align-items &amp;amp; align-self">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/dyPXZXE"><br />
  CSS Flexible Box Layout #9 : align-items &amp; align-self</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="899" data-theme-id="default" data-default-tab="result" data-user="pierregiraud" data-slug-hash="dyPXZXE" data-preview="true" style="height: 899px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Flexible Box Layout #9 : align-items &amp;amp; align-self">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/dyPXZXE"><br />
  CSS Flexible Box Layout #9 : align-items &amp; align-self</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>Les cinq premiers conteneurs flexibles de l’exemple précédent possèdent un axe principal physique horizontal. La propriété <code>align-items</code> va donc aligner les éléments dans l’axe secondaire. Le début physique de cet axe est le bord supérieur du conteneur et la fin le bord inférieur. <code>align-items : flex-start</code> va donc aligner les éléments en haut tandis que <code>align-items : flex</code> end alignera les éléments en bas.</p>
<p>Pour les conteneurs flex dont l’axe principal est l’axe vertical, la propriété <code>align-items</code> va aligner les éléments dans l’axe horizontal (à gauche, à droite, etc.). </p>
<p>Un élément du dernier conteneur possède également un <code>align-self : center</code> afin que vous puissiez bien observer que cette propriété applique sa valeur par-dessus <code>align-items</code>.</p>
<p>&nbsp;</p>
<h2>Gérer l’alignement des lignes selon l’axe secondaire : align-content</h2>
<p>Dans certains cas, il peut arriver que le conteneur flexible soit plus grand que l’ensemble des éléments qu’il contient dans son axe secondaire et qu’il reste donc de l’espace à distribuer. </p>
<p>Dans ce cas-là, on peut utiliser la propriété <code>align-content</code> qui va servir à aligner les différentes lignes selon l’axe secondaire du conteneur, c’est-à-dire qui va nous permettre de répartir l’espace restant selon l’axe secondaire du conteneur en plaçant cet espace avant, après ou entre les lignes. </p>
<p>Notez que la propriété <code>align-content</code> n’a aucun effet si le conteneur flexible ne possède qu’une seule ligne. </p>
<p>La propriété <code>align-content</code> supporte les valeurs suivantes : </p>
<ul>
<li><code>flex-start</code> : Les lignes d’éléments flexibles vont se grouper au début du conteneur flexible selon son axe secondaire ;</li>
<li><code>flex-end</code> : Les lignes d’éléments flexibles vont se grouper à la fin du conteneur flexible selon son axe secondaire ;</li>
<li><code>center</code> : Les lignes d’éléments flexibles vont se grouper au centre du conteneur flexible selon son axe secondaire ;</li>
<li><code>space-between</code> : L’espace restant dans le conteneur va être réparti équitablement entre les lignes selon l’axe secondaire. Il n’y a pas d’espace entre le départ du conteneur et la première ligne ni entre la fin du conteneur et la dernière ligne ;</li>
<li><code>space-around</code> : L’espace restant dans le conteneur va être réparti équitablement entre les lignes selon l’axe secondaire. L’écart entre le début du conteneur et la première ligne et entre la dernière ligne et la fin du conteneur est égal à la moitié de l’espace entre deux lignes ;</li>
<li><code>stretch</code> (valeur par défaut) : Les lignes vont s’étendre afin d’occuper tout l’espace selon l’axe secondaire du conteneur.</li>
</ul>
<p class="codepen" data-height="986" data-theme-id="default" data-default-tab="html" data-user="pierregiraud" data-slug-hash="VwYjrjJ" data-preview="true" style="height: 986px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Flexible Box Layout #10 : align-content">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/VwYjrjJ"><br />
  CSS Flexible Box Layout #10 : align-content</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="497" data-theme-id="default" data-default-tab="css" data-user="pierregiraud" data-slug-hash="VwYjrjJ" data-preview="true" style="height: 497px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Flexible Box Layout #10 : align-content">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/VwYjrjJ"><br />
  CSS Flexible Box Layout #10 : align-content</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="902" data-theme-id="default" data-default-tab="result" data-user="pierregiraud" data-slug-hash="VwYjrjJ" data-preview="true" style="height: 902px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Flexible Box Layout #10 : align-content">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/VwYjrjJ"><br />
  CSS Flexible Box Layout #10 : align-content</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>Ici, on définit plusieurs conteneurs flexibles et on fait en sorte que ces conteneurs soient plus grands que l’ensemble des lignes qu’ils contiennent afin qu’il reste de l’espace à distribuer selon leur axe secondaire. On distribue ensuite cet espace avec <code>align-content</code>.</p>
<p>&nbsp;</p>
<h2>Tableau récapitulatif des propriétés du flexbox CSS</h2>
<div style="overflow-x:auto">
<table>
<thead>
<tr>
<th>Propriété</th>
<th>Valeurs (<span class="gras">défaut</span>)</th>
<th>S’applique à</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>display</code></td>
<td>flex<br />inline-flex</td>
<td>Conteneur flex</td>
<td>Définit un conteneur flex</td>
</tr>
<tr>
<td><code>flex-direction</code></td>
<td><span class="gras">row</span>| row-reverse | column | column-reverse</td>
<td>Conteneur flex</td>
<td>Définit la direction de l’axe principal du conteneur flex</td>
</tr>
<tr>
<td><code>flex-wrap</code></td>
<td><span class="gras">nowrap</span>| wrap | wrap-reverse</td>
<td>Conteneur flex</td>
<td>Définit si le conteneur flexible doit être monoligne ou peut être multilignes et donc définit si les éléments flexibles peuvent passer à la ligne plutôt que de dépasser</td>
</tr>
<tr>
<td><code>flex-flow</code></td>
<td>&lt;flex-direction&gt; &lt;flex-wrap&gt;</td>
<td>Conteneur flex</td>
<td>Notation raccourcie de <code>flex-direction</code> et <code>flex-flow</code></td>
</tr>
<tr>
<td><code>flex-grow</code></td>
<td>&lt;nombre&gt; (<span class="gras">0</span>)</td>
<td>Éléments flex</td>
<td>Définit un facteur d’absorption de l’espace vide pour un élément flex</td>
</tr>
<tr>
<td><code>flex-shrink</code></td>
<td>&lt;nombre&gt; (<span class="gras">1</span>)</td>
<td>Éléments flex</td>
<td>Définit un facteur de rétrécissement pour un élément flex</td>
</tr>
<tr>
<td><code>flex-basis</code></td>
<td><span class="gras">auto</span> | content | &lt;taille&gt; </td>
<td>Éléments flex</td>
<td>Définit la taille de base d’un élément flex avant tout redimensionnement (avant absorption ou rétrécissement)</td>
</tr>
<tr>
<td><code>flex</code></td>
<td><span class="gras">initial</span>| auto | none | &lt;flew-grow&gt; &lt;flex-shrink&gt; &lt;flex-basis&gt;</td>
<td>Éléments flex</td>
<td>Notation raccourcie de <code>flex-grow</code>, <code>flex-shrink</code> et <code>flex-basis</code></td>
</tr>
<tr>
<td><code>justify-content</code></td>
<td><span class="gras">flex-start</span> | flex-end | center | space-between | space-around</td>
<td>Conteneur flex</td>
<td>Permet d’aligner les éléments flexibles dans l’axe principal du conteneur flex</td>
</tr>
<tr>
<td><code>align-items</code></td>
<td>flex-start | flex-end | center | baseline | <span class="gras">stretch</span></td>
<td>Conteneur flex</td>
<td>Permet d’aligner les éléments flexibles dans l’axe secondaire du conteneur flex</td>
</tr>
<tr>
<td><code>align-self</code></td>
<td><span class="gras">auto</span> | flex-start | flex-end | center | baseline | stretch</td>
<td>Éléments flex</td>
<td>Permet d’aligner un élément flexible en particulier dans l’axe secondaire du conteneur flex</td>
</tr>
<tr>
<td><code>align-content</code></td>
<td>flex-start | flex-end | center | space-between | space-around | <span class="gras">stretch</span></td>
<td>Conteneur flex</td>
<td>Permet d’aligner les lignes d’éléments flexibles dans l’axe secondaire du conteneur flex</td>
</tr>
</tbody>
</table>
</div>
</article>
<aside>
<div class="asidep">
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script><br />
<!-- PG v. 2019 --><br />
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8384266137058067"
     data-ad-slot="8226819743"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>
</div>
</aside>
</div>
<p>L’article <a href="https://www.pierre-giraud.com/flexbox-css/">Flexbox CSS &#8211; Flexible Box Layout : Le Guide Complet</a> est apparu en premier sur <a href="https://www.pierre-giraud.com">Pierre Giraud</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.pierre-giraud.com/flexbox-css/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Balise HTML p – L’élément de paragraphe</title>
		<link>https://www.pierre-giraud.com/balise-html-p-element/</link>
					<comments>https://www.pierre-giraud.com/balise-html-p-element/#respond</comments>
		
		<dc:creator><![CDATA[Pierre GIRAUD]]></dc:creator>
		<pubDate>Sun, 15 Dec 2019 07:00:50 +0000</pubDate>
				<category><![CDATA[HTML / CSS]]></category>
		<guid isPermaLink="false">https://www.pierre-giraud.com/?p=13246</guid>

					<description><![CDATA[<p>Définition L’élément HTML p représente un paragraphe. Un paragraphe est un ensemble de texte qui peut occuper autant de lignes qu’on le souhaite dans un document. L’élément p est généralement défini comme un élément de type bloc par les navigateurs, ce qui implique qu’il occupera toute la largeur disponible dans son élément conteneur. On peut ... <a title="Balise HTML p – L’élément de paragraphe" class="read-more" href="https://www.pierre-giraud.com/balise-html-p-element/" aria-label="En savoir plus sur Balise HTML p – L’élément de paragraphe">Lire plus</a></p>
<p>L’article <a href="https://www.pierre-giraud.com/balise-html-p-element/">Balise HTML p – L’élément de paragraphe</a> est apparu en premier sur <a href="https://www.pierre-giraud.com">Pierre Giraud</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="grille2lp">
<article class="ctn2lp">
<h2>Définition</h2>
<p>L’élément HTML <code>p</code> représente un paragraphe. Un paragraphe est un ensemble de texte qui peut occuper autant de lignes qu’on le souhaite dans un document.</p>
<p>L’élément <code>p</code> est généralement défini comme un élément de type bloc par les navigateurs, ce qui implique qu’il occupera toute la largeur disponible dans son élément conteneur. </p>
<p>On peut modifier la hauteur des lignes en CSS avec la propriété <code>line-height</code> ainsi que l’apparence de la police et notamment sa taille, son épaisseur et son inclinaison avec <code>font-size</code<, <code>font-weight</code> et <code>font-style</code>.</p>
<p>Pour une meilleure accessibilité, on essaiera généralement de faire des paragraphes relativement courts (cela aidera les utilisateurs atteints de déficiences et utilisant des liseuses d’écran à naviguer plus facilement dans nos pages).</p>
<p>&nbsp;</p>
<h2>Attributs</h2>
<p>L’élément <code>p</code> ne possède pas d’attribut particulier. Il supporte les attributs universels comme l’ensemble des éléments HTML.</p>
<p>Pour rappel, les attributs universels sont des attributs qui peuvent être ajoutés à tous les éléments HTML. Quelques exemples d’attributs universels communs : <code>class</code>, <code>id</code>, <code>lang</code>, <code>style</code>, <code>title</code>…</p>
<p>&nbsp;</p>
<h2>Exemples d’utilisation</h2>
<p>Dans l&rsquo;exemple ci-dessous, on définit deux paragraphes. On applique des styles CSS au deuxième paragraphe.</p>
<p class="codepen" data-height="389" data-theme-id="default" data-default-tab="html,result" data-user="pierregiraud" data-slug-hash="QWwKpEr" style="height: 389px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Balise HTML p">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/QWwKpEr"><br />
  Balise HTML p</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>&nbsp;</p>
<h2>Compatibilité navigateurs</h2>
<p>Ces informations sont tirées du site <a href="https://caniuse.com/#search=html%20element%3A%20p" target="_blank" rel="noopener noreferrer">caniuse.com</a>. Les cases vertes indiquent que le navigateur supporte l’élément. Les cases grises indiquent que le support est inconnu. Les cases rouges indiquent que l’élément n’est pas supporté. Le chiffre dans chaque case correspond à la version du navigateur concernée.</p>
<p><img loading="lazy" decoding="async" src="https://www.pierre-giraud.com/wp-content/uploads/2019/12/p-html-support-navigateur.png" alt="Element HTML p support navigateur" width="1123" height="150" class="alignnone size-full wp-image-13258" srcset="https://www.pierre-giraud.com/wp-content/uploads/2019/12/p-html-support-navigateur.png 1123w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/p-html-support-navigateur-300x40.png 300w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/p-html-support-navigateur-400x53.png 400w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/p-html-support-navigateur-1024x137.png 1024w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/p-html-support-navigateur-768x103.png 768w" sizes="auto, (max-width: 1123px) 100vw, 1123px" /></p>
<p>&nbsp;</p>
<h2>Spécification officielle</h2>
<p>Ces informations sont extraites de la <a href="https://www.w3.org/TR/html53/grouping-content.html#the-p-element" target="_blank" rel="noopener noreferrer">spécification officielle (W3C)</a></p>
<p><img loading="lazy" decoding="async" src="https://www.pierre-giraud.com/wp-content/uploads/2019/12/p-html-reference-w3c.png" alt="Element HTML p reference documentation officielle" width="700" height="600" class="alignnone size-full wp-image-13259" srcset="https://www.pierre-giraud.com/wp-content/uploads/2019/12/p-html-reference-w3c.png 700w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/p-html-reference-w3c-300x257.png 300w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/p-html-reference-w3c-400x343.png 400w" sizes="auto, (max-width: 700px) 100vw, 700px" /><br />
</article>
<nav>
<h2>Eléments HTML</h2>
<ul style="list-style-type: none; margin: 0px;">
<li><a href="https://www.pierre-giraud.com/balise-html-div-element/">div</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-p-element/">p</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-ul-element/">ul</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-ol-element/">ol</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-li-element/">li</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-dl-element/">dl</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-pre-element/">pre</a></li>
<li><a href=""></a></li>
<li><a href=""></a></li>
<li><a href=""></a></li>
</ul>
</nav></div>
<p>L’article <a href="https://www.pierre-giraud.com/balise-html-p-element/">Balise HTML p – L’élément de paragraphe</a> est apparu en premier sur <a href="https://www.pierre-giraud.com">Pierre Giraud</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.pierre-giraud.com/balise-html-p-element/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Balise HTML ol – L’élément de liste ordonnée</title>
		<link>https://www.pierre-giraud.com/balise-html-ol-element/</link>
					<comments>https://www.pierre-giraud.com/balise-html-ol-element/#respond</comments>
		
		<dc:creator><![CDATA[Pierre GIRAUD]]></dc:creator>
		<pubDate>Sat, 14 Dec 2019 07:00:49 +0000</pubDate>
				<category><![CDATA[HTML / CSS]]></category>
		<guid isPermaLink="false">https://www.pierre-giraud.com/?p=13245</guid>

					<description><![CDATA[<p>Définition L’élément HTML ol représente une liste ordonnée d’éléments. On utilise un élément de liste ordonnée lorsqu’on veut mettre en avant un certain ordre hiérarchique et / ou logique entre les éléments de la liste. Les éléments d’une liste ordonnée sont définis par des éléments HTML li. Chaque nouvel élément de liste doit être déclaré ... <a title="Balise HTML ol – L’élément de liste ordonnée" class="read-more" href="https://www.pierre-giraud.com/balise-html-ol-element/" aria-label="En savoir plus sur Balise HTML ol – L’élément de liste ordonnée">Lire plus</a></p>
<p>L’article <a href="https://www.pierre-giraud.com/balise-html-ol-element/">Balise HTML ol – L’élément de liste ordonnée</a> est apparu en premier sur <a href="https://www.pierre-giraud.com">Pierre Giraud</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="grille2lp">
<article class="ctn2lp">
<h2>Définition</h2>
<p>L’élément HTML <code>ol</code> représente une liste ordonnée d’éléments. On utilise un élément de liste ordonnée lorsqu’on veut mettre en avant un certain ordre hiérarchique et / ou logique entre les éléments de la liste.</p>
<p>Les éléments d’une liste ordonnée sont définis par des éléments HTML <code>li</code>. Chaque nouvel élément de liste doit être déclaré avec un élément <code>li</code>. </p>
<p>Dans le cas d’une liste ordonnée, les éléments de liste possèdent des marqueurs qui vont refléter l’ordre des éléments de liste à l’aide d’entiers incrémentés (1, 2, 3…) par défaut. </p>
<p>On va pouvoir changer l’apparence des marqueurs en CSS grâce à la propriété <code>list-style-type</code> qui va nous permettre de choisir le marqueur de notre choix (chiffres romains, lettres de l’alphabet minuscules ou majuscules, etc.).</p>
<p>&nbsp;</p>
<h2>Attributs</h2>
<p>L’élément <code>ol</code> possède deux attributs particuliers : les attributs <code>start</code> et <code>reversed</code>. </p>
<p>L’attribut <code>start</code> permet de définir l’indice de départ pour les éléments de liste ordonnée. Les marqueurs des éléments de liste démarreront à partir de la valeur passée à l’attribut <code>start</code>.</p>
<p>L’attribut <code>reversed</code> permet d’inverser la numérotation des marqueurs des éléments de liste. Avec cet attribut, le premier élément déclaré dans la liste héritera de la valeur qu’aurait eu le marqueur du dernier élément de liste sans l’attribut et etc. De manière sémantique, cela permet d’indiquer que le premier élément est le moins important dans la hiérarchie / le dernier dans l’ordre logique.</p>
<p>&nbsp;</p>
<h2>Exemples d’utilisation</h2>
<p>Dans l&rsquo;exemple suivant, on définit deux listes ordonnées en HTML. On modifie l&rsquo;apparence des puces de la deuxième liste grâce à la propriété CSS <code>list-style-type</code>. Quelques valeurs courantes de la propriétés sont <code>disc</code>, <code>circle</code>, <code>square</code>, <code>decimal</code>, <code>lower-latin</code>, <code>lower-roman</code>, <code>lower-greek</code>&#8230;</p>
<p class="codepen" data-height="468" data-theme-id="default" data-default-tab="html,result" data-user="pierregiraud" data-slug-hash="YzPGZqW" style="height: 468px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Balise HTML ol">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/YzPGZqW"><br />
  Balise HTML ol</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>&nbsp;</p>
<h2>Compatibilité navigateurs</h2>
<p>Ces informations sont tirées du site <a href="https://caniuse.com/#search=html%20element%3A%20ol" target="_blank" rel="noopener noreferrer">caniuse.com</a>. Les cases vertes indiquent que le navigateur supporte l’élément. Les cases grises indiquent que le support est inconnu. Les cases rouges indiquent que l’élément n’est pas supporté. Le chiffre dans chaque case correspond à la version du navigateur concernée.</p>
<p><img loading="lazy" decoding="async" src="https://www.pierre-giraud.com/wp-content/uploads/2019/12/ol-html-support-navigateur.png" alt="Element HTML ol support navigateur" width="1123" height="150" class="alignnone size-full wp-image-13255" srcset="https://www.pierre-giraud.com/wp-content/uploads/2019/12/ol-html-support-navigateur.png 1123w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/ol-html-support-navigateur-300x40.png 300w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/ol-html-support-navigateur-400x53.png 400w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/ol-html-support-navigateur-1024x137.png 1024w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/ol-html-support-navigateur-768x103.png 768w" sizes="auto, (max-width: 1123px) 100vw, 1123px" /></p>
<p>&nbsp;</p>
<h2>Extraits de la documentation officielle</h2>
<p>Ces informations sont extraites de la <a href="https://www.w3.org/TR/html53/grouping-content.html#the-ol-element" target="_blank" rel="noopener noreferrer">spécification officielle (W3C)</a></p>
<p><img loading="lazy" decoding="async" src="https://www.pierre-giraud.com/wp-content/uploads/2019/12/ol-html-reference-w3c.png" alt="Element HTML ol reference documentation officielle" width="700" height="688" class="alignnone size-full wp-image-13256" srcset="https://www.pierre-giraud.com/wp-content/uploads/2019/12/ol-html-reference-w3c.png 700w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/ol-html-reference-w3c-300x295.png 300w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/ol-html-reference-w3c-400x393.png 400w" sizes="auto, (max-width: 700px) 100vw, 700px" /><br />
</article>
<nav>
<h2>Eléments HTML</h2>
<ul style="list-style-type: none; margin: 0px;">
<li><a href="https://www.pierre-giraud.com/balise-html-div-element/">div</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-p-element/">p</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-ul-element/">ul</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-ol-element/">ol</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-li-element/">li</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-dl-element/">dl</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-pre-element/">pre</a></li>
<li><a href=""></a></li>
<li><a href=""></a></li>
<li><a href=""></a></li>
</ul>
</nav></div>
<p>L’article <a href="https://www.pierre-giraud.com/balise-html-ol-element/">Balise HTML ol – L’élément de liste ordonnée</a> est apparu en premier sur <a href="https://www.pierre-giraud.com">Pierre Giraud</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.pierre-giraud.com/balise-html-ol-element/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Balise HTML li – L’élément de liste</title>
		<link>https://www.pierre-giraud.com/balise-html-li-element/</link>
					<comments>https://www.pierre-giraud.com/balise-html-li-element/#respond</comments>
		
		<dc:creator><![CDATA[Pierre GIRAUD]]></dc:creator>
		<pubDate>Fri, 13 Dec 2019 07:00:48 +0000</pubDate>
				<category><![CDATA[HTML / CSS]]></category>
		<guid isPermaLink="false">https://www.pierre-giraud.com/?p=13244</guid>

					<description><![CDATA[<p>Définition L’élément HTML li représente un élément de liste d’une liste ordonnée ou non ordonnée (mais pas d’une liste de définitions). On va donc placer les éléments li à l’intérieur d’un élément ol (liste ordonnée) ou ul (liste non ordonnée) et utiliser autant d’éléments li que notre liste contient d’éléments de liste. Un marqueur (ou ... <a title="Balise HTML li – L’élément de liste" class="read-more" href="https://www.pierre-giraud.com/balise-html-li-element/" aria-label="En savoir plus sur Balise HTML li – L’élément de liste">Lire plus</a></p>
<p>L’article <a href="https://www.pierre-giraud.com/balise-html-li-element/">Balise HTML li – L’élément de liste</a> est apparu en premier sur <a href="https://www.pierre-giraud.com">Pierre Giraud</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="grille2lp">
<article class="ctn2lp">
<h2>Définition</h2>
<p>L’élément HTML <code>li</code> représente un élément de liste d’une liste ordonnée ou non ordonnée (mais pas d’une liste de définitions). </p>
<p>On va donc placer les éléments <code>li</code> à l’intérieur d’un élément <code>ol</code> (liste ordonnée) ou <code>ul</code> (liste non ordonnée) et utiliser autant d’éléments <code>li</code> que notre liste contient d’éléments de liste.</p>
<p>Un marqueur (ou « puce ») va être affiché devant la partie textuelle de chaque élément de liste <code>li</code>. L’apparence de ce marqueur est définie par le type de liste créée : ce sera par défaut un nombre qui va s’incrémenter pour une liste ordonnée ou un disque (puce) pour des listes non ordonnée. </p>
<p>On va ensuite pouvoir modifier la position ou l’apparence du marqueur grâce aux propriétés CSS <code>list-style-type</code> ou <code>list-style-image</code> et <code>list-style-position</code>.</p>
<p>&nbsp;</p>
<h2>Attributs</h2>
<p>Dans le cas où l’élément de liste <code>li</code> appartient à une liste ordonnée, on va pouvoir utiliser un attribut <code>value</code> pour indiquer la valeur affichée par le marqueur. </p>
<p>On va ainsi pouvoir faire démarrer le compteur d’une liste ordonnée à partir de n’importe quel entier et non pas nécessairement à partir de 1. </p>
<p>Notez que les éléments <code>li</code> suivants vont automatiquement s’incrémenter, pas la peine donc de préciser d’attribut <code>value</code> pour chaque élément <code>li</code> si on souhaite que les valeurs des marqueurs des éléments de liste se suivent. </p>
<p>&nbsp;</p>
<h2>Exemples d’utilisation</h2>
<p>Dans l&rsquo;exemple suivant, on utilise des éléments <code>li</code> pour ajouter des éléments dans des listes non ordonnées ou ordonnées HTML.</p>
<p class="codepen" data-height="556" data-theme-id="default" data-default-tab="html,result" data-user="pierregiraud" data-slug-hash="KKwgWVe" style="height: 556px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Balise HTML li">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/KKwgWVe"><br />
  Balise HTML li</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>&nbsp;</p>
<h2>Compatibilité navigateurs</h2>
<p>Ces informations sont tirées du site <a href="https://caniuse.com/#search=html%20element%3A%20li" target="_blank" rel="noopener noreferrer">caniuse.com</a>. Les cases vertes indiquent que le navigateur supporte l’élément. Les cases grises indiquent que le support est inconnu. Les cases rouges indiquent que l’élément n’est pas supporté. Le chiffre dans chaque case correspond à la version du navigateur concernée.</p>
<p><img loading="lazy" decoding="async" src="https://www.pierre-giraud.com/wp-content/uploads/2019/12/li-html-support-navigateur.png" alt="Element HTML li support navigateur" width="1123" height="150" class="alignnone size-full wp-image-13252" srcset="https://www.pierre-giraud.com/wp-content/uploads/2019/12/li-html-support-navigateur.png 1123w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/li-html-support-navigateur-300x40.png 300w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/li-html-support-navigateur-400x53.png 400w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/li-html-support-navigateur-1024x137.png 1024w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/li-html-support-navigateur-768x103.png 768w" sizes="auto, (max-width: 1123px) 100vw, 1123px" /></p>
<p>&nbsp;</p>
<h2>Extraits de la documentation officielle</h2>
<p>Ces informations sont extraites de la <a href="https://www.w3.org/TR/html53/grouping-content.html#the-li-element" target="_blank" rel="noopener noreferrer">spécification officielle (W3C)</a></p>
<p><img loading="lazy" decoding="async" src="https://www.pierre-giraud.com/wp-content/uploads/2019/12/li-html-reference-w3c.png" alt="Element HTML li reference documentation officielle" width="700" height="693" class="alignnone size-full wp-image-13253" srcset="https://www.pierre-giraud.com/wp-content/uploads/2019/12/li-html-reference-w3c.png 700w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/li-html-reference-w3c-300x297.png 300w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/li-html-reference-w3c-100x100.png 100w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/li-html-reference-w3c-400x396.png 400w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/li-html-reference-w3c-150x150.png 150w" sizes="auto, (max-width: 700px) 100vw, 700px" /><br />
</article>
<nav>
<h2>Eléments HTML</h2>
<ul style="list-style-type: none; margin: 0px;">
<li><a href="https://www.pierre-giraud.com/balise-html-div-element/">div</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-p-element/">p</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-ul-element/">ul</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-ol-element/">ol</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-li-element/">li</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-dl-element/">dl</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-pre-element/">pre</a></li>
<li><a href=""></a></li>
<li><a href=""></a></li>
<li><a href=""></a></li>
</ul>
</nav></div>
<p>L’article <a href="https://www.pierre-giraud.com/balise-html-li-element/">Balise HTML li – L’élément de liste</a> est apparu en premier sur <a href="https://www.pierre-giraud.com">Pierre Giraud</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.pierre-giraud.com/balise-html-li-element/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Balise HTML dl – L’élément de liste de définitions</title>
		<link>https://www.pierre-giraud.com/balise-html-dl-element/</link>
					<comments>https://www.pierre-giraud.com/balise-html-dl-element/#respond</comments>
		
		<dc:creator><![CDATA[Pierre GIRAUD]]></dc:creator>
		<pubDate>Wed, 11 Dec 2019 07:00:47 +0000</pubDate>
				<category><![CDATA[HTML / CSS]]></category>
		<guid isPermaLink="false">https://www.pierre-giraud.com/?p=13243</guid>

					<description><![CDATA[<p>Définition L’élément dl représente une liste de définitions, qu’on appelle également « liste de descriptions ». Ce type de liste est particulier en HTML et doit toujours être composé de paires « terme à définir + définition ». L’élément dl est utilisé pour représenter la liste en soi. On utilisera ensuite à l’intérieur des balises ... <a title="Balise HTML dl – L’élément de liste de définitions" class="read-more" href="https://www.pierre-giraud.com/balise-html-dl-element/" aria-label="En savoir plus sur Balise HTML dl – L’élément de liste de définitions">Lire plus</a></p>
<p>L’article <a href="https://www.pierre-giraud.com/balise-html-dl-element/">Balise HTML dl – L’élément de liste de définitions</a> est apparu en premier sur <a href="https://www.pierre-giraud.com">Pierre Giraud</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="grille2lp">
<article class="ctn2lp">
<h2>Définition</h2>
<p>L’élément <code>dl</code> représente une liste de définitions, qu’on appelle également « liste de descriptions ». </p>
<p>Ce type de liste est particulier en HTML et doit toujours être composé de paires « terme à définir + définition ». </p>
<p>L’élément <code>dl</code> est utilisé pour représenter la liste en soi. On utilisera ensuite à l’intérieur des balises <code>dl</code> des éléments <code>dt</code> pour entourer les termes à définir et des éléments <code>dd</code> pour fournir les définitions relatives à chaque terme. </p>
<p>&nbsp;</p>
<h2>Attributs</h2>
<p>L’élément <code>dl</code> ne possède pas d’attribut particulier. Il supporte les attributs universels comme l’ensemble des éléments HTML.</p>
<p>Pour rappel, les attributs universels sont des attributs qui peuvent être ajoutés à tous les éléments HTML. Quelques exemples d’attributs universels communs : <code>class</code>, <code>id</code>, <code>lang</code>, <code>style</code>, <code>title</code>…</p>
<p>&nbsp;</p>
<h2>Exemples d’utilisation</h2>
<p>Dans l&rsquo;exemple suivant, on définit une liste de définitions avec l&rsquo;élément <code>dl</code> qui va contenir deux termes à définir et deux définitions. Les termes à définir sont entourés par des balises <code>dt</code> (« definition term ») tandis que les définitions de ces termes sont inclues dans des balises <code>dd</code> (« definition description »). </p>
<p class="codepen" data-height="526" data-theme-id="default" data-default-tab="html,result" data-user="pierregiraud" data-slug-hash="zYxKZGX" style="height: 526px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Balise HTML dl">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/zYxKZGX"><br />
  Balise HTML dl</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>&nbsp;</p>
<h2>Compatibilité navigateurs</h2>
<p>Ces informations sont tirées du site <a href="https://caniuse.com/#search=html%20element%3A%20dl" target="_blank" rel="noopener noreferrer">caniuse.com</a>. Les cases vertes indiquent que le navigateur supporte l’élément. Les cases grises indiquent que le support est inconnu. Les cases rouges indiquent que l’élément n’est pas supporté. Le chiffre dans chaque case correspond à la version du navigateur concernée.</p>
<p><img loading="lazy" decoding="async" src="https://www.pierre-giraud.com/wp-content/uploads/2019/12/dl-html-support-navigateur.png" alt="Element HTML dl support navigateur" width="1123" height="150" class="alignnone size-full wp-image-13249" srcset="https://www.pierre-giraud.com/wp-content/uploads/2019/12/dl-html-support-navigateur.png 1123w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/dl-html-support-navigateur-300x40.png 300w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/dl-html-support-navigateur-400x53.png 400w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/dl-html-support-navigateur-1024x137.png 1024w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/dl-html-support-navigateur-768x103.png 768w" sizes="auto, (max-width: 1123px) 100vw, 1123px" /></p>
<p>&nbsp;</p>
<h2>Extraits de la documentation officielle</h2>
<p>Ces informations sont extraites de la <a href="https://www.w3.org/TR/html53/grouping-content.html#the-dl-element" target="_blank" rel="noopener noreferrer">spécification officielle (W3C)</a></p>
<p><img loading="lazy" decoding="async" src="https://www.pierre-giraud.com/wp-content/uploads/2019/12/dl-html-reference-w3c.png" alt="Element HTML dl reference documentation officielle" width="700" height="770" class="alignnone size-full wp-image-13250" srcset="https://www.pierre-giraud.com/wp-content/uploads/2019/12/dl-html-reference-w3c.png 700w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/dl-html-reference-w3c-300x330.png 300w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/dl-html-reference-w3c-400x440.png 400w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/dl-html-reference-w3c-273x300.png 273w" sizes="auto, (max-width: 700px) 100vw, 700px" /><br />
</article>
<nav>
<h2>Eléments HTML</h2>
<ul style="list-style-type: none; margin: 0px;">
<li><a href="https://www.pierre-giraud.com/balise-html-div-element/">div</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-p-element/">p</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-ul-element/">ul</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-ol-element/">ol</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-li-element/">li</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-dl-element/">dl</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-pre-element/">pre</a></li>
<li><a href=""></a></li>
<li><a href=""></a></li>
<li><a href=""></a></li>
</ul>
</nav></div>
<p>L’article <a href="https://www.pierre-giraud.com/balise-html-dl-element/">Balise HTML dl – L’élément de liste de définitions</a> est apparu en premier sur <a href="https://www.pierre-giraud.com">Pierre Giraud</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.pierre-giraud.com/balise-html-dl-element/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Balise HTML div – Elément conteneur générique de niveau bloc</title>
		<link>https://www.pierre-giraud.com/balise-html-div-element/</link>
					<comments>https://www.pierre-giraud.com/balise-html-div-element/#respond</comments>
		
		<dc:creator><![CDATA[Pierre GIRAUD]]></dc:creator>
		<pubDate>Tue, 10 Dec 2019 07:00:30 +0000</pubDate>
				<category><![CDATA[HTML / CSS]]></category>
		<guid isPermaLink="false">https://www.pierre-giraud.com/?p=13125</guid>

					<description><![CDATA[<p>Définition de la balise HTML div L’élément div est un conteneur générique. Cela signifie qu’il ne possède aucune sémantique mais est utilisé uniquement pour organiser du contenu. Le fait que l’élément div ne possède aucun « sens » en fait un élément qui va à l’encontre du rôle du HTML dont le but est justement ... <a title="Balise HTML div – Elément conteneur générique de niveau bloc" class="read-more" href="https://www.pierre-giraud.com/balise-html-div-element/" aria-label="En savoir plus sur Balise HTML div – Elément conteneur générique de niveau bloc">Lire plus</a></p>
<p>L’article <a href="https://www.pierre-giraud.com/balise-html-div-element/">Balise HTML div – Elément conteneur générique de niveau bloc</a> est apparu en premier sur <a href="https://www.pierre-giraud.com">Pierre Giraud</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="grille2lp">
<article class="ctn2lp">
<h2>Définition de la balise HTML div</h2>
<p>L’élément <code>div</code> est un conteneur générique. Cela signifie qu’il ne possède aucune sémantique mais est utilisé uniquement pour organiser du contenu. </p>
<p>Le fait que l’élément <code>div</code> ne possède aucun « sens » en fait un élément qui va à l’encontre du rôle du HTML dont le but est justement de donner du sens aux contenus. </p>
<p>On limitera donc l’utilisation de l’élément <code>div</code> aux cas où il n’existe aucun autre élément sémantique qui peut s’y substituer (comme un élément <code>nav</code> pour un menu de navigation par exemple). </p>
<p>En pratique, on utilisera souvent l’élément <code>div</code> à des fins de mise en forme en CSS. En effet, on voudra souvent grouper des éléments qui ne possèdent pas forcément de lien logique / sémantique ensemble afin de leur appliquer la même mise en forme ou de les positionner les uns par rapport aux autres ou par rapport aux autres éléments de la page.</p>
<p>Ne pas confondre : l&rsquo;élément <code>span</code> est également un conteneur générique mais il existe des <a href="https://www.pierre-giraud.com/html-css-apprendre-coder-cours/div-span/" target="_blank" rel="noopener noreferrer">différences d&rsquo;utilisation entre les éléments <code>div</code> et <code>span</code></a>. Cela provient du fait que l&rsquo;élément <code>div</code> est un conteneur de niveau bloc tandis que l&rsquo;élément <code>span</code> est un conteneur en ligne (inline) et va donc plutôt être utilisé pour contenir des bouts de texte.</p>
<p>&nbsp;</p>
<h2>Attributs de l&rsquo;élément div</h2>
<p>L’élément <code>div</code> ne possède pas d’attribut particulier. Il supporte les attributs universels comme l’ensemble des éléments HTML.</p>
<p>Pour rappel, les attributs universels sont des attributs qui peuvent être ajoutés à tous les éléments HTML. Quelques exemples d’attributs universels communs : <code>class</code>, <code>id</code>, <code>lang</code>, <code>style</code>, <code>title</code>…</p>
<p>&nbsp;</p>
<h2>Exemples d’utilisation de div</h2>
<p>dans l&rsquo;exemple ci-dessous, on utilise l&rsquo;élément <code>div</code> pour styliser un ensemble d&rsquo;éléments qui servent de cadre d&rsquo;introduction pour une page.</p>
<p class="codepen" data-height="659" data-theme-id="default" data-default-tab="css,result" data-user="pierregiraud" data-slug-hash="WNbrWWb" style="height: 659px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Balise HTML div">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/WNbrWWb"><br />
  Balise HTML div</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>&nbsp;</p>
<h2>Compatibilité navigateurs</h2>
<p>Ces informations sont tirées du site <a href="https://caniuse.com/#search=html%20element%3A%20div" target="_blank" rel="noopener noreferrer">caniuse.com</a>. Les cases vertes indiquent que le navigateur supporte l’élément. Les cases grises indiquent que le support est inconnu. Les cases rouges indiquent que l’élément n’est pas supporté. Le chiffre dans chaque case correspond à la version du navigateur concernée.</p>
<p><img loading="lazy" decoding="async" src="https://www.pierre-giraud.com/wp-content/uploads/2019/12/div-html-support-navigateur.png" alt="Element HTML div support navigateur" width="1125" height="150" class="alignnone size-full wp-image-13136" srcset="https://www.pierre-giraud.com/wp-content/uploads/2019/12/div-html-support-navigateur.png 1125w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/div-html-support-navigateur-300x40.png 300w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/div-html-support-navigateur-400x53.png 400w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/div-html-support-navigateur-1024x137.png 1024w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/div-html-support-navigateur-768x102.png 768w" sizes="auto, (max-width: 1125px) 100vw, 1125px" /></p>
<p>&nbsp;</p>
<h2>Extraits de la documentation officielle</h2>
<p>Ces informations sont extraites de la <a href="https://www.w3.org/TR/html53/grouping-content.html#the-div-element" target="_blank" rel="noopener noreferrer">spécification officielle (W3C)</a></p>
<p><img loading="lazy" decoding="async" src="https://www.pierre-giraud.com/wp-content/uploads/2019/12/div-html-reference-w3c.png" alt="Element HTML div reference documentation officielle" width="700" height="575" class="alignnone size-full wp-image-13135" srcset="https://www.pierre-giraud.com/wp-content/uploads/2019/12/div-html-reference-w3c.png 700w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/div-html-reference-w3c-300x246.png 300w, https://www.pierre-giraud.com/wp-content/uploads/2019/12/div-html-reference-w3c-400x329.png 400w" sizes="auto, (max-width: 700px) 100vw, 700px" /><br />
</article>
<nav>
<h2>Eléments HTML</h2>
<ul style="list-style-type: none; margin: 0px;">
<li><a href="https://www.pierre-giraud.com/balise-html-div-element/">div</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-p-element/">p</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-ul-element/">ul</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-ol-element/">ol</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-li-element/">li</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-dl-element/">dl</a></li>
<li><a href="https://www.pierre-giraud.com/balise-html-pre-element/">pre</a></li>
<li><a href=""></a></li>
<li><a href=""></a></li>
<li><a href=""></a></li>
</ul>
</nav></div>
<p>L’article <a href="https://www.pierre-giraud.com/balise-html-div-element/">Balise HTML div – Elément conteneur générique de niveau bloc</a> est apparu en premier sur <a href="https://www.pierre-giraud.com">Pierre Giraud</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.pierre-giraud.com/balise-html-div-element/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Définir des grilles CSS : Le guide complet – CSS Grid Layout</title>
		<link>https://www.pierre-giraud.com/grille-css-guide-complet-grid-layout/</link>
					<comments>https://www.pierre-giraud.com/grille-css-guide-complet-grid-layout/#respond</comments>
		
		<dc:creator><![CDATA[Pierre GIRAUD]]></dc:creator>
		<pubDate>Mon, 09 Dec 2019 07:00:31 +0000</pubDate>
				<category><![CDATA[HTML / CSS]]></category>
		<guid isPermaLink="false">https://www.pierre-giraud.com/?p=13099</guid>

					<description><![CDATA[<p>Le modèle des grilles est le modèle de disposition CSS le plus puissant qu’on puisse manipuler à ce jour. C’est un modèle totalement bidimensionnel, ce qui signifie qu’on va avoir accès à des propriétés similaires pour disposer nos éléments selon l’axe horizontal ou l’axe vertical (à la différence du modèle des boites flexibles dans lequel ... <a title="Définir des grilles CSS : Le guide complet – CSS Grid Layout" class="read-more" href="https://www.pierre-giraud.com/grille-css-guide-complet-grid-layout/" aria-label="En savoir plus sur Définir des grilles CSS : Le guide complet – CSS Grid Layout">Lire plus</a></p>
<p>L’article <a href="https://www.pierre-giraud.com/grille-css-guide-complet-grid-layout/">Définir des grilles CSS : Le guide complet – CSS Grid Layout</a> est apparu en premier sur <a href="https://www.pierre-giraud.com">Pierre Giraud</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="grille2pr">
<article class="ctn2pr">
Le modèle des grilles est le modèle de disposition CSS le plus puissant qu’on puisse manipuler à ce jour. </p>
<p>C’est un modèle totalement bidimensionnel, ce qui signifie qu’on va avoir accès à des propriétés similaires pour disposer nos éléments selon l’axe horizontal ou l’axe vertical (à la différence du modèle des boites flexibles dans lequel on doit définir un axe principal et un axe secondaire de disposition).</p>
<p>Le modèle des grilles va donc s’avérer très précieux pour aligner les contenus selon les deux dimensions horizontale et verticale.</p>
<p>Pour définir un modèle de disposition en ligne, on va déjà devoir définir un conteneur de grille puis allons ensuite pouvoir appliquer différentes propriétés au conteneur ou aux éléments de grille. </p>
<p>Notes préalables utiles pour la lecture de ce guide : </p>
<ul>
<li>L’axe de bloc est l’axe selon lequel sont disposés les éléments de type bloc, c’est-à-dire l’axe vertical si <code>writing-mode</code> possède la valeur <code>horizontal-tb</code> (valeur par défaut) car les blocs se placent les uns en dessous des autres, dans la hauteur de la page ;</li>
<li>L’axe en ligne est l’axe selon lequel s’écoule le contenu inline c’est-à-dire l’axe horizontal si <code>writing-mode</code> possède la valeur <code>horizontal-tb</code> (valeur par défaut) ;</li>
<li>La définition des axes de bloc et en ligne, de leur « début » et de leur « fin » peuvent être modifiés grâce à certaines propriétés CSS et notamment la propriété <code>direction</code> : si on choisit une direction horizontale et un sens d’écriture de droite à gauche par exemple, le « début » de l’axe en ligne sera à droite et non pas à gauche, etc.</li>
<li>Les propriétés et valeurs <code>display : inline-block</code>, <code>display : table-cell</code>, <code>float</code>, <code>vertical-align</code> et <code>column-*</code> n’ont aucun effet sur les éléments de grille.</li>
</ul>
<p>&nbsp;</p>
<h2>Définir un conteneur de grille</h2>
<p>La première chose à faire va être de définir un conteneur de grille. On va pour cela appliquer un <code>display : grid</code> ou <code>display : inline-grid</code> à un élément de niveau bloc. </p>
<p>Cela va automatiquement créer un nouveau contexte de formatage pour les éléments contenus dans notre conteneur de grilles. Cela signifie que les éléments enfants vont devenir des éléments de grille et qu’on va pouvoir leur appliquer les propriétés liées aux éléments de grille. </p>
<p>Notez que <code>display : grid</code> va créer une grille de niveau bloc tandis que <code>display : inline-grid</code> va créer une grille de niveau inline. </p>
<p>Un conteneur avec <code>display : grid</code> occupera donc tout l’espace disponible dans son parent et se placera sur sa propre ligne tandis qu’un conteneur avec <code>display : inline-grid</code> n’occupera que l’espace nécessaire à son contenu dans son parent et pourra se placer à côté d’autres éléments. </p>
<p>Regardez plutôt le code suivant pour bien identifier la différence (code HTML puis code CSS puis résultat) : </p>
<p class="codepen" data-height="652" data-theme-id="default" data-default-tab="html" data-user="pierregiraud" data-slug-hash="wvBKpBO" data-preview="true" style="height: 652px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Grid Layout #1 : Grid Container">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/wvBKpBO"><br />
  CSS Grid Layout #1 : Grid Container</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="418" data-theme-id="default" data-default-tab="css" data-user="pierregiraud" data-slug-hash="wvBKpBO" data-preview="true" style="height: 418px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Grid Layout #1 : Grid Container">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/wvBKpBO"><br />
  CSS Grid Layout #1 : Grid Container</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="589" data-theme-id="default" data-default-tab="result" data-user="pierregiraud" data-slug-hash="wvBKpBO" data-preview="true" style="height: 589px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Grid Layout #1 : Grid Container">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/wvBKpBO"><br />
  CSS Grid Layout #1 : Grid Container</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>Ici, on utilise 4 éléments <code>div class="container"</code> et <code>div class="inline-container"</code> qu’on définit comme conteneurs de grille. Les éléments à l’intérieur de ces conteneurs (les <code>div class="item"</code>) deviennent de facto des éléments de grille. </p>
<p>On voit bien que les deux premiers conteneurs de grilles, qui sont de type bloc, occupent toute la largeur dans leur élément conteneur (le <code>body</code> de la page) tandis que les deux derniers qui sont de niveau inline n’occupent que la place nécessaire à leur contenu et se placent côte-à-côte et non pas sur une nouvelle ligne. </p>
<p>&nbsp;</p>
<h2>Le vocabulaire des grilles : colonnes, rangées, lignes, pistes et zones de grille</h2>
<p>Avant d’aller plus loin, il me semble important de définir certains éléments de langage liés aux grilles afin de démarrer avec des bases solides et stables. </p>
<p><strong>Une grille est composée de colonnes et de rangées</strong>.  On va pouvoir disposer les éléments de grille selon ces colonnes et rangées. </p>
<p><strong>Les colonnes et les rangées des grilles sont séparées par des lignes imaginaires</strong> qui servent à définir les « cellules » de la grille. </p>
<p>Une grille possédant 3 colonnes et 2 rangées va donc posséder 4 lignes verticales et 3 lignes horizontales, une grille possédant 4 colonnes et 4 rangées va posséder 5 lignes verticales et 5 lignes horizontales et etc.</p>
<p>Ci-dessous, vous pouvez retrouver une représentation visuelle des lignes d’une grille. Ma grille contient ici 3 colonnes et 2 rangées. Les lignes verticales ont été dessinées en bleu et les lignes horizontales ont été dessinées en rouge.</p>
<p><img loading="lazy" decoding="async" src="https://www.pierre-giraud.com/wp-content/uploads/2019/05/definition-ligne-grille-illustration.png" alt="Définition d&#039;une ligne de grille CSS et illustration avec display grid" width="700" height="320" class="alignnone size-full wp-image-7898" srcset="https://www.pierre-giraud.com/wp-content/uploads/2019/05/definition-ligne-grille-illustration.png 700w, https://www.pierre-giraud.com/wp-content/uploads/2019/05/definition-ligne-grille-illustration-300x137.png 300w, https://www.pierre-giraud.com/wp-content/uploads/2019/05/definition-ligne-grille-illustration-400x183.png 400w" sizes="auto, (max-width: 700px) 100vw, 700px" /></p>
<p>L’espace entre deux lignes adjacentes est ce qu’on appelle une <strong>piste de grille</strong>. Le terme piste sert donc tout simplement à désigner indifféremment une colonne ou une rangée dans une grille.</p>
<p><img loading="lazy" decoding="async" src="https://www.pierre-giraud.com/wp-content/uploads/2019/05/definition-piste-grille-illustration.png" alt="Définition d&#039;une piste de grille CSS et illustration avec display grid" width="700" height="530" class="alignnone size-full wp-image-7899" srcset="https://www.pierre-giraud.com/wp-content/uploads/2019/05/definition-piste-grille-illustration.png 700w, https://www.pierre-giraud.com/wp-content/uploads/2019/05/definition-piste-grille-illustration-300x227.png 300w, https://www.pierre-giraud.com/wp-content/uploads/2019/05/definition-piste-grille-illustration-400x303.png 400w" sizes="auto, (max-width: 700px) 100vw, 700px" /></p>
<p>Ci-dessus, j’ai créé deux grilles composées de 3 colonnes et de 2 rangées. En jaune, j’ai colorié une piste pour chacune des deux grilles.</p>
<p>Finalement, une <strong>zone de grille</strong> correspond à l’espace délimité par deux lignes de colonnes et deux lignes de rangées qui ne sont pas nécessairement adjacentes. Ci-dessous, j’ai dessiné une zone dans chacune de mes deux grilles (la première couvre 2 cellules et la deuxième couvre 4 cellules).</p>
<p><img loading="lazy" decoding="async" src="https://www.pierre-giraud.com/wp-content/uploads/2019/05/definition-zone-grille-illustration.png" alt="Définition d&#039;une zone de grille CSS et illustration avec display grid" width="700" height="530" class="alignnone size-full wp-image-7901" srcset="https://www.pierre-giraud.com/wp-content/uploads/2019/05/definition-zone-grille-illustration.png 700w, https://www.pierre-giraud.com/wp-content/uploads/2019/05/definition-zone-grille-illustration-300x227.png 300w, https://www.pierre-giraud.com/wp-content/uploads/2019/05/definition-zone-grille-illustration-400x303.png 400w" sizes="auto, (max-width: 700px) 100vw, 700px" /></p>
<p>&nbsp;</p>
<h2>Définir explicitement des colonnes et des rangées dans une grille CSS : grid-template-columns et grid-template-rows</h2>
<p>Une grille est formée de colonnes et de rangées. On peut définir le nombre et la taille de chacune de ces colonnes et rangées grâce aux propriétés <code>grid-template-columns</code> et <code>grid-template-rows</code> qu’on appliquera au conteneur de grille. </p>
<p>On va pouvoir passer des valeurs de type longueur (en <code>px</code> par exemple), pourcentage <code>%</code>, fraction <code>fr</code> ou la valeur <code>auto</code> aux propriétés <code>grid-template-columns</code> et <code>grid-template-rows</code>. </p>
<p>Cela va nous permettre de créer des colonnes et des rangées de tailles fixes ou variables. Notez que l’unité <code>fr</code> permet à une colonne ou à une rangée de calculer sa taille en fonction des autres. </p>
<p>Regardez plutôt l’exemple ci-dessous (code HTML puis CSS puis résultat) : </p>
<p class="codepen" data-height="554" data-theme-id="default" data-default-tab="html" data-user="pierregiraud" data-slug-hash="XWJmVRR" data-preview="true" style="height: 554px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Grid Layout #2 : grid-template-columns &amp;amp; grid-template-rows">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/XWJmVRR"><br />
  CSS Grid Layout #2 : grid-template-columns &amp; grid-template-rows</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="497" data-theme-id="default" data-default-tab="css" data-user="pierregiraud" data-slug-hash="XWJmVRR" data-preview="true" style="height: 497px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Grid Layout #2 : grid-template-columns &amp;amp; grid-template-rows">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/XWJmVRR"><br />
  CSS Grid Layout #2 : grid-template-columns &amp; grid-template-rows</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="355" data-theme-id="default" data-default-tab="result" data-user="pierregiraud" data-slug-hash="XWJmVRR" data-preview="true" style="height: 355px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Grid Layout #2 : grid-template-columns &amp;amp; grid-template-rows">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/XWJmVRR"><br />
  CSS Grid Layout #2 : grid-template-columns &amp; grid-template-rows</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>On définit trois conteneurs de grille avec <code>display : grid</code>. Chaque conteneur contient trois éléments de grille. </p>
<p>Les colonnes et rangées de notre première grille sont définies par <code>grid-template-columns: 100px auto</code> et <code>grid-template-rows: 50px 50px</code>. </p>
<p>On va passer autant de valeurs à <code>grid-template-columns</code> ou <code>grid-template-rows</code> qu’on souhaite définir de colonnes et de rangées dans notre grille. </p>
<p>Les valeurs passées à <code>grid-template-columns</code> définissent la largeur des colonnes tandis que les valeurs passées à <code>grid-template-rows</code> définissent la hauteur des rangées.</p>
<p>Dans ce premier cas, notre grille possède deux colonnes d’une largeur de 100px et auto (ce qui dans ce cas fait que la deuxième colonne occupe toute la largeur restante) et deux rangées d’une hauteur de 50px chacune. </p>
<p>Notre deuxième grille possède 3 colonnes de largeurs 1fr, 2fr et 1fr et une seule rangées d’une hauteur auto. Cela signifie que l’espace va être partagé entre les colonnes de telle manière à ce que la première et troisième colonne occupent la même largeur et que la deuxième colonne occupe une largeur deux fois plus importante. Ici, cela est l’équivalent d’écrire 25% 50% 25%. </p>
<p>Notre troisième grille possède trois colonnes et deux rangées. Les colonnes sont définies avec <code>grid-template-columns : 1fr 50% 2fr</code>. Dans ce cas, la largeur de la deuxième colonne va être calculée en premier et les deux autres colonnes dont la largeur est exprimée en fraction de l’espace vont se partager le reste de l’espace (les 50% restants donc) avec la troisième colonne qui va récupérer deux fois plus d’espace que la première. </p>
<p>Dans ce cas, la deuxième colonne prend donc 50% de la largeur de la grille puis les 50% restants sont partagés entre les première et troisième colonnes. </p>
<p>Notez qu’on va également pouvoir utiliser la fonction CSS <code>repeat()</code> pour définir des colonnes et des rangées de grille. Cette fonction va s’avérer utile dans le cas où on souhaite créer une grille avec beaucoup de colonnes ou de rangées semblables puisqu’elle va nous permettre de répéter un certain schéma un certain nombre de fois. </p>
<p>Écrire <code>grid-template-columns : repeat(3, 1fr)</code> est équivalent à écrire <code>grid-template-columns : 1fr 1fr 1fr</code> par exemple.</p>
<p>Enfin, notez qu’on va également pouvoir passer des valeurs de type nom aux propriétés <code>grid-template-columns</code> et <code>grid-template-rows</code> qui vont nous permettre de nommer les lignes précédant la colonne ou la rangée en question. </p>
<p>Cela va pouvoir être utile pour pouvoir y faire référence plus facilement lorsqu’on voudra positionner nos éléments de grille dans la grille par la suite. </p>
<p>On va passer ces noms entre crochets comme ceci : </p>
<p class="codepen" data-height="394" data-theme-id="default" data-default-tab="css,result" data-user="pierregiraud" data-slug-hash="qBEOpKK" data-preview="true" style="height: 394px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Grid Layout #3 : Grid Lines name">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/qBEOpKK"><br />
  CSS Grid Layout #3 : Grid Lines name</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>&nbsp;</p>
<h2>Positionner les éléments de grille dans une grille CSS</h2>
<p>Le modèle des grilles est un modèle de positionnement bidimensionnel, ce qui signifie qu’on va pouvoir positionner puis aligner les éléments selon l’axe horizontal et selon l’axe vertical. </p>
<p>Par défaut, les éléments de grille n’occupent qu’une colonne et qu’une ligne et se placent dans l’ordre de leur écriture. </p>
<h3>Positionner les éléments à partir des colonnes et des rangées</h3>
<p>Pour positionner les éléments dans une grille, nous allons pouvoir utiliser les propriétés <code>grid-column-start</code>, <code>grid-column-end</code>, <code>grid-row-start</code> et <code>grid-row-end</code> ou leurs versions raccourcies <code>grid-column</code> et <code>grid-row</code>. </p>
<p>Ces propriétés vont nous permettre de spécifier les lignes de départ et de fin pour l’axe vertical (column) et l’axe horizontal (row) pour chaque élément de la grille. </p>
<p>Les versions raccourcies vont prendre deux valeurs : la valeur de la ligne de départ et celle de la ligne de fin pour l’axe concerné. Ces deux valeurs vont être séparées par un slash. </p>
<p>Définissons immédiatement une nouvelle grille composée de 5 colonnes et 3 rangées régulières et possédant 3 éléments et essayons de placer ces éléments dans la grille. </p>
<p>Code HTML : </p>
<p class="codepen" data-height="392" data-theme-id="default" data-default-tab="html" data-user="pierregiraud" data-slug-hash="GRgpBbG" data-preview="true" style="height: 392px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Grid Layout 4 : grid-column &amp;amp; grid-row">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/GRgpBbG"><br />
  CSS Grid Layout 4 : grid-column &amp; grid-row</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>Code CSS : </p>
<p class="codepen" data-height="626" data-theme-id="default" data-default-tab="css" data-user="pierregiraud" data-slug-hash="GRgpBbG" data-preview="true" style="height: 626px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Grid Layout 4 : grid-column &amp;amp; grid-row">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/GRgpBbG"><br />
  CSS Grid Layout 4 : grid-column &amp; grid-row</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>Résultat : </p>
<p class="codepen" data-height="302" data-theme-id="default" data-default-tab="result" data-user="pierregiraud" data-slug-hash="GRgpBbG" data-preview="true" style="height: 302px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Grid Layout 4 : grid-column &amp;amp; grid-row">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/GRgpBbG"><br />
  CSS Grid Layout 4 : grid-column &amp; grid-row</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>Notre premier élément est positionné en utilisant les 4 propriétés <code>grid-column-start</code>, <code>grid-column-end</code>, <code>grid-row-start</code> et <code>grid-row-end</code>. </p>
<p>On indique ici que le début de notre premier élément doit se placer contre la première ligne verticale (ligne des colonnes ; c’est-à-dire tout à gauche) et contre la première ligne horizontale (ligne des rangées ; c’est-à-dire tout en haut) et qu’il doit couvrir la surface jusqu’à la troisième ligne verticale (c’est-à-dire couvrir l’espace relatif aux deux première colonnes) et jusqu’à la quatrième ligne horizontale (c’est-à-dire tout l’espace en hauteur). </p>
<p>Pour notre deuxième élément, on ne précise que les propriétés <code>grid-column-start</code> et <code>grid-column-end</code> et on lui demande de commencer au niveau de la troisième ligne verticale et de couvrir l’espace jusqu’à la sixième ligne verticale. Sa « hauteur » (le nombre de rangées de la grille qu’il devra occuper) sera celle par défaut c’est-à-dire une rangée. </p>
<p>Notre troisième élément est positionné grâce aux propriétés raccourcies <code>grid-column</code> et <code>grid-row</code>. On indique deux valeurs à chaque fois pour ces deux propriétés séparées par un slash : la première valeur correspond à la ligne de départ et la deuxième à la ligne d’arrivée. </p>
<p>N’hésitez pas à faire une pause ici et à modifier les valeurs de votre côté afin de bien assimiler les mécanismes de positionnement ! </p>
<p>Note : on peut également passer des noms de lignes aux propriétés ci-dessus plutôt que des numéros dans le cas où on a nommé les lignes de notre grille. </p>
<h3>Positionner les éléments à partir d’une zone prédéfinie</h3>
<p>La deuxième manière de positionner des éléments dans une grille est de définir des zones de grille et d’attribuer les zones aux différents éléments de grille.</p>
<p>Pour faire cela, nous allons utiliser la propriété <code>grid-area</code> avec nos éléments de grille. Cette propriété va pouvoir être utilisée de deux façons différentes : </p>
<ul>
<li>En propriété ultra raccourcie des précédentes ; en lui passant 4 valeurs qui correspondent aux valeurs de <code>row-start</code>, <code>column-start</code>, <code>row-end</code> et <code>column-end</code>. Cela permet de définir immédiatement une zone de grille dans laquelle sera positionné l’élément ;</li>
<li>En lui passant un nom de zone qui va pouvoir être utilisé par la propriété <code>grid-template-areas</code>.</li>
</ul>
<p>La propriété <code>grid-template-areas</code> va utiliser les noms définis avec <code>grid-area</code> et indiquer la place dans la grille qui va être liée à chaque nom. Grosso-modo, cette propriété va nous permettre de construire visuellement une grille à partir des noms de zones définis avec <code>grid-area</code>.  </p>
<p>Les grilles vont être construites rangée par rangée. Chaque répétition d’un nom de <code>grid-area</code> indique que la zone doit englober une cellule de plus. Les zones non rectangulaires ne sont pour le moment pas autorisées. Un point indique une cellule vide (sans zone attribuée).</p>
<p>Regardez plutôt l’exemple ci-dessous. Cette propriété se comprend beaucoup mieux visuellement. </p>
<p>Code HTML : </p>
<p class="codepen" data-height="387" data-theme-id="default" data-default-tab="html" data-user="pierregiraud" data-slug-hash="MWYaqKa" data-preview="true" style="height: 387px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Grid Layout 5 :  grid-area &amp;amp; grid-template-areas">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/MWYaqKa"><br />
  CSS Grid Layout 5 :  grid-area &amp; grid-template-areas</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>Code CSS : </p>
<p class="codepen" data-height="429" data-theme-id="default" data-default-tab="css" data-user="pierregiraud" data-slug-hash="MWYaqKa" data-preview="true" style="height: 429px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Grid Layout 5 :  grid-area &amp;amp; grid-template-areas">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/MWYaqKa"><br />
  CSS Grid Layout 5 :  grid-area &amp; grid-template-areas</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>Résultat : </p>
<p class="codepen" data-height="286" data-theme-id="default" data-default-tab="result" data-user="pierregiraud" data-slug-hash="MWYaqKa" data-preview="true" style="height: 286px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Grid Layout 5 :  grid-area &amp;amp; grid-template-areas">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/MWYaqKa"><br />
  CSS Grid Layout 5 :  grid-area &amp; grid-template-areas</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>Ici, nous possédons une grille à 3 colonnes, 3 rangées, et possédant 3 éléments. On commence par définir une zone pour chaque élément avec <code>grid-area</code>. </p>
<p>Ensuite, on utilise <code>grid-template-areas</code> sur le conteneur afin d’indiquer quelles cellules de grille ces zones doivent couvrir. Chaque paire de guillemets droits indique une nouvelle ligne dans la grille. Chaque répétition de nom indique une nouvelle cellule que la zone doit couvrir. </p>
<p>Ici, par exemple, on commence par écrire <code>"zone1 zone1 zone1"</code>. Cela signifie que la zone « zone1 » devra couvrir la première, la deuxième et la troisième cellule de la première rangée. </p>
<p>Ensuite, on a <code>". . zone3"</code>. Cela signifie que les deux premières cellules de la deuxième rangée ne sont pas liées à des noms de zone tandis que la zone « zone3 » devra couvrir la troisième. </p>
<p>Enfin, on écrit <code> ". zone2 zone3"</code>. La première cellule de la troisième rangée n’est liée à aucune zone, la zone « zone2 » couvrira la deuxième tandis que la zone « zone3 » couvrira la troisième. </p>
<p>Notez qu’on peut également utiliser la propriété raccourcie <code>grid-template</code> qui permet de définir en une seule fois les valeurs des propriétés <code>grid-template-rows</code>, <code>grid-template-columns</code> et <code>grid-template-areas</code>.</p>
<p>&nbsp;</p>
<h2>Aligner les éléments de grille dans une grille CSS</h2>
<p>Une fois les éléments positionnées dans la grille, on va encore pouvoir les aligner dans la zone qui leur a été attribuée. </p>
<p>L’alignement des éléments va pouvoir se faire dans le sens vertical et dans le sens horizontal par rapport aux pistes de la grille ; c’est l’un des atouts principaux du modèle des grilles. </p>
<p>De plus, l’alignement des éléments va pouvoir se faire au niveau du conteneur (pour aligner tous les éléments selon un même modèle) ou au niveau des éléments, de manière individuelle. </p>
<h3>Aligner les éléments par rapport à l’axe de ligne : justify-items et justify-self</h3>
<p>Les propriétés <code>justify-items</code> et <code>justify-self</code> vont nous permettre d’ aligner les éléments le long de l’axe inline du document. </p>
<p>Pour les langages latins, l’axe de ligne est l’axe horizontal (l’axe des rangées). Le « début » de cet axe sera pour nous le coin gauche et la « fin » sera le coin droit. </p>
<p>Cela peut être différent pour d’autres langages et peut être changé en modifiant les valeurs de la propriété <code>writing-mode</code> notamment. </p>
<p>Ces propriétés supportent les valeurs suivantes : </p>
<ul>
<li><code>stretch</code> : L’élément ou les éléments vont s’étendre pour occuper toute leur zone. C’est la valeur par défaut ;</li>
<li><code>start</code> : L’élément ou les éléments seront alignés contre le « début » de leur zone ;</li>
<li><code>end</code> : L’élément ou les éléments seront alignés contre la fin de leur zone ;</li>
<li><code>center</code> : L’élément ou les éléments seront centrés dans leur zone.</li>
</ul>
<p class="codepen" data-height="494" data-theme-id="default" data-default-tab="html" data-user="pierregiraud" data-slug-hash="MWYaLNP" data-preview="true" style="height: 494px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Grid Layout 6 : justify-items &amp;amp; justify-self">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/MWYaLNP"><br />
  CSS Grid Layout 6 : justify-items &amp; justify-self</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="352" data-theme-id="default" data-default-tab="css" data-user="pierregiraud" data-slug-hash="MWYaLNP" data-preview="true" style="height: 352px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Grid Layout 6 : justify-items &amp;amp; justify-self">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/MWYaLNP"><br />
  CSS Grid Layout 6 : justify-items &amp; justify-self</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="334" data-theme-id="default" data-default-tab="result" data-user="pierregiraud" data-slug-hash="MWYaLNP" data-preview="true" style="height: 334px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Grid Layout 6 : justify-items &amp;amp; justify-self">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/MWYaLNP"><br />
  CSS Grid Layout 6 : justify-items &amp; justify-self</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>On définit ici deux grilles. On ne précise pas de <code>justify-items</code> ni de <code>justify-self</code> pour la première grille ; les valeurs par défaut (<code>stretch</code>) vont donc être utilisées. </p>
<p>On applique un <code>justify-items : start</code> à notre deuxième grille. Cela va faire en sorte que les éléments se placent au début de la zone qui leur est réservée (et n’occupent que la place nécessaire plutôt que de « stretch » c’est-à-dire s’étendre par défaut). </p>
<p>On définit également un <code>justify-self : end</code> pour le dernier élément de notre deuxième grille. Comme la propriété <code>justify-self</code> cible plus précisément que <code>justify-items</code>, elle sera traitée prioritairement et c’est la raison pour laquelle le dernier élément de la grille est aligné contre la fin de sa zone selon l’axe horizontal (c’est-à-dire à droite). </p>
<h3>Aligner les éléments par rapport à l’axe de bloc : align-items et align-self</h3>
<p>On va de la même façon pouvoir aligner les éléments de grille selon l’axe de bloc ou axe des colonnes qui sera pour nous l’axe vertical grâce aux propriétés <code>align-items</code> et <code>align-self</code>. </p>
<p>Ces propriétés vont s’utiliser exactement comme les précédentes et on va pouvoir leur passer les mêmes valeurs <code>start</code>, <code>end</code>, <code>center</code> et <code>stretch</code> (valeur par défaut). Le « début » de l’axe sera pour nous le bord supérieur tandis que la fin sera le bord inférieur. </p>
<p class="codepen" data-height="487" data-theme-id="default" data-default-tab="html" data-user="pierregiraud" data-slug-hash="QWwjoNx" data-preview="true" style="height: 487px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Grid Layout 7 : align-items &amp;amp; align-self">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/QWwjoNx"><br />
  CSS Grid Layout 7 : align-items &amp; align-self</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="351" data-theme-id="default" data-default-tab="css" data-user="pierregiraud" data-slug-hash="QWwjoNx" data-preview="true" style="height: 351px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Grid Layout 7 : align-items &amp;amp; align-self">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/QWwjoNx"><br />
  CSS Grid Layout 7 : align-items &amp; align-self</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="342" data-theme-id="default" data-default-tab="result" data-user="pierregiraud" data-slug-hash="QWwjoNx" data-preview="true" style="height: 342px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Grid Layout 7 : align-items &amp;amp; align-self">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/QWwjoNx"><br />
  CSS Grid Layout 7 : align-items &amp; align-self</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>Notez bien ici que les éléments sont toujours alignés au sein de la zone qui leur est réservée. Ainsi, si nos éléments n’occupent qu’une seule rangée de la grille par exemple, ils seront alignés dans l’espace de cette rangée et de même pour les colonnes. </p>
<p>Dans notre exemple, nous ne donnons aucune consigne de positionnement à nos éléments (positionnement qui dépend des propriétés <code>grid-column</code> et <code>grid-row</code>, etc.). Chaque élément occupe donc une cellule de grille par défaut (un espace d’une colonne * une rangée). </p>
<p>C’est la raison pour laquelle le troisième élément de notre deuxième grille qui possède un <code>align-self : end</code> n’est pas collé contre le bord inférieur de la grille mais simplement contre le bord inférieur de la rangée à laquelle il appartient. </p>
<h3>Aligner les éléments de grille par rapport aux axes de bloc et en ligne : place-items et place-self</h3>
<p>Le modèle des grilles nous fournit également des propriétés raccourcies qui nous permettent d’aligner un ou les éléments de grille par rapport aux deux axes d’un coup. </p>
<p>Ces propriétés sont les propriétés CSS <code>place-items</code> et <code>place-self</code>.On va pouvoir leur passer une première valeur qui va définir le comportement de <code>align-{items | self}</code> et une deuxième qui définira le comportement de <code>justify-{items | self}</code>. On peut également ne préciser qu’une valeur qui sera alors utilisée pour l’alignement sur les deux axes. </p>
<p class="codepen" data-height="500" data-theme-id="default" data-default-tab="html" data-user="pierregiraud" data-slug-hash="qBEOvaO" data-preview="true" style="height: 500px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Grid Layout 8 : place-items &amp;amp; place-self">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/qBEOvaO"><br />
  CSS Grid Layout 8 : place-items &amp; place-self</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="356" data-theme-id="default" data-default-tab="css" data-user="pierregiraud" data-slug-hash="qBEOvaO" data-preview="true" style="height: 356px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Grid Layout 8 : place-items &amp;amp; place-self">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/qBEOvaO"><br />
  CSS Grid Layout 8 : place-items &amp; place-self</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="236" data-theme-id="default" data-default-tab="result" data-user="pierregiraud" data-slug-hash="qBEOvaO" data-preview="true" style="height: 236px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Grid Layout 8 : place-items &amp;amp; place-self">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/qBEOvaO"><br />
  CSS Grid Layout 8 : place-items &amp; place-self</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>On utilise ici <code>place-items</code> pour réaliser très simplement un centrage parfait des éléments de grille par rapport à leur zone. Notez qu’on utilise cette fois-ci une grille qui possède 3 colonnes et une seule rangée. </p>
<p>Le troisième élément possède un <code>place-self : start end</code>. Il sera aligné au début de sa zone selon l’axe vertical (= en haut) et à la fin selon l’axe horizontal (= à droite).</p>
<h3>Aligner le contenu de la grille par rapport au conteneur de grille : justify-content &#038; align-content</h3>
<p>Il arrive parfois que l’ensemble des éléments qui constituent une grille ait une taille inférieure à celle du conteneur de grille. </p>
<p>Cela peut se produire notamment dans le cas où on aurait défini des valeurs de taille fixes pour les pistes de grille. </p>
<p>Imaginez par exemple que l’on crée une grille avec <code>display : grid</code> de trois colonnes et une rangée en indiquant que chaque colonne doit faire 150px de large et chaque rangée 100px de haut. </p>
<p>Dans ce cas, notre grille aura une taille de 450px * 100px. Cependant, le conteneur de grille va lui occuper tout l’espace disponible dans son élément parent et va donc pouvoir être plus grand que ce qu’il contient. De même, l’unique rangée de la grille va faire 100px de hauteur mais le conteneur peut avoir une hauteur plus grande. </p>
<p>Dans ces cas-là, on va pouvoir aligner l’ensemble de la grille dans le conteneur de grille avec les propriétés <code>justify-content</code> et <code>align-content</code>. </p>
<p>La propriété <code>justify-content</code> permet un alignement selon l’axe de ligne ou axe des rangées qui est pour nous l’axe horizontal tandis que <code>align-content</code> permet un alignement selon l’axe de bloc ou axe des colonnes qui correspond pour nous à l’axe vertical. </p>
<p>Ces deux propriétés supportent les mêmes valeurs qui sont les suivantes : </p>
<ul>
<li><code>start</code> : la grille sera alignée contre le début de son conteneur selon l’axe correspondant ;</li>
<li><code>end</code> : la grille sera alignée contre la fin de son conteneur selon l’axe correspondant ;</li>
<li><code>center</code> : la grille sera centrée dans son conteneur selon l’axe correspondant ;</li>
<li><code>stretch</code> : redimensionne les pistes de grille afin qu’elles occupent tout l’espace dans le conteneur dans l’axe correspondant ;</li>
<li><code>space-around</code> : répartit équitablement l’espace disponible entre les différentes pistes dans l’axe correspondant. L’espace entre les bords du conteneur et la première et la dernière piste sera deux fois moins important qu’entre deux pistes ;</li>
<li><code>space-between</code> : répartit équitablement l’espace disponible entre les différentes pistes dans l’axe correspondant mais ne laisse pas d’espace entre les bords du conteneur et la première / dernière piste ;</li>
<li><code>space-evenly</code> : répartit équitablement l’espace disponible entre les différentes pistes dans l’axe correspondant ;</li>
</ul>
<p class="codepen" data-height="622" data-theme-id="default" data-default-tab="html" data-user="pierregiraud" data-slug-hash="vYENPyg" data-preview="true" style="height: 622px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Grid Layout #9 : justify-content &amp;amp;align-content">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/vYENPyg"><br />
  CSS Grid Layout #9 : justify-content &amp;align-content</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="519" data-theme-id="default" data-default-tab="css" data-user="pierregiraud" data-slug-hash="vYENPyg" data-preview="true" style="height: 519px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Grid Layout #9 : justify-content &amp;amp;align-content">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/vYENPyg"><br />
  CSS Grid Layout #9 : justify-content &amp;align-content</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="450" data-theme-id="default" data-default-tab="result" data-user="pierregiraud" data-slug-hash="vYENPyg" data-preview="true" style="height: 450px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Grid Layout #9 : justify-content &amp;amp;align-content">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/vYENPyg"><br />
  CSS Grid Layout #9 : justify-content &amp;align-content</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>Ici, on crée 3 grilles de 3 colonnes, 2 rangées et on définit des tailles fixes pour nos colonnes (150px de large) et nos rangées (25px de haut). Pour cet exemple, on définit également des tailles fixes minimales de 500px * 100px pour le conteneur.</p>
<p>Notre première grille est notre grille témoin. On ne lui applique aucune propriété. </p>
<p>On applique un <code>justify-content : center</code> et <code>align-content : end</code> à notre deuxième grille. Cela signifie que la grille va venir se centrer dans son conteneur selon l’axe de ligne (l’axe horizontal) et va venir se coller à la fin du conteneur selon l’axe de bloc (l’axe vertical). Elle sera donc au milieu en largeur, et en bas dans la hauteur. </p>
<p>On applique un <code>justify-content : space-between</code> et <code>align-content : space-evenly</code> à notre troisième grille. </p>
<p>La valeur <code>justify-content : space-between</code> va répartir équitablement l’espace restant selon l’axe de ligne (horizontal) entre les colonnes en ne laissant aucun espace entre la première / dernière colonne et le bord du conteneur. </p>
<p>La valeur <code>align-content : space-evenly</code> va répartir équitablement l’espace restant selon l’axe de bloc (vertical) entre les rangées de la grille. </p>
<p>Notez qu’on peut également utiliser la propriété raccourcie <code>place-content</code> pour définir les valeurs de <code>align-content</code> et <code>justify-content</code> d’un coup. </p>
<p>&#038;nbsp ;</p>
<h2>Définir la largeur de l’espace entre deux colonnes ou entre deux rangées de grille : row-gap et column-gap</h2>
<p>Précédemment, nous avons vu comme créer des grilles, définir des colonnes et des rangées, positionner et aligner des éléments de grille et comment aligner une grille dans son conteneur. </p>
<p>Souvent, lorsqu’on crée une page, on voudra ajouter de l’espace entre différentes colonnes ou rangées d’une grille pour aérer la grille et faire en sorte que les éléments ne soient pas forcément tous collés les uns aux autres. </p>
<p>On va pouvoir pour cela utiliser les propriétés <code>row-gap</code> et <code>column-gap</code> qui permettent de définir la taille des « gouttières » de la grille c’est-à-dire la taille des espaces entre les rangées et entre les colonnes. </p>
<p class="codepen" data-height="523" data-theme-id="default" data-default-tab="html" data-user="pierregiraud" data-slug-hash="povjYLB" data-preview="true" style="height: 523px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Grid Layout #10 : row-gap &amp;amp; column-gap">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/povjYLB"><br />
  CSS Grid Layout #10 : row-gap &amp; column-gap</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="408" data-theme-id="default" data-default-tab="css" data-user="pierregiraud" data-slug-hash="povjYLB" data-preview="true" style="height: 408px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Grid Layout #10 : row-gap &amp;amp; column-gap">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/povjYLB"><br />
  CSS Grid Layout #10 : row-gap &amp; column-gap</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="345" data-theme-id="default" data-default-tab="result" data-user="pierregiraud" data-slug-hash="povjYLB" data-preview="true" style="height: 345px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Grid Layout #10 : row-gap &amp;amp; column-gap">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/povjYLB"><br />
  CSS Grid Layout #10 : row-gap &amp; column-gap</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>Notez qu’on peut également utiliser la propriété raccourcie <code>gap</code> pour définir les valeurs de <code>row-gap</code> et <code>column-gap</code> d’un coup. </p>
<p>&nbsp;</p>
<h2>Gestion des éléments implicites des grilles</h2>
<h3>Gérer la taille des colonnes et des rangées implicites : grid-auto-columns et grid-auto-rows</h3>
<p>Si un élément de grille est positionné dans une rangée ou une colonne qui n&rsquo;est pas dimensionnée de manière explicite avec <code>grid-template-rows</code> ou <code>grid-template-columns</code>, des pistes de grille implicites sont créées pour le contenir. </p>
<p>Les pistes implicites sont créées lorsqu&rsquo;il y a plus d&rsquo;éléments de grille que de cellules dans la grille (auquel cas un algorithme de placement automatique va créer des rangées ou des colonnes supplémentaires) ou lorsqu&rsquo;un élément de grille est placé en dehors de la grille explicite.</p>
<p>On va pouvoir définir des tailles souhaitées pour ces pistes implicites grâce aux propriétés <code>grid-auto-columns</code> et <code>grid-auto-rows</code>.</p>
<p>Notez que si plusieurs tailles de piste sont données, le modèle est répété autant de fois que nécessaire pour déterminer la taille des pistes implicites. La première piste de grille implicite reçoit la première taille spécifiée, et ainsi de suite.</p>
<p class="codepen" data-height="596" data-theme-id="default" data-default-tab="html" data-user="pierregiraud" data-slug-hash="povjYKB" data-preview="true" style="height: 596px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Grid Layout #11 : grid-auto-columns &amp;amp; grid-auto-rows">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/povjYKB"><br />
  CSS Grid Layout #11 : grid-auto-columns &amp; grid-auto-rows</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="430" data-theme-id="default" data-default-tab="css" data-user="pierregiraud" data-slug-hash="povjYKB" data-preview="true" style="height: 430px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Grid Layout #11 : grid-auto-columns &amp;amp; grid-auto-rows">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/povjYKB"><br />
  CSS Grid Layout #11 : grid-auto-columns &amp; grid-auto-rows</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="370" data-theme-id="default" data-default-tab="result" data-user="pierregiraud" data-slug-hash="povjYKB" data-preview="true" style="height: 370px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Grid Layout #11 : grid-auto-columns &amp;amp; grid-auto-rows">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/povjYKB"><br />
  CSS Grid Layout #11 : grid-auto-columns &amp; grid-auto-rows</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>Dans cet exemple, on crée deux grilles possédant deux colonnes et deux rangées définies de manière explicite. Nos deux grilles contiennent six éléments, c’est-à-dire deux éléments de plus que de cellules. Des pistes implicites vont donc être créées. </p>
<p>Dans notre première grille, nous ne donnons pas d’instruction de placement des éléments. Chaque élément va occuper une cellule et une troisième rangée va être créée implicitement pour accueillir les deux éléments « en trop ». </p>
<p>Dans notre deuxième grille, en revanche, nous plaçons des éléments en dehors des pistes explicites de la grille. Des pistes vont donc être créées implicitement selon le modèle fourni par <code>grid-auto-columns</code> dans ce cas puisque nous avons placé nos éléments dans des colonnes qui n’ont pas été définies explicitement.</p>
<h3>Gérer le positionnement des éléments positionnés automatiquement : grid-auto-flow</h3>
<p>Les éléments de grille qui ne sont pas explicitement placés sont automatiquement placés dans un espace inoccupé du conteneur de grille par un algorithme de placement automatique. </p>
<p>La propriété <code>grid-auto-flow</code> nous permet de contrôler le fonctionnement de l&rsquo;algorithme de placement automatique, en spécifiant exactement comment les éléments placés automatiquement sont transférés dans la grille. Elles accepte les valeurs suivantes : </p>
<ul>
<li><code>row</code> (valeur par défaut) : indique à l’algorithme de placement automatique de remplir les rangées les unes après les autres en créant de nouvelles rangées au besoin ;</li>
<li><code>column</code> : indique à l’algorithme de placement automatique de remplir les colonnes les unes après les autres en créant de nouvelles colonnes au besoin ;</li>
<li><code>dense</code> : indique à l&rsquo;algorithme de placement automatique de tenter de combler les trous déjà présents dans la grille si des éléments plus petits apparaissent plus tard.</li>
</ul>
<p class="codepen" data-height="593" data-theme-id="default" data-default-tab="html" data-user="pierregiraud" data-slug-hash="VwYejYe" data-preview="true" style="height: 593px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Grid Layout #12 : grid-auto-flow">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/VwYejYe"><br />
  CSS Grid Layout #12 : grid-auto-flow</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="395" data-theme-id="default" data-default-tab="css" data-user="pierregiraud" data-slug-hash="VwYejYe" data-preview="true" style="height: 395px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Grid Layout #12 : grid-auto-flow">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/VwYejYe"><br />
  CSS Grid Layout #12 : grid-auto-flow</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p class="codepen" data-height="360" data-theme-id="default" data-default-tab="result" data-user="pierregiraud" data-slug-hash="VwYejYe" data-preview="true" style="height: 360px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="CSS Grid Layout #12 : grid-auto-flow">
  <span>See the Pen <a href="https://codepen.io/pierregiraud/pen/VwYejYe"><br />
  CSS Grid Layout #12 : grid-auto-flow</a> by Pierre  (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>&nbsp;</p>
<h2>Notation raccourcie : la propriété grid</h2>
<p>La propriété <code>grid</code> est une propriété raccourcie qui permet de définir les valeurs pour <code>grid-template-rows</code>, <code>grid-template-columns</code>, <code>grid-template-areas</code>, <code>grid-auto-rows</code>, <code>grid-auto-columns</code>, et <code>grid-auto-flow</code> dans une seule déclaration. </p>
<p>Attention : on ne pourra spécifier que des propriétés liés aux éléments explicites ou que des propriétés liées aux éléments implicites au sein d’une seule déclaration <code>grid</code>.</p>
<p>&nbsp;</p>
<h2>Résumé : liste des propriétés des grilles CSS</h2>
<div style="overflow-x:auto">
<table>
<thead>
<tr>
<th>Propriété</th>
<th>Valeurs</th>
<th>S’applique à</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>display</code></td>
<td>grid<br />inline-grid</td>
<td>Conteneur</td>
<td>Permet de créer un conteneur de grille</td>
</tr>
<tr>
<td><code>grid-template-rows</code></td>
<td>[nom-de-ligne] taille-de-rangee</td>
<td>Conteneur</td>
<td>Permet de définir le nom des lignes entre chaque rangée ainsi que le nombre et les dimensions des rangées d’une grille</td>
</tr>
<tr>
<td><code>grid-template-columns</code></td>
<td>[nom-de-ligne] taille-de-colonne</td>
<td>Conteneur</td>
<td>Permet de définir le nom des lignes entre chaque colonne ainsi que le nombre et les dimensions des colonnes d’une grille</td>
</tr>
<tr>
<td><code>grid-row-start</code></p>
<td>Numéro de ligne<br />Nom de ligne<br />span numero-de-ligne<br />span nom-de-ligne</td>
<td>Elément de grille</td>
<td>Définit la ligne de départ où doit être placé un élément dans le sens des rangées de la grille</td>
</tr>
<tr>
<td><code>grid-row-end</code></p>
<td>Numéro de ligne<br />Nom de ligne<br />span numero-de-ligne<br />span nom-de-ligne</td>
<td>Elément de grille</td>
<td>Définit la ligne de fin où doit être placé un élément dans le sens des rangées de la grille</td>
</tr>
<tr>
<td><code>grid-row</code></p>
<td>Ligne de départ (n° ou nom)/Ligne de fin (n° ou nom)</td>
<td>Elément de grille</td>
<td>Propriété raccourcie pour <code>grid-row-start</code> et <code>grid-row-end</code></td>
</tr>
<tr>
<td><code>grid-column-start</code></p>
<td>Numéro de ligne<br />Nom de ligne<br />span numero-de-ligne<br />span nom-de-ligne</td>
<td>Elément de grille</td>
<td>Définit la colonne de départ où doit être placé un élément dans le sens des colonnes de la grille</td>
</tr>
<tr>
<td><code>grid-column-end</code></p>
<td>Numéro de ligne<br />Nom de ligne<br />span numero-de-ligne<br />span nom-de-ligne</td>
<td>Elément de grille</td>
<td>Définit la colonne de fin où doit être placé un élément dans le sens des colonnes de la grille</td>
</tr>
<tr>
<td><code>grid-column</code></p>
<td>Ligne de départ (n° ou nom)/Ligne de fin (n° ou nom)</td>
<td>Elément de grille</td>
<td>Propriété raccourcie pour <code>grid-column-start</code> et <code>grid-column-end</code></td>
</tr>
<tr>
<td><code>grid-area</code></td>
<td>&lt;row-start&gt;/&lt;column-start&gt;/&lt;row-end&gt;/&lt;column-end&gt;<br />nom-de-zone</td>
<td>Elément de grille</td>
<td>Peut être utilisée comme notation raccourcie de <code>grid-row-start</code>, <code>grid-column-start</code>, <code>grid-row-end</code> et <code>grid-column-end</code> ou pour définir un nom de zone de grille qui sera associé à un élément de grille</td>
</tr>
<tr>
<td><code>grid-template-areas</code></td>
<td>Noms de zones créés avec <code>grid-area</code></td>
<td>Conteneur</td>
<td>Permet de définir l’espace dans la grille lié aux noms de zones de grilles fournis par <code>grid-area</code> et donc de placer les éléments dans la grille</td>
</tr>
<tr>
<td><code>grid-template</td>
<td>&lt;grid-template-rows&gt;/&lt;grid-template-columns&gt;<br />&lt;grid-template-areas&gt; &lt;grid-template-rows&gt;/ &lt;grid-template-columns&gt;</td>
<td>Conteneur</td>
<td>Propriété raccourcie pour <code>grid-template-rows</code>, <code>grid-template-columns</code> et <code>grid-template-areas</code></td>
</tr>
<tr>
<td><code>justify-self</code></td>
<td>start<br />end<br />center<br />stretch</td>
<td>Elément de grille</td>
<td>Aligne un élément de grille le long de l’axe des rangées au sein de la zone qui lui a été attribuée</td>
</tr>
<tr>
<td><code>justify-items</code></td>
<td>start<br />end<br />center<br />stretch</td>
<td>Conteneur</td>
<td>Aligne tous les éléments de grille le long de l’axe des rangées au sein de la zone qui leur a été attribuée</td>
</tr>
<tr>
<td><code>align-self</code></td>
<td>start<br />end<br />center<br />stretch</td>
<td>Elément de grille</td>
<td>Aligne un élément de grille le long de l’axe des colonnes au sein de la zone qui lui a été attribuée</td>
</tr>
<tr>
<td><code>align-items</code></td>
<td>start<br />end<br />center<br />stretch</td>
<td>Conteneur</td>
<td>Aligne tous les éléments de grille le long de l’axe des colonnes au sein de la zone qui leur a été attribuée</td>
</tr>
<tr>
<td><code>place-self</code></td>
<td>&lt ;align-self&gt ;/&lt ;justify-self&gt ;</td>
<td>Elément de grille</td>
<td>Propriété raccourcie pour <code>align-self</code> et <code>justify-self</code></td>
</tr>
<tr>
<td><code>place-items</code></td>
<td>&lt ;align-items&gt ;/&lt ;justify-items&gt ;</td>
<td>Conteneur</td>
<td>Propriété raccourcie pour <code>align-items> et <code>justify-items</code></td>
</tr>
<tr>
<td><code>justify-content</code></td>
<td>start<br />end<br />center<br />stretch<br />space-around<br />space-between<br />space-evenly</td>
<td>Conteneur</td>
<td>Définit l’alignement de la grille dans son conteneur le long de l’axe des rangées</td>
</tr>
<tr>
<td><code>align-content</code></td>
<td>start<br />end<br />center<br />stretch<br />space-around<br />space-between<br />space-evenly</td>
<td>Conteneur</td>
<td>Définit l’alignement de la grille dans son conteneur le long de l’axe des colonnes</td>
</tr>
<tr>
<td><code>row-gap</code></td>
<td>distance</td>
<td>Conteneur</td>
<td>Spécifie la taille de la gouttière entre les rangées de la grille</td>
</tr>
<tr>
<td><code>column-gap</code></td>
<td>distance</td>
<td>Conteneur</td>
<td>Spécifie la taille de la gouttière entre les colonnes de la grille</td>
</tr>
<tr>
<td><code>gap</code></td>
<td>&lt;row-gap&gt; &lt;column-gap&gt;</td>
<td></td>
<td>Propriété raccourcie pour <code>row-gap</code> et <code>column-gap</code></td>
</tr>
<tr>
<td><code>grid-auto-rows</code></td>
<td>longueur</td>
<td>Conteneur</td>
<td>Permet de définir la taille des rangées créées implicitement</td>
</tr>
<tr>
<td><code>grid-auto-columns</code></td>
<td>longueur</td>
<td>Conteneur</td>
<td>Permet de définir la taille des colonnes créées implicitement</td>
</tr>
<td><code>grid-auto-flow</code></td>
<td>row<br />column<br />dense</td>
<td>Conteneur</td>
<td>Définit le comportement de l’algorithme de placement automatique des éléments de grille</td>
</tr>
<td><code>grid</code></td>
<td>&lt;‘grid-template-rows’&gt; / [ auto-flow &amp;&amp; dense? ] &lt;‘grid-auto-columns’&gt;?<br />[ auto-flow &amp;&amp; dense? ] &lt;‘grid-auto-rows’&gt;? / &lt;‘grid-template-columns’&gt;</td>
<td>Conteneur</td>
<td>Propriété raccourcie pour <code>grid-template-rows</code>, <code>grid-template-columns</code>, <code>grid-template-areas</code>, <code>grid-auto-rows</code>, <code>grid-auto-columns</code>, et <code>grid-auto-flow</code>.</td>
</tr>
</tbody>
</table>
</div>
</article>
<aside>
<div class="asidep">
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script><br />
<!-- PG v. 2019 --><br />
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8384266137058067"
     data-ad-slot="8226819743"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>
</div>
</aside>
</div>
<p>L’article <a href="https://www.pierre-giraud.com/grille-css-guide-complet-grid-layout/">Définir des grilles CSS : Le guide complet – CSS Grid Layout</a> est apparu en premier sur <a href="https://www.pierre-giraud.com">Pierre Giraud</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.pierre-giraud.com/grille-css-guide-complet-grid-layout/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Tri JavaScript dynamique d&#8217;un tableau HTML ou d&#8217;une liste</title>
		<link>https://www.pierre-giraud.com/trier-tableau-javascript/</link>
					<comments>https://www.pierre-giraud.com/trier-tableau-javascript/#respond</comments>
		
		<dc:creator><![CDATA[Pierre GIRAUD]]></dc:creator>
		<pubDate>Wed, 27 Nov 2019 09:00:23 +0000</pubDate>
				<category><![CDATA[JavaScript]]></category>
		<guid isPermaLink="false">https://www.pierre-giraud.com/?p=12631</guid>

					<description><![CDATA[<p>Dans ce nouveau tutoriel, je vous propose de créer un script JavaScript qui va nous permettre de trier une liste d’éléments ou les cellules d’un tableau HTML. Nous allons pouvoir trier par ordre alphabétique et par valeur numérique, dans l’ordre ascendant (croissant) ou descendant (décroissant). &#160; Créer un tri dynamique en JavaScript &#8211; Partie HTML ... <a title="Tri JavaScript dynamique d&#8217;un tableau HTML ou d&#8217;une liste" class="read-more" href="https://www.pierre-giraud.com/trier-tableau-javascript/" aria-label="En savoir plus sur Tri JavaScript dynamique d&#8217;un tableau HTML ou d&#8217;une liste">Lire plus</a></p>
<p>L’article <a href="https://www.pierre-giraud.com/trier-tableau-javascript/">Tri JavaScript dynamique d&rsquo;un tableau HTML ou d&rsquo;une liste</a> est apparu en premier sur <a href="https://www.pierre-giraud.com">Pierre Giraud</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="grille2pr">
<article class="ctn2pr">
Dans ce nouveau tutoriel, je vous propose de créer un script JavaScript qui va nous permettre de trier une liste d’éléments ou les cellules d’un tableau HTML.</p>
<p>Nous allons pouvoir trier par ordre alphabétique et par valeur numérique, dans l’ordre ascendant (croissant) ou descendant (décroissant).</p>
<p>&nbsp;</p>
<h2>Créer un tri dynamique en JavaScript &#8211; Partie HTML et ressources utilisées</h2>
<p>Commençons par créer un tableau structuré en HTML :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="html">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
    &lt;meta http-equiv="X-UA-Compatible" content="ie=edge"&gt;
    &lt;title&gt;Tri JavaScript&lt;/title&gt;
    &lt;script src="tri.js" async&gt;&lt;/script&gt;
    &lt;style&gt;
        table{border-collapse: collapse}
        th,td{border: 1px solid black;padding: 10px 20px}
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;table&gt;
        &lt;thead&gt;
            &lt;tr&gt;
                &lt;th&gt;Prénom&lt;/th&gt;
                &lt;th&gt;Age&lt;/th&gt;
                &lt;th&gt;Abonné&lt;/th&gt;
            &lt;/tr&gt;
        &lt;/thead&gt;
        &lt;tbody&gt;
            &lt;tr&gt;
                &lt;td&gt;Pierre&lt;/td&gt;
                &lt;td&gt;29&lt;/td&gt;
                &lt;td&gt;oui&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;Mathilde&lt;/td&gt;
                &lt;td&gt;027&lt;/td&gt;
                &lt;td&gt;false&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;3Ric&lt;/td&gt;
                &lt;td&gt;&lt;/td&gt;
                &lt;td&gt;??&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
                &lt;td&gt;Florian&lt;/td&gt;
                &lt;td&gt;trente&lt;/td&gt;
                &lt;td&gt;01&lt;/td&gt;
            &lt;/tr&gt;
        &lt;/tbody&gt;
    &lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Notre tableau contient ici une ligne d’en-tête en 5 lignes de données. Nous allons vouloir pouvoir trier les cellules de chaque colonne en cliquant simplement sur la cellule d’en-tête correspondante. Bien évidemment, on va également vouloir que lors du tri le reste des lignes suive les cellules de la colonne triée.</p>
<p>En JavaScript, la meilleure façon de faire actuellement de être de :</p>
<ol>
<li>Récupérer les valeurs du tableau dynamiquement ;</li>
<li>Comparer les cellules de la colonne triée deux à deux et les ordonner comme cela les unes après les autres ;</li>
<li>Réinjecter les résultats dans la page en créant un nouveau tableau qui viendra remplacé le précédent.</li>
</ol>
<p>Pour cela, nous allons utiliser les méthodes suivantes :</p>
<ul>
<li>Les méthodes <code>querySelector()</code> et <code>querySelectorAll()</code> qui nous permettent de récupérer des éléments spécifiques dans le DOM ;</li>
<li>La méthode <code>AddEventListener()</code> qui permet d’accrocher un gestionnaire d’événements à un élément ;</li>
<li>La fonction <code>isNaN()</code> qui indique si une valeur est un nombre (<code>true</code>) ou pas (<code>false</code>) ;</li>
<li>La méthode <code>toString()</code> qui renvoie une chaine de caractères à partir d’un objet ;</li>
<li>La méthode <code>localeCompare()</code> qui renvoie un nombre indiquant si la chaîne de caractères courante se situe avant (nb négatif), après (nb positif) ou est la même que la chaîne passée en paramètre (0), selon l&rsquo;ordre lexicographique.</li>
<li>La méthode <code>forEach()</code> qui permet d&rsquo;exécuter une fonction donnée sur chaque élément du tableau ;</li>
<li>La méthode <code>Array.from()</code> qui permet de créer une nouvelle instance d&rsquo;Array (une copie superficielle) à partir d&rsquo;un objet itérable ou semblable à un tableau.</li>
<li>La méthode <code>sort()</code> qui trie les éléments d&rsquo;un tableau, dans ce même tableau, et renvoie le tableau ;</li>
<li>La méthode <code>indexOf()</code> qui renvoie le premier indice pour lequel on trouve un élément donné dans un tableau ou -1.</li>
</ul>
<p>On va également avoir besoin des propriétés suivantes :</p>
<ul>
<li>La propriété <code>children</code> (lecture seule) qui renvoie une <code>HTMLCollection</code> contenant tous les enfants <code>Element</code> du noeud sur lequel elle a été appelée ;</li>
<li>La propriété <code>textContent</code> qui représente le contenu textuel d&rsquo;un nœud et de ses descendants.</li>
</ul>
<p>&nbsp;</p>
<h2>Créer un tri dynamique en JavaScript &#8211; Script JavaScript</h2>
<p>Comme l’exercice est relativement complexe, on va procéder par itération en créant d’abord un grand schéma de ce qu’on souhaite obtenir et en complétant au fur et à mesure.</p>
<h3>Création d’une première ébauche de tri</h3>
<p>On sait qu’il va falloir qu’on classes les différentes lignes de notre tableau en fonction de la valeur des cellules d’une colonne donnée. On va donc déjà commencer par accéder à nos éléments <code>tbody</code>, <code>th</code> et <code>tr</code>. Pour cela, on peut écrire :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">const tbody = document.querySelector('tbody');
const thx = document.querySelectorAll('th');
const trxb = tbody.querySelectorAll('tr');</pre>
<p>La méthode <code>querySelectorAll()</code> renvoie une <code>NodeList</code> d’éléments correspondant au sélecteur passés contenus dans le document ou qui sont des descendants de l&rsquo;élément sur lequel la méthode a été appelée. <code>tbody.querySelectorAll('tr')</code> renvoie donc une liste des noeuds éléments <code>tr</code> contenus dans <code>tbody</code> par exemple.</p>
<p>Notez déjà qu’il est possible d’itérer sur (de parcourir) une <code>NodeList</code> avec <code>forEach()</code> et qu’on peut également convertir une <code>NodeList</code> en tableau avec la méthode <code>Array.from()</code>.</p>
<p>En plus de cela, les éléments de notre <code>NodeList</code> contiennent des propriétés <code>cells</code> et <code>children</code> qui peuvent nous permettre d’accéder à une <code>HTMLCollection</code> des éléments qu’ils contiennent.</p>
<p>Ensuite, on veux que le tableau soit trié dans l’ordre croissant ou décroissant des valeurs en fonction d’une colonne dès qu’un utilisateur clique sur la cellule d’en-tête de cette colonne. On va donc utiliser un évènement de type <code>click</code> et utiliser une fonction de retour qui va devoir faire le travail.</p>
<p>Commençons déjà par accrocher un gestionnaire d’évènement <code>click</code> à chacun de nos <code>th</code>. On peut écrire quelque chose comme ça :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">thx.forEach(th =&gt; th.addEventListener('click', () =&gt;{
   /*Code à créer*/
}));</pre>
<p>Notez bien ici que les <code>th</code> du code ci-dessus ne sont que des variables : je pourrais leur donner n’importe quel nom. L’idée est que <code>forEach()</code> va exécuter un code pour chaque élément de l’<code>Array</code> / la <code>NodeList</code> sur lequel on l’appelle. <code>thx</code> est composé des <code>th</code> de notre tableau; <code>forEach()</code> va donc ici accrocher des gestionnaires d’évènements à chaque élément <code>th</code>.</p>
<p>Le code au dessus utilise des fonctions fléchées qui sont une notation récente du JavaScript. L’équivalent avec des fonctions anonymes serait :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">thx.forEach(function(th) { 
    th.addEventListener('click', function() {
       /*Code à créer*/
    });
});</pre>
<p>Lorsqu’un utilisateur clique sur une cellule d’en-tête, il va falloir qu’on classe / ordonne les différentes lignes du tableau et qu’on remplace le tableau de base par le nouveau tableau ordonné.</p>
<p>Pour classer les lignes du tableau, on va utiliser la méthode <code>sort()</code>. Par défaut, cette méthode va trier les valeurs en les convertissant en chaines de caractères et en comparant ces chaines selon l&rsquo;ordre des points de code Unicode. Cette méthode ne nous convient pas puisqu’elle n’est efficace que pour trier des chaines qui ont des formes semblables (tout en minuscule ou tout en majuscule).</p>
<p>Heureusement, <code>sort()</code> peut prendre en argument facultatif une fonction de comparaison qui va décrire la façon dont les éléments vont être comparés, ce qui va nous être très utile ici. Cette fonction de comparaison va toujours devoir renvoyer un nombre en valeur de retour qui va décider de l’ordre de tri.</p>
<p>Par exemple, si <code>v1</code> et <code>v2</code> sont deux valeurs à comparer, alors :</p>
<ul>
<li>Si <code>fonctionDeComparaison(v1, v2)</code> renvoie une valeur strictement inférieure à 0, <code>v1</code> sera classé avant <code>v2</code> ;</li>
<li>Si <code>fonctionDeComparaison(v1, v2)</code> renvoie une valeur strictement supérieure à 0, <code>v2</code> sera classé avant <code>v1</code> ;</li>
<li>Si <code>fonctionDeComparaison(v1, v2)</code> renvoie 0, on laisse <code>v1</code> et <code>v2</code> inchangés l&rsquo;un par rapport à l&rsquo;autre, mais triés par rapport à tous les autres éléments.</li>
</ul>
<p>Pour réinjecter le résultat, on va utiliser <code>forEach()</code> et <code>appendChild()</code>.</p>
<p>Notre gestionnaire d’évènements va donc ressembler à cela :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">thx.forEach(th =&gt; th.addEventListener('click', () =&gt;{
    let classe = Array.from(trxb).sort(compare(a,b));
    classe.forEach(tr =&gt; tbody.appendChild(tr));
}));</pre>
<p>La méthode <code>sort()</code> a besoin d’un <code>Array</code> (ou d’un array-like) pour fonctionner. On utilise donc <code>Array.from(trbx)</code> pour créer un <code>Array</code> à partir de notre <code>NodeList</code>.</p>
<p>Ensuite, pour chaque élément du tableau classé, on utilise <code>appendChild</code> qui va insérer les <code>tr</code> les unes à la suite des autres.</p>
<p>Voilà tout pour le squelette. La vraie difficulté va maintenant être de savoir ce qu’on va mettre dans notre fonction <code>compare()</code>.</p>
<h3>Création de la fonction de tri avec critères personnalisés</h3>
<p>Pour le moment, on passe un <code>Array</code> complexe composé d’objets à <code>sort()</code>. En effet, <code>Array.from(trxb)</code> crée un <code>Array</code> composé des différents <code>tr</code> de notre <code>tbody</code> et ces <code>tr</code> sont des objets (noeuds) eux mêmes composés de (noeuds) <code>td</code> eux mêmes composés de (noeuds) texte.</p>
<p>La méthode <code>sort()</code> transmet ainsi ici automatiquement les différents éléments de <code>Array.from(trxb)</code> (c’est-à-dire les différents <code>tr</code>) à la fonction <code>compare()</code> passée en argument.</p>
<p>Or, comparer des lignes de tableau deux à deux n’a pas de sens : on veut comparer les valeurs textuelles des <code>td</code> d’une colonne donnée entre les différentes lignes du tableau pour ensuite pouvoir ordonner les lignes entières dans un sens ou dans un autre.</p>
<p>On va donc ici vouloir passer explicitement l’indice du <code>th</code> lié à la colonne actuellement cliqué afin de définir la colonne de référence utilisée pour le tri ainsi qu’un booléen qui va nous permettre d’inverser le tri (croissant / décroissant) à chaque fois qu’un élément d’en-tête sera cliqué (note : par simplicité, les éléments d’en-tête agissent comme un groupe ici et non pas indépendamment).</p>
<p>On va faire tout cela de la façon suivante :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">thx.forEach(th =&gt; th.addEventListener('click', () =&gt;{
    let classe = Array.from(trxb).sort(compare(Array.from(thx).indexOf(th), this.asc = !this.asc));
    classe.forEach(tr =&gt; tbody.appendChild(tr));
}));</pre>
<p>La partie <code>Array.from(thx).indexOf(th)</code> nous permet de récupérer l’indice du <code>th</code> couramment cliqué. On va se servir ensuite de cet indice pour savoir quelles valeurs comparer dans chaque <code>tr</code>.</p>
<p>La partie <code>this.asc = !this.asc</code> permet de définir un booléen dont la valeur logique va être inversée à chaque clic sur un élément d’en-tête. Avant le premier clic, <code>this.asc</code> n’est pas défini (et vaut donc <code>false</code>). Lors du premier clic, sa valeur s’inverse et il vaut donc <code>true</code> et etc. Cela va nous permettre ensuite de choisir l’ordre de tri.</p>
<p>Passons maintenant à notre fonction de comparaison en soi. Notre fonction <code>compare()</code> va devoir retourner une fonction qui va recevoir en arguments valeurs passées par <code>sort()</code> (c’est-à-dire nos lignes de tableau) et retourner un nombre positif, négatif ou égal à 0 afin d’indiquer à <code>sort()</code> comment les lignes doivent être triées. L’architecture de notre fonction va donc ressembler à :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">const compare = (ids, asc) =&gt; (row1, row2) =&gt; /*Un nombre*/</pre>
<p>L’équivalent avec des notations plus traditionnelles est :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">const compare = function(ids, asc){
    return function(row1, row2){
       return /*Un nombre*/;
    }
}</pre>
<p>L’idée principale de notre fonction de comparaison est la suivante : on va vouloir obtenir le contenu textuel des cellules de la colonne utilisée pour le tri pour les deux lignes passées par <code>sort()</code> et on va vouloir comparer ces deux valeurs textuelles puis renvoyer un nombre à l’issue de cette comparaison pour indiquer à <code>sort()</code> l’ordre de tri.</p>
<p>Notre fonction de comparaison va déjà devoir comparer les valeurs textuelles des <code>td</code> d’une colonne pour deux lignes différentes pour ensuite pouvoir ordonner les lignes. Il va donc falloir accéder à ces valeurs textuelles. On va pour cela créer une autre fonction qui va prendre une ligne et un numéro de colonne en entrée et qui va extraire le contenu textuel de la cellule de tableau relative à l’id passé dans cette ligne.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">const compare = (ids, asc) =&gt; (row1, row2) =&gt; {
    const tdValue = (row, ids) =&gt; row.children[ids].textContent;
   /*Un nombre*/</pre>
<p>L’équivalent en fonctions non fléchées est :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">const compare = function(ids, asc){
    return function(row1, row2){
       const tdValue = function(row, ids){
           return row.children[ids].textContent;
       }
       return /*Un nombre*/
    }
}</pre>
<p>Maintenant qu’on possède une fonction nous permettant de récupérer le contenu textuel des <code>td</code>, il ne nous reste plus qu’à créer une comparaison qui va comparer ces deux valeurs textuelles. On peut faire cela en utilisant des ternaires :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">const compare = (ids, asc) =&gt; (row1, row2) =&gt; {
    const tdValue = (row, ids) =&gt; row.children[ids].textContent;
    const tri = (v1, v2) =&gt; v1 !== '' &amp;&amp; v2 !== '' &amp;&amp; !isNaN(v1) &amp;&amp; !isNaN(v2) ? v1 - v2 : v1.localeCompare(v2);
    /*Un nombre*/
};</pre>
<p>L’équivalent de cette notation condensée avec des boucles classiques et des fonctions non fléchées est :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">const compare = function(ids, asc){
    return function(row1, row2){
       const tdValue = function(row, ids){
           return row.children[ids].textContent;
       }
       const tri = function(v1, v2){
           if (v1 !== '' &amp;&amp; v2 !== '' &amp;&amp; !isNaN(v1) &amp;&amp; !isNaN(v2)){
              return v1 - v2;
           }
           else {
              return v1.toString().localeCompare(v2);
           }
           return v1 !== '' &amp;&amp; v2 !== '' &amp;&amp; !isNaN(v1) &amp;&amp; !isNaN(v2) ? v1 - v2 : v1.localeCompare(v2);
       };
       return /*Un nombre*/
   }
}</pre>
<p>Ici, <code>v1</code> et <code>v2</code> représentent le contenu textuel des cellules des deux lignes pour une colonne donnée. On veut d’abord traiter deux cas : le cas où les cellules contiennent des nombres et le cas où elles contiennent autre chose que des nombres.</p>
<p>Dans le cas où nos deux valeurs sont bien des nombres, on se contente de retourner la différence entre les deux valeurs.</p>
<p>Il faut savoir ici que lorsqu’on passe un argument qui n’est pas du type <code>Number</code> à <code>isNan()</code>, cet argument est d’abord converti de force en une valeur de type <code>Number</code> et c’est la valeur résultante qui est utilisée pour déterminer si l’argument est NaN ou pas.</p>
<p><code>isNan()</code> va notamment renvoyer <code>true</code> pour les valeurs booléennes <code>true</code> et <code>false</code> et pour la chaine de caractères vide. On va donc isoler le cas “chaine de caractères vide”. Comme les valeurs récupérées dans le tableau seront transformées en chaine, on n’a pas besoin d’isoler les cas <code>true</code> et <code>false</code>.</p>
<p>Pour tous les cas qui ne rentrent pas dans notre <code>if</code>, on va comparer les deux valeurs avec la méthode <code>localeCompare()</code>. Si la valeur <code>v2</code> est considérée comme se situant après dans l’ordre lexicographique par rapport à <code>v1</code> par <code>localeCompare()</code>, cette méthode renverra un nombre négatif. Dans le cas contraire, un nombre positif sera renvoyé.</p>
<p>En résumé, dans notre <code>if</code> comme dans notre <code>else</code>, si <code>v2</code> est “plus grand” que <code>v1</code> , une valeur négative est retournée. Dans le cas contraire, une valeur positive est retournée. Si les deux valeurs sont égales, 0 est retourné.</p>
<p>Il ne nous reste plus alors qu’à passer des valeurs textuelles effectives à notre fonction <code>tri()</code> en tenant compte de l’ordre de tri choisi (croissant ou décroissant). On peut écrire :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">const compare = (ids, asc) =&gt; (row1, row2) =&gt; {
    const tdValue = (row, ids) =&gt; row.children[ids].textContent;
    const tri = (v1, v2) =&gt; v1 !== '' &amp;&amp; v2 !== '' &amp;&amp; !isNaN(v1) &amp;&amp; !isNaN(v2) ? v1 - v2 : v1.toString().localeCompare(v2);
    return tri(tdValue(asc ? row1 : row2, ids), tdValue(asc ? row2 : row1, ids));
};</pre>
<p>Ou l’équivalent en “version longue” :</p>
<pre class="EnlighterJSRAW" data-enlighter-language="js">const compare = function(ids, asc){
    return function(row1, row2){
        const tdValue = function(row, ids){
            return row.children[ids].textContent;
        }
        const tri = function(v1, v2){
            if (v1 !== '' &amp;&amp; v2 !== '' &amp;&amp; !isNaN(v1) &amp;&amp; !isNaN(v2)){
               return v1 - v2;
            }
            else {
               return v1.toString().localeCompare(v2);
            }
            return v1 !== '' &amp;&amp; v2 !== '' &amp;&amp; !isNaN(v1) &amp;&amp; !isNaN(v2) ? v1 - v2 : v1.toString().localeCompare(v2);
        };
        return tri(tdValue(asc ? row1 : row2, ids), tdValue(asc ? row2 : row1, ids));
    }
};</pre>
<p>Décortiquons cette dernière ligne de code ensemble. Cette ligne est relativement condensée et contient deux ternaires. La partie <code>tdValue(asc ? row1 : row2, ids), tdValue(asc ? row2 : row1, ids)</code> permet de récupérer le contenu textuel d’une cellule de la première ligne puis le contenu textuel d’une cellule de la deuxième ligne ou inversement selon que <code>asc</code> soit évalué à <code>true</code> ou pas.</p>
<p>Grosso modo, on va exécuter <code>tdValue(row1, ids)</code> et <code>tdValue(row2, ids)</code> si <code>asc</code> vaut <code>true</code> ou <code>tdValue(row2, ids)</code> et <code>tdValue(row1, ids)</code> si <code>asc</code> vaut <code>false</code>.</p>
<p>Les deux résultats renvoyés par <code>tdValue()</code> (les valeurs textuelles des deux cellules donc) sont ensuite immédiatement passées comme arguments à <code>tri()</code> qui va les comparer et renvoyer un nombre. En fonction de si le nombre est positif, négatif ou égal à 0 la méthode <code>sort()</code> va finalement ordonner les lignes dans un sens ou dans un autre.</p>
<p>Ici, notre ternaire nous permet finalement de choisir quelle valeur textuelle va être utilisée en <code>v1</code> et quelle autre va être utilisée en <code>v2</code>, ce qui va influer sur le résultat final.</p>
<p>Si <code>asc</code> vaut <code>true</code>, la valeur textuelle de la première colonne sera utilisée comme <code>v1</code> et la valeur textuelle de la deuxième colonne sera utilisée comme <code>v2</code>.</p>
<p>Or, on a dit plus haut que si <code>v2</code> est “plus grand” que <code>v1</code> , une valeur négative est retournée par <code>tri()</code>. Notre fonction <code>compare()</code> renvoie donc dans ce cas une fonction <code>function(row1, row2)</code> qui renvoie elle même une valeur négative.</p>
<p>La ligne <code>Array.from(trxb).sort(compare(Array.from(thx).indexOf(th), this.asc = !this.asc)</code> va donc devenir <code>Array.from(trxb).sort(function(row1, row2){return /*Une valeur négative*/}</code> et dans ce scénario <code>sort()</code> va classer <code>row1</code> avant <code>row2</code>.</p>
<p>On a donc finalement réalisé un tri fonctionnel en JavaScript, qui permet de comparer et de classer différents types de valeurs !</p>
<p>Voici le code complet en version longue :</p>
<p class="codepen" data-height="752" data-theme-id="default" data-default-tab="js,result" data-user="pierregiraud" data-slug-hash="jOOjdoM" style="height: 752px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Tuto - Trier un tableau HTML en JavaScript [développé]">
<span>See the Pen <a href="https://codepen.io/pierregiraud/pen/jOOjdoM"><br />
Tuto &#8211; Trier un tableau HTML en JavaScript [développé]</a> by Pierre (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script></p>
<p>Et le voici en version factorisé :</p>
<p class="codepen" data-height="503" data-theme-id="default" data-default-tab="js,result" data-user="pierregiraud" data-slug-hash="rNNEPqw" style="height: 503px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Tuto - Trier un tableau HTML en JavaScript [condensé]">
<span>See the Pen <a href="https://codepen.io/pierregiraud/pen/rNNEPqw"><br />
Tuto &#8211; Trier un tableau HTML en JavaScript [condensé]</a> by Pierre (<a href="https://codepen.io/pierregiraud">@pierregiraud</a>)<br />
on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<p><script async src="https://static.codepen.io/assets/embed/ei.js"></script><br />
</article>
<aside>
<div class="asidep">
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script><br />
<!-- PG v. 2019 --><br />
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8384266137058067"
     data-ad-slot="8226819743"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins><br />
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>
</div>
</aside>
</div>
<p>L’article <a href="https://www.pierre-giraud.com/trier-tableau-javascript/">Tri JavaScript dynamique d&rsquo;un tableau HTML ou d&rsquo;une liste</a> est apparu en premier sur <a href="https://www.pierre-giraud.com">Pierre Giraud</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.pierre-giraud.com/trier-tableau-javascript/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Mise en cache de page à l’aide de Disk: Enhanced 
Chargement différé (feed)
Minified using Disk

Served from: www.pierre-giraud.com @ 2026-06-23 22:20:36 by W3 Total Cache
-->