Je voudrais demander comment la hauteur et le travail de flotteur. J'ai une div externe et une div interne qui a un contenu en elle. Sa hauteur peut varier en fonction du contenu de la div interne, mais il semble que ma div interne débordera de sa div externe. Quelle serait la bonne façon de le faire?
<html>
<body>
<div style="margin:0 auto;width: 960px; min-height: 100px; background-color:orange">
<div style="width:500px; height:200px; background-color:black; float:right"></div>
</div>
</body>
</html>
Les éléments flottants ne s'ajoutent pas à la hauteur de l'élément conteneur. Par conséquent, si vous ne les supprimez pas, la hauteur du conteneur n'augmentera pas ...
Je vais vous montrer visuellement:
Plus d'explication:
<div>
<div style="float: left;"></div>
<div style="width: 15px;"></div> <!-- This will shift
besides the top div. Why? Because of the top div
is floated left, making the
rest of the space blank -->
<div style="clear: both;"></div>
<!-- Now in order to prevent the next div from floating beside the top ones,
we use `clear: both;`. This is like a wall, so now none of the div's
will be floated after this point. The container height will now also include the
height of these floated divs -->
<div></div>
</div>
Vous pouvez également ajouter overflow: hidden;
sur les éléments de conteneur, mais je vous conseillerais plutôt d'utiliser clear: both;
.
Aussi, si vous souhaitez effacer vous-même un élément, vous pouvez utiliser
.self_clear:after {
content: "";
clear: both;
display: table;
}
La propriété float
est mal comprise par la plupart des débutants. Bien, que fait exactement float
? Initialement, la propriété float
a été introduite pour faire passer du texte autour des images, qui sont flottantes left
ou right
. Voici une autre explication par @Madara Uchicha.
Alors, est-il erroné d'utiliser la propriété float
pour placer des boîtes côte à côte? La réponse est no ; il n'y a pas de problème si vous utilisez la propriété float
afin de définir des cases côte à côte.
Flotter un élément de niveau inline
ou block
fera en sorte que cet élément se comporte comme un élément inline-block
.
Si vous faites flotter un élément left
ou right
, la width
de l'élément sera limitée au contenu qu'il contient, à moins que width
ne soit défini explicitement ...
Vous ne pouvez pas float
un élément center
. C’est le plus gros problème que j’ai toujours vu avec les débutants, en utilisant , qui n'est pas une valeur valide pour la propriété float: center;
float
. float
est généralement utilisé pour float
/déplacer le contenu à l'extrême gauche ou à l'extrême droite . Il n'y a que quatre valeurs valides pour la propriété float
, à savoir left
, right
, none
(valeur par défaut) et inherit
.
L'élément parent se réduit, lorsqu'il contient des éléments enfants flottés, afin d'éviter cela, nous utilisons la propriété clear: both;
, pour effacer les éléments flottants des deux côtés, ce qui empêchera la réduction de l'élément parent. Pour plus d'informations, vous pouvez vous référer ma autre réponse ici .
(Important) Pensez-y lorsque nous avons une pile de divers éléments. Lorsque nous utilisons float: left;
ou float: right;
, l'élément se déplace au-dessus de la pile. Par conséquent, les éléments du flux de documents normal se cachent derrière les éléments flottants car ils se trouvent au niveau de la pile au-dessus des éléments flottants normaux. (Veuillez ne pas associer ceci à z-index
car c'est complètement différent.)
En prenant un exemple comme exemple pour expliquer le fonctionnement des flottants CSS, en supposant que nous ayons besoin d’une mise en page simple à 2 colonnes avec un en-tête, un pied de page et 2 colonnes, voici à quoi ressemble le plan détaillé ...
Dans l'exemple ci-dessus, nous ne ferons flotter que les cases rouges, soit vous pouvez float
les deux en left
, soit vous pouvez float
sur left
, et un autre pour right
dépend également de la disposition. S'il s'agit de 3 colonnes, vous pouvez float
2 colonnes à left
où un autre à la right
dépend donc, mais dans cet exemple , nous avons une disposition simplifiée sur 2 colonnes, donc float
l’un sur left
et l’autre sur le right
.
Les balises et les styles pour créer la mise en page sont expliqués plus bas ...
<div class="main_wrap">
<header>Header</header>
<div class="wrapper clear">
<div class="floated_left">
This<br />
is<br />
just<br />
a<br />
left<br />
floated<br />
column<br />
</div>
<div class="floated_right">
This<br />
is<br />
just<br />
a<br />
right<br />
floated<br />
column<br />
</div>
</div>
<footer>Footer</footer>
</div>
* {
-moz-box-sizing: border-box; /* Just for demo purpose */
-webkkit-box-sizing: border-box; /* Just for demo purpose */
box-sizing: border-box; /* Just for demo purpose */
margin: 0;
padding: 0;
}
.main_wrap {
margin: 20px;
border: 3px solid black;
width: 520px;
}
header, footer {
height: 50px;
border: 3px solid silver;
text-align: center;
line-height: 50px;
}
.wrapper {
border: 3px solid green;
}
.floated_left {
float: left;
width: 200px;
border: 3px solid red;
}
.floated_right {
float: right;
width: 300px;
border: 3px solid red;
}
.clear:after {
clear: both;
content: "";
display: table;
}
Allons pas à pas avec la mise en page et voyons comment fonctionne float.
Tout d’abord, nous utilisons l’élément wrapper principal, vous pouvez simplement supposer que c’est votre fenêtre, puis nous utilisons header
et nous affectons une height
à 50px
pour qu’il n’y ait rien de fantastique. Il s'agit simplement d'un élément de niveau de bloc non flotté normal qui occupera 100%
espace horizontal à moins qu'il ne soit flottant ou que nous lui affections inline-block
.
La première valeur valide pour float
est left
, donc dans notre exemple, nous utilisons float: left;
pour .floated_left
, nous avons donc l'intention de faire flotter un bloc dans le left
de notre élément de conteneur.
Et oui, si vous voyez, l’élément parent, qui est .wrapper
est réduit, celui que vous voyez avec une bordure verte ne s’est pas développé, mais il devrait être correct? J'y reviendrai dans un moment, pour l'instant, nous avons une colonne flottante dans left
.
En venant à la deuxième colonne, permet _ float
celui-ci à la right
ne autre colonne flotte à droite
Ici, nous avons une colonne 300px
large qui nous float
à la right
, qui sera placée à côté de la première colonne comme elle flotte dans la left
, et comme elle est flottante à le left
, il a créé une gouttière vide sur le right
, et comme il y avait beaucoup d'espace sur le right
, notre élément flottant right
était parfaitement à côté du left
un.
Néanmoins, l’élément parent est réduit, eh bien, réglons le problème maintenant. Il existe de nombreuses façons d'éviter que l'élément parent ne soit réduit.
clear: both;
avant la fin de l'élément parent, qui contient les éléments flottants. Désormais, celui-ci est une solution peu coûteuse pour clear
vos éléments flottants qui feront le travail à votre place. recommanderais de ne pas utiliser cela.Ajouter, <div style="clear: both;"></div>
avant le .wrapper
div
se termine, comme
<div class="wrapper clear">
<!-- Floated columns -->
<div style="clear: both;"></div>
</div>
Eh bien, cela corrige très bien, plus aucun parent réduit, mais cela ajoute des balises inutiles au DOM, alors certains suggèrent d’utiliser overflow: hidden;
sur l’élément parent contenant des éléments enfants flottants qui fonctionnent comme prévu.
Utilisez overflow: hidden;
sur .wrapper
.wrapper {
border: 3px solid green;
overflow: hidden;
}
Cela nous évite un élément à chaque fois que nous devons clear
float
, mais comme j'ai testé différents cas avec cela, cela a échoué dans un cas particulier, qui utilise box-shadow
sur les éléments enfants.
Démo (L'ombre ne peut pas être vue des 4 côtés, overflow: hidden;
est la cause de ce problème)
Alors quoi maintenant? Sauvez un élément, pas de overflow: hidden;
alors optez pour un hack clair, utilisez l'extrait de code ci-dessous dans votre CSS, et comme vous utilisez overflow: hidden;
pour l'élément parent, appelez le class
ci-dessous le l'élément parent à auto-effacer.
.clear:after {
clear: both;
content: "";
display: table;
}
<div class="wrapper clear">
<!-- Floated Elements -->
</div>
Ici, shadow fonctionne comme prévu. Il efface également l'élément parent, ce qui empêche toute réduction.
Enfin, nous utilisons le pied de page après clear
les éléments flottants.
Quand est-ce que float: none;
est utilisé de toute façon, comme c'est le cas par défaut, donc toute utilisation pour déclarer float: none;
?
Cela dépend bien, si vous optez pour un design réactif, vous utiliserez cette valeur plusieurs fois, lorsque vous souhaitez que les éléments flottants s'affichent l'un en dessous de l'autre à une certaine résolution. Pour cela, la propriété float: none;
joue ici un rôle important.
Quelques exemples concrets de l'utilité de float
.
img
flottait à l'intérieur de p
, ce qui permettrait à notre contenu de circuler librement. Démo (Sans flottant img
)
Démo 2 (img
flotté vers le left
)
float
pour créer un menu horizontal - Demo Dernier point mais non le moindre, je veux expliquer ce cas particulier dans lequel vous float
seul élément parmi les left
mais vous ne _ float
pas l’autre, que se passe-t-il?
Supposons que si nous retirons float: right;
de notre .floated_right
class
, la div
sera rendue à partir de l'extrême left
car elle n'est pas flottante.
Donc dans ce cas, soit vous pouvez float
le à la left
également
OR
Vous pouvez tilisez margin-left
qui sera égal à la taille de la colonne flottante de gauche, à savoir 200px
wide .
Vous devez ajouter overflow:auto
à votre div parent pour que celui-ci englobe le div interne flottant:
<div style="margin:0 auto;width: 960px; min-height: 100px; background-color:orange;overflow:auto">
<div style="width:500px; height:200px; background-color:black; float:right">
</div>
</div>
Vous rencontrez le bogue float (bien que je ne sois pas sûr que ce soit techniquement un bogue en raison du nombre de navigateurs présentant ce comportement). Voici ce qui se passe:
Dans des circonstances normales, en supposant qu'aucune hauteur explicite n'ait été définie, un élément de niveau bloc tel qu'un div définira sa hauteur en fonction de son contenu. Le bas de la division parent s'étendra au-delà du dernier élément. Malheureusement, la flottaison d'un élément empêche le parent de prendre en compte l'élément flottant pour déterminer sa hauteur. Cela signifie que si votre dernier élément est flottant, il ne "tendra" pas le parent de la même manière qu'un élément normal.
effacement
Il existe deux manières courantes de résoudre ce problème. La première consiste à ajouter un élément "clearing"; c’est-à-dire qu’un autre élément situé en dessous de celui qui est flotté obligera le parent à s’étirer. Ajoutez donc le code HTML suivant comme dernier enfant:
<div style="clear:both"></div>
Il ne devrait pas être visible, et en utilisant clear: les deux, vous vous assurez qu'il ne sera pas placé à côté de l'élément flottant, mais après.
Débordement:
La deuxième méthode, qui est préférée par la plupart des gens (je pense) consiste à changer le code CSS de l'élément parent afin que le débordement soit tout sauf "visible". Donc, définir le débordement sur "masqué" obligera le parent à s'étirer au-delà du bas de l'enfant flottant. Ceci n'est vrai que si vous n'avez pas défini de hauteur sur le parent, bien sûr.
Comme je l'ai dit, la deuxième méthode est préférable car elle ne vous oblige pas à ajouter des éléments sémantiquement dénués de sens à votre balise, mais vous avez parfois besoin que le overflow
soit visible, auquel cas l'ajout d'une compensation. L'élément est plus qu'acceptable.
C'est à cause du flotteur de la div. Ajoutez overflow: hidden
sur l'élément extérieur.
<div style="overflow:hidden; margin:0 auto;width: 960px; min-height: 100px; background-color:orange;">
<div style="width:500px; height:200px; background-color:black; float:right">
</div>
</div>
Vous confondez la façon dont les navigateurs rendent les éléments lorsqu'il y a des éléments flottants. Si un élément de bloc est flottant (votre division interne dans votre cas), les autres éléments l'ignoreront car le navigateur supprime les éléments flottants du flux normal de la page Web. Ensuite, comme la division flottante a été retirée du flux normal, la division extérieure est remplie, de sorte que la division interne n’est pas présente. Cependant, les éléments en ligne (images, liens, texte, guillemets noirs) respecteront les limites de l'élément flottant. Si vous introduisez du texte dans le div extérieur, le texte placera arround de inner div.
En d'autres termes, les éléments de bloc (en-têtes, paragraphes, divs, etc.) ignorent les éléments flottants et les remplissent, tandis que les éléments incorporés (images, liens, texte, etc.) respectent les limites des éléments flottants.
<body>
<div style="float:right; background-color:blue;width:200px;min-height:400px;margin-right:20px">
floating element
</div>
<h1 style="background-color:red;"> this is a big header</h1>
<p style="background-color:green"> this is a parragraph with text and a big image. The text places arrounds the floating element. Because of the image is wider than space between paragrah and floating element places down the floating element. Try to make wider the viewport and see what happens :D
<img src="http://2.bp.blogspot.com/_nKxzQGcCLtQ/TBYPAJ6xM4I/AAAAAAAAAC8/lG6XemOXosU/s1600/css.png">
</p>
Essaye celui-là
.parent_div{
display: flex;
}
vous pouvez utiliser la propriété overflow de la div de conteneur si vous n'avez aucune div à afficher sur le conteneur, par exemple:
<div class="cointainer">
<div class="one">Content One</div>
<div class="two">Content Two</div>
</div>
Voici le css suivant:
.container{
width:100%;/* As per your requirment */
height:auto;
float:left;
overflow:hidden;
}
.one{
width:200px;/* As per your requirment */
height:auto;
float:left;
}
.two{
width:200px;/* As per your requirment */
height:auto;
float:left;
}
-----------------------OU-------------------------- ----
<div class="cointainer">
<div class="one">Content One</div>
<div class="two">Content Two</div>
<div class="clearfix"></div>
</div>
Voici le css suivant:
.container{
width:100%;/* As per your requirment */
height:auto;
float:left;
overflow:hidden;
}
.one{
width:200px;/* As per your requirment */
height:auto;
float:left;
}
.two{
width:200px;/* As per your requirment */
height:auto;
float:left;
}
.clearfix:before,
.clearfix:after{
display: table;
content: " ";
}
.clearfix:after{
clear: both;
}