¿Por qué no aumenta la altura de un elemento contenedor si contiene elementos flotantes?
Me gustaría preguntar cómo funcionan la altura y la flotación. Tengo un div externo y un div interno que tiene contenido. Su altura puede variar dependiendo del contenido del div interno pero parece que mi div interno desbordará su div externo. ¿Cuál sería la forma correcta de hacerlo?
<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>
Los elementos flotantes no aumentan la altura del elemento contenedor y, por lo tanto, si no los borra, la altura del contenedor no aumentará...
Te lo mostraré visualmente:
Más explicación:
<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>
También puedes agregar overflow: hidden;
elementos de contenedor, pero te sugiero que los uses clear: both;
en su lugar.
Además, si desea borrar automáticamente un elemento, puede utilizar
.self_clear:after {
content: "";
clear: both;
display: table;
}
¿Cómo funciona CSS flotante?
¿Qué es exactamente flotar y para qué sirve?
La mayoría de los principiantes no comprenden bien esta
float
propiedad. Bueno, ¿qué hace exactamentefloat
? Inicialmente, lafloat
propiedad se introdujo para hacer fluir texto alrededor de imágenes, que son flotantesleft
oright
. Aquí hay otra explicación de @Madara Uchicha.Entonces, ¿es incorrecto utilizar la
float
propiedad para colocar cajas una al lado de la otra? La respuesta es no ; no hay problema si usa lafloat
propiedad para configurar cuadros uno al lado del otro.Hacer flotar un elemento de nivel
Manifestacióninline
oblock
hará que el elemento se comporte como uninline-block
elemento.Si flota un elemento
left
oright
, elwidth
valor del elemento se limitará al contenido que contiene, a menos quewidth
esté definido explícitamente...No puedes
float
un elementocenter
. Este es el mayor problema que siempre he visto con los principiantes al usar, que no es un valor válido para lafloat: center;
float
propiedad.float
generalmente se usa parafloat
mover contenido hacia la izquierda o hacia la derecha . Sólo hay cuatro valores válidos parafloat
la propiedadleft
, es decirright
,none
(predeterminado) yinherit
.El elemento principal colapsa cuando contiene elementos secundarios flotantes; para evitar esto, usamos
clear: both;
la propiedad para borrar los elementos flotantes en ambos lados, lo que evitará el colapso del elemento principal. Para obtener más información, puede consultar mi otra respuesta aquí .(Importante) Piénselo donde tenemos una pila de varios elementos. Cuando usamos
float: left;
ofloat: right;
el elemento se mueve uno por encima de la pila. Por lo tanto, los elementos en el flujo normal de documentos se esconderán detrás de los elementos flotantes porque están en el nivel de la pila por encima de los elementos flotantes normales. (Por favor, no relacione esto yaz-index
que es completamente diferente).
Tomando un caso como ejemplo para explicar cómo funcionan los elementos flotantes CSS, suponiendo que necesitamos un diseño simple de 2 columnas con un encabezado, pie de página y 2 columnas, así es como se ve el plano...
En el ejemplo anterior, flotaremos solo los cuadros rojos, ya sea que pueda float
ir a left
, o puede float
ir a left
, y otro right
también, depende del diseño, si son 3 columnas, puede colocar float
2 columnas left
donde otra uno right
depende, aunque en este ejemplo tenemos un diseño simplificado de 2 columnas, por lo que float
uno depende left
y el otro depende right
.
El marcado y los estilos para crear el diseño se explican más abajo...
<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;
}
Vayamos paso a paso con el diseño y veamos cómo funciona el flotador.
En primer lugar, usamos el elemento contenedor principal, puede asumir que es su ventana gráfica, luego usamos header
y asignamos un elemento height
de 50px
modo que no hay nada especial allí. Es solo un elemento normal a nivel de bloque no flotante que ocupará 100%
espacio horizontal a menos que esté flotante o se inline-block
lo asignemos.
El primer valor válido para float
es left
so, en nuestro ejemplo usamos float: left;
for .floated_left
, por lo que pretendemos hacer flotar un bloque en left
nuestro elemento contenedor.
La columna flotó hacia la izquierda
Y sí, si ves que el elemento principal, que está .wrapper
colapsado, el que ves con un borde verde no se expandió, pero debería hacerlo, ¿verdad? Volveremos a eso en un momento, por ahora, tenemos una columna flotando en left
.
Llegando a la segunda columna, dejémosla float
a laright
Otra columna flotó hacia la derecha.
Aquí, tenemos una 300px
columna ancha a la que vamos float
, right
que se ubicará al lado de la primera columna mientras flota hacia left
, y como flotó hacia left
, creó un canal vacío para right
, y como había mucho espacio en right
, nuestro right
El elemento flotante estaba perfectamente al lado del left
otro.
Aún así, el elemento principal está colapsado, bueno, arreglémoslo ahora. Hay muchas formas de evitar que el elemento principal colapse.
- Agregue un elemento de nivel de bloque vacío y utilícelo
clear: both;
antes de que finalice el elemento principal, que contiene elementos flotantes. Esta es una solución económica paraclear
sus elementos flotantes que hará el trabajo por usted, pero recomendaría no usarlo.
Agrega, <div style="clear: both;"></div>
antes de los .wrapper
div
extremos, como
<div class="wrapper clear">
<!-- Floated columns -->
<div style="clear: both;"></div>
</div>
Manifestación
Bueno, eso se soluciona muy bien, ya no hay padres colapsados, pero agrega marcas innecesarias al DOM, por lo que algunos sugieren usarlo overflow: hidden;
en el elemento padre que contiene elementos secundarios flotantes que funcionan según lo previsto.
Usar overflow: hidden;
en.wrapper
.wrapper {
border: 3px solid green;
overflow: hidden;
}
Manifestación
Eso nos ahorra un elemento cada vez que lo necesitamos, clear
float
pero como probé varios casos con esto, falló en uno en particular, que se usa box-shadow
en los elementos secundarios.
Demostración (No puedo ver la sombra en los 4 lados,overflow: hidden;
causa este problema)
¿Y ahora qué? Guarde un elemento, no, overflow: hidden;
así que busque una solución clara, use el siguiente fragmento en su CSS y, tal como lo usa overflow: hidden;
para el elemento principal, llame a lo class
siguiente en el elemento principal para borrarlo automáticamente.
.clear:after {
clear: both;
content: "";
display: table;
}
<div class="wrapper clear">
<!-- Floated Elements -->
</div>
Manifestación
Aquí, la sombra funciona según lo previsto y además borra automáticamente el elemento principal, lo que evita que se colapse.
Y por último, usamos el pie de página después de clear
los elementos flotantes.
Manifestación
¿Cuándo se float: none;
usa de todos modos, ya que es el valor predeterminado, entonces, hay algún uso para declarar float: none;
?
Bueno, depende, si buscas un diseño responsivo, usarás este valor muchas veces cuando quieras que tus elementos flotantes se representen uno debajo del otro a una resolución determinada. Porque la float: none;
propiedad juega allí un papel importante.
Pocos ejemplos del mundo real de cómo float
es útil.
- El primer ejemplo que ya vimos es crear uno o más diseños de columnas.
- Usar
img
un interior flotantep
que permitirá que nuestro contenido fluya.
Demostración (sin flotarimg
)
Demostración 2 (img
flotó hacia elleft
)
- Uso
float
para crear un menú horizontal - Demostración
Flota el segundo elemento también, o usa "margen"
Por último, pero no menos importante, quiero explicar este caso particular en el que float
solo se utiliza un elemento para el otro, left
pero no float
el otro, entonces, ¿qué sucede?
Supongamos que si lo eliminamos float: right;
de nuestro .floated_right
class
, se div
representará desde el extremo left
ya que no flota.
Manifestación
Entonces, en este caso, también puedes float
hacerloleft
O
Puede utilizar margin-left
el cual será igual al tamaño de la columna flotante izquierda, es decir, 200px
ancho .
Debe agregarlo overflow:auto
a su div principal para que abarque el div flotante interno:
<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>
Ejemplo de jsFiddle
Te encuentras con el error flotante (aunque no estoy seguro de si técnicamente es un error debido a la cantidad de navegadores que exhiben este comportamiento). Esto es lo que está pasando:
En circunstancias normales, suponiendo que no se haya establecido una altura explícita, un elemento a nivel de bloque, como un div, establecerá su altura en función de su contenido. La parte inferior del div principal se extenderá más allá del último elemento. Desafortunadamente, hacer flotar un elemento impide que el padre tenga en cuenta el elemento flotante al determinar su altura. Esto significa que si su último elemento flota, no "estirará" al padre de la misma manera que lo haría un elemento normal.
Claro
Hay dos formas comunes de solucionar este problema. La primera es agregar un elemento de "limpieza"; es decir, otro elemento debajo del flotante que obligará al padre a estirarse. Entonces agregue el siguiente html como último hijo:
<div style="clear:both"></div>
No debería ser visible y, al usar clear:both, te aseguras de que no se ubicará al lado del elemento flotante, sino después de él.
Desbordamiento:
El segundo método, que prefiere la mayoría de la gente (creo) es cambiar el CSS del elemento principal para que el desbordamiento sea todo menos "visible". Por lo tanto, establecer el desbordamiento en "oculto" obligará al padre a extenderse más allá de la parte inferior del hijo flotante. Por supuesto, esto solo es cierto si no ha establecido una altura en el padre.
Como dije, se prefiere el segundo método ya que no requiere que agregues elementos semánticamente sin sentido a tu marcado, pero hay ocasiones en las que necesitas que overflow
sea visible, en cuyo caso agregar un elemento de limpieza es más que aceptable. .
Es por la flotación del div. Agregue overflow: hidden
el elemento exterior.
<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>
Manifestación
Confundes cómo los navegadores representan los elementos cuando hay elementos flotantes. Si un elemento de bloque está flotante (su div interno en su caso), otros elementos de bloque lo ignorarán porque el navegador elimina los elementos flotantes del flujo normal de la página web. Luego, debido a que el div flotante se eliminó del flujo normal, el div externo se completa, como si el div interno no estuviera allí. Sin embargo, los elementos en línea (imágenes, enlaces, texto, comillas negras) respetarán los límites del elemento flotante. Si introduce texto en el div exterior, el texto se colocará alrededor del div interior.
En otras palabras, los elementos de bloque (encabezados, párrafos, divs, etc.) ignoran los elementos flotantes y los completan, y los elementos en línea (imágenes, enlaces, texto, etc.) respetan los límites de los elementos flotantes.
Un ejemplo de violín aquí
<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>