Que fait la règle de la CSS "clair: les deux"?
5 réponses
Je n'expliquerai pas comment fonctionnent les flotteurs ici (en détail), car cette question se concentre généralement sur Pourquoi utiliser clear: both;
ou ce que clear: both;
fait exactement...
je vais garder cette réponse simple et au point, et va vous expliquer graphiquement pourquoi clear: both;
est nécessaire ou ce qu'il fait...
généralement les concepteurs flottent les éléments, à gauche ou à droite, ce qui crée un espace vide sur l'autre côté qui permet à d'autres éléments à prendre le reste de l'espace.
pourquoi font-ils flotter des éléments?
Les élémentssont flottés lorsque le concepteur a besoin de deux éléments de niveau bloc côte à côte. Par exemple, disons que nous voulons concevoir un site Web de base qui a une mise en page comme ci-dessous...
Live Exemple de l'image de démo.
Code De 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>
Note: vous pourriez avoir à ajouter header
, footer
, aside
, section
(et d'autres éléments HTML5) comme display: block;
dans votre feuille de style pour mentionner explicitement que les éléments sont des éléments de niveau bloc.
explication:
j'ai une base mise en page, 1 en-tête, 1 bar, 1 zone de contenu et 1 pied de page.
pas de flotteurs pour header
, vient ensuite l'étiquette aside
que je vais utiliser pour ma barre latérale de site web, donc je vais flotter l'élément à gauche.
Remarque: Par défaut, l'élément de niveau bloc prend du document à 100% de la largeur, mais quand flotté à gauche ou à droite, il se redimensionnera selon le le contenu qu'il détient.
- Comportement Normal De L'Élément De Niveau De Bloc
- Comportement Flottant De L'Élément De Niveau De Bloc
comme vous le constatez, la gauche flottée div
laisse l'espace à sa droite inutilisée, ce qui permettra au div
après lui de se déplacer dans l'espace restant.
-
div
's va rendre l'un après l'autre s'ils ne sont pas floated -
div
se déplacent l'un à côté de l'autre en cas de flottement à gauche ou à droite
Ok, donc c'est comme ça que les éléments de niveau de bloc se comportent quand ils flottent à gauche ou à droite, alors maintenant pourquoi clear: both;
est requis et pourquoi?
donc si vous notez dans la démo de mise en page - dans le cas où vous avez oublié, 1519720920" ici il est..
I suis en utilisant une classe appelée .clear
et il détient 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, donc supposons un scénario, où nous avons une piscine, où header
est une terre solide, aside
et section
flottent dans la piscine et pied de page est une terre solide à nouveau, quelque chose comme ceci..
ainsi l'eau bleue n'a aucune idée de ce que la zone des éléments flottants sont, ils peuvent être plus grand que la piscine ou plus petit, donc voici une question commune qui trouble 90% des débutants CSS: pourquoi l'arrière-plan d'un élément de conteneur n'est pas étiré quand il tient des éléments flottants. C'est parce que l'élément conteneur est un POOL ici et le POOL n'a aucune idée combien d'objets sont flottants, ou ce que le la longueur ou la largeur des éléments flottants sont, de sorte qu'il ne sera tout simplement pas étirer.
- Flux Normal Du Document
- Sections Flottantes À Gauche
- Éléments Flottants Dégagés Pour Étirer La Couleur De Fond Du Conteneur
(Voir [Clearfix] section de cet répondre de façon soignée pour ce faire. J'utilise un div
exemple vide intentionnellement pour l'explication but)
j'ai fourni 3 exemples ci-dessus, le 1er est le flux de document normal où red
arrière-plan juste affichera comme prévu puisque le conteneur ne contient pas d'objets flottants.
dans le deuxième exemple, lorsque l'objet est flotté à gauche, l'élément conteneur (POOL) ne connaîtra pas les dimensions des éléments flottants et donc il ne s'étire pas à la flottait éléments de la hauteur.
après clear: both;
, l'élément du 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 dans l'espace restant.
Dites que vous voulez 2 éléments côte à côte et un autre élément au-dessous d'eux... Donc, vous allez flotter 2 éléments à gauche et vous voulez l'autre en dessous d'eux.
-
div
flotté à gauche résultant ensection
se déplaçant dans l'espace restant - Flotté
div
désactivée afin que lesection
tag rendra en dessous de la flottaitdiv
s
1er exemple
second exemple
enfin et surtout, l'étiquette footer
sera rendue après éléments flottants comme j'ai utilisé la classe clear
avant de déclarer mes étiquettes footer
, ce qui garantit que tous les éléments flottants (gauche/droite) sont dégagés jusqu'à ce point.
Clearfix
venant à clearfix qui est lié aux flotteurs. Comme déjà spécifié par @Elky , la façon dont nous nettoyons ces flotteurs n'est pas une manière propre de le faire car nous utilisons un élément vide div
qui n'est pas un élément div
est destiné. Donc voici le clearfix.
pensez-y comme un élément virtuel qui créera un élément vide pour vous avant la fin de votre élément parent. Ceci effacera automatiquement votre élément enveloppant contenant des éléments flottants. Cet élément n'existera pas dans votre DOM littéralement mais fera le travail.
pour effacer automatiquement tout élément d'enrubannage ayant des éléments flottants, nous pouvons utiliser
.wrapper_having_floated_elements:after { /* Imaginary class name */
content: "";
clear: both;
display: table;
}
Note 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 le dom vous pouvez voir comment il apparaît dans l'arborescence des documents.
donc, si vous voyez, il est rendu après l'enfant flotté div
où nous dégageons les flotteurs qui n'est rien d'autre que l'équivalent d'avoir un élément vide div
avec clear: both;
propriété que nous utilisons pour cela aussi. Maintenant, pourquoi display: table;
et content
de réponses portée, mais vous pouvez en savoir plus à propos de pseudo element ici .
notez que cela fonctionnera aussi dans IE8 comme IE8 supporte :after
pseudo .
Réponse Originale:
la plupart des développeurs font flotter leur contenu à gauche ou à droite sur leurs pages, probablement des divs avec logo, sidebar, content etc., ces divs sont flottés à gauche ou à droite, laissant le reste de l'espace non utilisé et par conséquent, si vous placez d'autres conteneurs, il flottera aussi dans l'espace restant, afin d'éviter que clear: both;
soit utilisé, il efface tous les éléments flottés à gauche ou à droite.
démonstration:
------------------ ----------------------------------
div1(Floated Left) Other div takes up the space here
------------------ ----------------------------------
maintenant que faire si vous voulez faire l'autre div rendre ci-dessous div1
, donc vous allez utiliser clear: both;
afin de vous assurer de nettoyer tous les flotteurs, gauche ou droite
------------------
div1(Floated Left)
------------------
<div style="clear: both;"><!--This <div> acts as a separator--></div>
----------------------------------
Other div renders here now
----------------------------------
le clear
la propriété indique que la gauche, la droite ou les deux côtés d'un élément ne peuvent pas être adjacents à des éléments flottants antérieurs dans le même contexte de formatage de bloc. Les éléments dégagés sont poussés sous les éléments flottants correspondants. Exemples:
clear: none;
Élément est adjacent à flottait éléments
body {
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;
Élément poussé à gauche ci-dessous flottait éléments
body {
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;
Élément poussé à droite ci-dessous flottait éléments
body {
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;
Élément poussé ci-dessous toutes les flottait éléments
body {
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 flotteurs en dehors du contexte de formatage de bloc actuel
body {
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>
il suffit d'essayer de supprimer clear:both
propriété de la div
avec class
sample
et voir comment il suit flottant divs
.
la réponse de M. Alien est parfaite, mais de toute façon je ne recommande pas d'utiliser <div class="clear"></div>
parce que c'est juste un piratage qui rend votre markup sale. C'est inutile vide div
en termes de mauvaise structure et sémantique, cela rend également votre code non flexible. Dans certains navigateurs cette div provoque hauteur supplémentaire et vous devez ajouter height: 0;
qui encore pire. Mais les vrais problèmes commencent quand vous voulez ajouter l'arrière-plan ou la bordure autour de vos éléments flottants - il s'effondrera juste parce que web a été mal conçu . Je recommande d'envelopper les éléments flottants dans un contenant qui a la règle clearfix CSS. C'est du piratage aussi, mais beau, plus souple à utiliser et lisible pour les robots humains et SEO.
lorsque vous voulez qu'un élément soit placé au bas de l'autre élément, vous utilisez ce code dans CSS. Il est utilisé pour des flotteurs.
si vous flottez contenu, Vous pouvez flotter à gauche ou à droite... ainsi, dans une mise en page commune, vous pouvez avoir un nav gauche, une div de contenu et un pied de page.
pour vous assurer que le pied de page reste au-dessous de ces deux flotteurs (si vous avez flotté à gauche et à droite), vous mettez le pied de page comme clear: both
.
de cette façon, il restera en dessous les deux flotteurs.
(si vous êtes seulement le dégagement à gauche, alors vous avez seulement vraiment besoin de clear: left;
.)
passer par ce tutoriel: