Que fait la règle CSS suivante:
.clear { clear: both; }
Et pourquoi avons-nous besoin de l'utiliser?
Je ne vais pas expliquer comment les flottants fonctionnent ici (en détail), car cette question porte généralement sur Pourquoi utiliser clear: both;
OR qu'est-ce que clear: both;
exactement faire ...
Je vais garder cette réponse simple et précise, et je vous expliquerai graphiquement pourquoi clear: both;
est requis ou ce qu'il fait ...
Généralement, les concepteurs font flotter les éléments, à gauche ou à droite, ce qui crée un espace vide de l’autre côté, ce qui permet aux autres éléments d’occuper l’espace restant.
Les éléments sont flottants lorsque le concepteur a besoin de 2 éléments de niveau bloc côte à côte. Par exemple, disons que nous voulons concevoir un site Web de base avec une présentation comme ci-dessous ...
Exemple en direct de l'image de démonstration.
Code pour la démo
/* CSS: */
* { /* Not related to floats / clear both, used it for demo purpose only */
box-sizing: border-box;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
}
header, footer {
border: 5px solid #000;
height: 100px;
}
aside {
float: left;
width: 30%;
border: 5px solid #000;
height: 300px;
}
section {
float: left;
width: 70%;
border: 5px solid #000;
height: 300px;
}
.clear {
clear: both;
}
<!-- HTML -->
<header>
Header
</header>
<aside>
Aside (Floated Left)
</aside>
<section>
Content (Floated Left, Can Be Floated To Right As Well)
</section>
<!-- Clearing Floating Elements-->
<div class="clear"></div>
<footer>
Footer
</footer>
Remarque: Vous devrez peut-être ajouter header
, footer
, aside
, section
(et d'autres éléments HTML5) en tant que display: block;
dans votre feuille de style pour indiquer explicitement que les éléments sont des éléments de niveau bloc.
J'ai une mise en page de base, 1 en-tête, 1 barre latérale, 1 zone de contenu et 1 pied de page.
Aucun flottant pour header
, vient ensuite la balise aside
que je vais utiliser pour la barre latérale de mon site Web, donc je vais faire flotter l'élément vers la gauche.
Remarque: Par défaut, l'élément de niveau bloc occupe 100% du document, mais lorsqu'il est flottant à gauche ou à droite, il sera redimensionné en fonction du contenu qu'il contient.
Donc, comme vous le constatez, le flottant gauche div
laisse l'espace inutilisé à droite, ce qui permet à la div
de se déplacer dans l'espace restant.
div
'sera rendu l'un après l'autre s'ils ne sont pas flottantsdiv
se déplacera côte à côte si flottant à gauche ou à droiteOk, voici comment se comportent les éléments de niveau bloc lorsqu'ils sont flottants à gauche ou à droite. Pourquoi maintenant clear: both;
est-il requis et pourquoi?
Donc, si vous notez dans la démonstration, si vous avez oublié, ici c'est ..
J'utilise une classe appelée .clear
et elle contient une propriété appelée clear
avec une valeur de both
. Voyons donc pourquoi il a besoin de both
.
J'ai flotté aside
et section
éléments à gauche, supposons donc un scénario où nous avons une piscine, où header
est un terrain solide, aside
et section
flottent dans la piscine et le pied de page est à nouveau solide, quelque chose comme ça.
Ainsi, l'eau bleue n'a aucune idée de la superficie des éléments flottants, ils peuvent être plus grands que la piscine ou plus petits. Voilà donc un problème commun qui concerne 90% des débutants CSS: pourquoi l'arrière-plan d'un élément conteneur n'est pas étendu. quand il contient des éléments flottants. C'est parce que l'élément conteneur est un POOL ici et le POOL n'a aucune idée du nombre d'objets flottants ni de la longueur ou de la largeur des éléments flottants, de sorte que cela ne s'étire tout simplement pas.
(Référer [Clearfix] section de cette réponse pour la manière ordonnée de faire ceci. J'utilise un exemple div
vide volontairement à des fins d'explication)
J'ai fourni 3 exemples ci-dessus, 1er étant le flux de documents normal dans lequel red
background sera simplement rendu comme prévu, car le conteneur ne contient aucun objet flottant.
Dans le deuxième exemple, lorsque l'objet est flotté à gauche, l'élément conteneur (POOL) ne connaît pas les dimensions des éléments flottants et ne s'étend donc pas à la hauteur de ces éléments.
Après avoir utilisé clear: both;
, l'élément conteneur sera étiré aux dimensions de l'élément flottant.
Une autre raison pour laquelle le clear: both;
est utilisé est d'empêcher l'élément de se déplacer vers le haut dans l'espace restant.
Supposons que vous vouliez 2 éléments côte à côte et un autre en dessous ... Vous allez donc laisser 2 éléments à gauche et vous voulez l'autre en dessous.
div
flottant à gauche entraînant section
dans l'espace restantdiv
effacé de sorte que la balise section
apparaisse sous le _ flotté div
sDernier point mais non le moindre, la balise footer
sera rendue après les éléments flottants, comme j’ai utilisé la classe clear
avant de déclarer mes balises footer
, ce qui garantit que tous les éléments flottants (à gauche/right) sont effacés jusqu'à ce point.
Venir à clearfix qui est lié aux flotteurs. Comme déjà spécifié par @ Elky , la façon dont nous effaçons ces flottants n’est pas une méthode simple, car nous utilisons un élément div
vide qui n’est pas un élément div
l'élément est destiné à. D'où voici le clearfix.
Considérez-le comme un élément virtuel qui créera pour vous un élément vide avant la fin de votre élément parent. Cela effacera automatiquement votre élément enveloppant contenant des éléments flottants. Cet élément n'existera pas dans votre DOM, mais fera l'affaire.
Pour effacer tout élément enveloppant ayant des éléments flottants, nous pouvons utiliser
.wrapper_having_floated_elements:after { /* Imaginary class name */
content: "";
clear: both;
display: table;
}
Notez le pseudo-élément :after
utilisé par moi pour ce class
. Cela créera un élément virtuel pour l'élément wrapper juste avant qu'il ne se ferme. Si nous regardons dans le domaine, vous pouvez voir comment il apparaît dans l'arborescence du document.
Donc, si vous voyez, il est rendu après l'enfant flotté div
où nous effaçons les flotteurs, ce qui n'est rien d'autre que l'équivalent d'avoir un élément div
vide avec la propriété clear: both;
que nous utilisons pour cela. aussi. Maintenant, pourquoi display: table;
et content
sont hors de la portée de cette réponse mais vous pouvez en apprendre plus sur pseudo élément ici .
Notez que cela fonctionnera également dans IE8 en tant que IE8 supporte :after
pseudo .
La plupart des développeurs font flotter leur contenu à gauche ou à droite sur leurs pages, probablement avec un logo, une barre latérale, un contenu, etc., ces div sont flottés à gauche ou à droite, laissant le reste de l'espace inutilisé et, par conséquent, si vous placez d'autres conteneurs, flotte aussi dans l'espace restant, donc pour éviter que clear: both;
ne soit utilisé, il efface tous les éléments flottant à gauche ou à droite.
------------------ ----------------------------------
div1(Floated Left) Other div takes up the space here
------------------ ----------------------------------
Maintenant que se passe-t-il si vous voulez que l’autre div rend en-dessous de div1
, vous utiliserez donc clear: both;
pour vous assurer de supprimer tous les flottants, à gauche ou à droite
------------------
div1(Floated Left)
------------------
<div style="clear: both;"><!--This <div> acts as a separator--></div>
----------------------------------
Other div renders here now
----------------------------------
La propriété clear
indique que les côtés gauche, droit ou les deux côtés d'un élément ne peuvent pas être adjacents à des éléments précédemment flottés dans le même contexte de mise en forme de bloc. Les éléments supprimés sont poussés sous les éléments flottants correspondants. Exemples:
clear: none;
L'élément reste adjacent aux éléments flottantsbody {
font-family: monospace;
background: #EEE;
}
.float-left {
float: left;
width: 60px;
height: 60px;
background: #CEF;
}
.float-right {
float: right;
width: 60px;
height: 60px;
background: #CEF;
}
.clear-none {
clear: none;
background: #FFF;
}
<div class="float-left">float: left;</div>
<div class="float-right">float: right;</div>
<div class="clear-none">clear: none;</div>
clear: left;
Elément poussé sous les éléments flottants de gauchebody {
font-family: monospace;
background: #EEE;
}
.float-left {
float: left;
width: 60px;
height: 60px;
background: #CEF;
}
.float-right {
float: right;
width: 60px;
height: 120px;
background: #CEF;
}
.clear-left {
clear: left;
background: #FFF;
}
<div class="float-left">float: left;</div>
<div class="float-right">float: right;</div>
<div class="clear-left">clear: left;</div>
clear: right;
Elément poussé sous les éléments flottants de droitebody {
font-family: monospace;
background: #EEE;
}
.float-left {
float: left;
width: 60px;
height: 120px;
background: #CEF;
}
.float-right {
float: right;
width: 60px;
height: 60px;
background: #CEF;
}
.clear-right {
clear: right;
background: #FFF;
}
<div class="float-left">float: left;</div>
<div class="float-right">float: right;</div>
<div class="clear-right">clear: right;</div>
clear: both;
Elément poussé sous tous les éléments flottantsbody {
font-family: monospace;
background: #EEE;
}
.float-left {
float: left;
width: 60px;
height: 60px;
background: #CEF;
}
.float-right {
float: right;
width: 60px;
height: 60px;
background: #CEF;
}
.clear-both {
clear: both;
background: #FFF;
}
<div class="float-left">float: left;</div>
<div class="float-right">float: right;</div>
<div class="clear-both">clear: both;</div>
clear
n'affecte pas les flottants en dehors du contexte de formatage de bloc actuelbody {
font-family: monospace;
background: #EEE;
}
.float-left {
float: left;
width: 60px;
height: 120px;
background: #CEF;
}
.inline-block {
display: inline-block;
background: #BDF;
}
.inline-block .float-left {
height: 60px;
}
.clear-both {
clear: both;
background: #FFF;
}
<div class="float-left">float: left;</div>
<div class="inline-block">
<div>display: inline-block;</div>
<div class="float-left">float: left;</div>
<div class="clear-both">clear: both;</div>
</div>
Essayez simplement de supprimer la propriété clear:both
de la div
avec class
sample
et voyez comment elle suit la méthode divs
.
La réponse de M. Alien est parfaite, mais de toute façon, je ne recommande pas d'utiliser <div class="clear"></div>
, car c'est juste un hack qui salit votre balisage. Ceci est inutile div
vide en termes de mauvaise structure et sémantique, cela rend également votre code non flexible. Dans certains navigateurs, cette div provoque une hauteur supplémentaire et vous devez ajouter height: 0;
, ce qui est encore pire. Mais les vrais problèmes commencent lorsque vous souhaitez ajouter un arrière-plan ou une bordure autour de vos éléments flottants - cela va simplement s'effondrer car Web a été mal conçu . Je recommande d'encapsuler les éléments flottants dans un conteneur qui a clearfix règle CSS. C'est un hack aussi, mais beau, plus flexible à utiliser et lisible par les robots humains et les robots de référencement.
Lorsque vous voulez placer un élément au bas de l’élément, utilisez ce code en CSS. Il est utilisé pour les flotteurs.
Si vous faites flotter du contenu, vous pouvez flotter à gauche ou à droite ... de sorte que dans une mise en page commune, vous pouvez avoir une navigation à gauche, une div de contenu et un pied de page.
Pour vous assurer que le pied de page reste en dessous de ces deux flotteurs (si vous avez flotté à gauche et à droite), placez le pied de page sous la forme clear: both
.
De cette façon, il restera sous les deux flotteurs.
(Si vous ne faites que supprimer, il ne vous reste plus que clear: left;
.)
Passez par ce tutoriel: