¿Qué métodos de 'clearfix' puedo utilizar?
Tengo el viejo problema de div
ajustar un diseño de dos columnas. Mi barra lateral flota, por lo que mi contenedor div
no logra ajustar el contenido y la barra lateral.
<div id="container">
<div id="content"></div>
<div id="sidebar"></div>
</div>
Parece que existen numerosos métodos para corregir el error claro en Firefox:
<br clear="all"/>
overflow:auto
overflow:hidden
En mi situación, la única que parece funcionar correctamente es la <br clear="all"/>
solución, que está un poco desaliñada. overflow:auto
me da barras de desplazamiento desagradables y overflow:hidden
seguramente debe tener efectos secundarios. Además, aparentemente IE7 no debería sufrir este problema debido a su comportamiento incorrecto, pero en mi situación sufre lo mismo que Firefox.
¿Qué método actualmente disponible para nosotros es el más sólido?
Dependiendo del diseño que se esté produciendo, cada una de las siguientes soluciones CSS clearfix tiene sus propios beneficios.
El clearfix tiene aplicaciones útiles pero también se ha utilizado como truco. Antes de utilizar un clearfix, quizás estas soluciones CSS modernas puedan resultar útiles:
- caja flexible css
- cuadrícula css
Soluciones Clearfix modernas
Contenedor conoverflow: auto;
La forma más sencilla de borrar elementos flotantes es utilizar el estilo overflow: auto
del elemento contenedor. Esta solución funciona en todos los navegadores modernos.
<div style="overflow: auto;">
<img
style="float: right;"
src="path/to/floated-element.png"
width="500"
height="500"
>
<p>Your content here…</p>
</div>
Una desventaja es que el uso de ciertas combinaciones de margen y relleno en el elemento externo puede hacer que aparezcan barras de desplazamiento, pero esto se puede resolver colocando el margen y el relleno en otro elemento que lo contenga principal.
El uso de 'overflow: oculto' también es una solución clara, pero no tendrá barras de desplazamiento; sin embargo, su uso hidden
recortará cualquier contenido ubicado fuera del elemento contenedor.
Nota: El elemento flotante es una img
etiqueta en este ejemplo, pero podría ser cualquier elemento html.
Clearfix recargado
Thierry Koblentz en CSSMojo escribió: Se recargó el último clearfix . Señaló que al eliminar el soporte para el antiguo IE, la solución se puede simplificar a una declaración CSS. Además, usar display: block
(en lugar de display: table
) permite que los márgenes colapsen correctamente cuando los elementos con clearfix son hermanos.
.container::after {
content: "";
display: block;
clear: both;
}
Esta es la versión más moderna de clearfix.
⋮
⋮
Soluciones Clearfix más antiguas
Las siguientes soluciones no son necesarias para los navegadores modernos, pero pueden resultar útiles para los navegadores más antiguos.
Tenga en cuenta que estas soluciones dependen de errores del navegador y, por lo tanto, deben usarse sólo si ninguna de las soluciones anteriores funciona para usted.
Están enumerados aproximadamente en orden cronológico.
"Beat That ClearFix", un clearfix para navegadores modernos
Thierry Koblentz de CSS Mojo ha señalado que cuando apuntamos a navegadores modernos, ahora podemos eliminar las zoom
propiedades ::before
/valores y y simplemente usar:
.container::after {
content: "";
display: table;
clear: both;
}
Esta solución no es compatible con IE 6/7... ¡a propósito!
Thierry también ofrece: " Una advertencia : si comienzas un nuevo proyecto desde cero, hazlo, pero no cambies esta técnica por la que tienes ahora, porque aunque no soportas el antiguo IE, tus reglas existentes impiden márgenes que se derrumban."
Micro Clearfix
La solución clearfix más reciente y adoptada a nivel mundial, Micro Clearfix de Nicolas Gallagher .
Soporte conocido: Firefox 3.5+, Safari 4+, Chrome, Opera 9+, IE 6+
.container::before, .container::after {
content: "";
display: table;
}
.container::after {
clear: both;
}
.container {
zoom: 1;
}
Propiedad de desbordamiento
Este método básico se prefiere para el caso habitual, cuando el contenido posicionado no se mostrará fuera de los límites del contenedor.
http://www.quirksmode.org/css/clearing.html
: explica cómo resolver problemas comunes relacionados con esta técnica, es decir, la configuración width: 100%
en el contenedor.
.container {
overflow: hidden;
display: inline-block;
display: block;
}
En lugar de usar la display
propiedad para configurar "hasLayout" para IE, se pueden usar otras propiedades para activar "hasLayout" para un elemento .
.container {
overflow: hidden;
zoom: 1;
display: block;
}
Otra forma de borrar los flotantes usando la overflow
propiedad es usar el truco de guión bajo . IE aplicará los valores con el prefijo de guión bajo, otros navegadores no. La zoom
propiedad activa hasLayout en IE:
.container {
overflow: hidden;
_overflow: visible; /* for IE */
_zoom: 1; /* for IE */
}
Si bien esto funciona... no es ideal utilizar trucos.
PIE: Método de limpieza fácil
Este antiguo método de "limpieza fácil" tiene la ventaja de permitir que los elementos posicionados cuelguen fuera de los límites del contenedor, a expensas de un CSS más complicado.
Esta solución es bastante antigua, pero puede aprender todo sobre Easy Clearing en Position Is Everything: http://www.positioniseverything.net/easyclearing.html
Elemento que utiliza la propiedad "clara"
La solución rápida y sucia (con algunos inconvenientes) para cuando estás juntando algo rápidamente:
<br style="clear: both" /> <!-- So dirty! -->
Desventajas
- No responde y, por lo tanto, es posible que no proporcione el efecto deseado si los estilos de diseño cambian según las consultas de medios. Una solución en CSS puro es más ideal.
- Agrega marcado html sin agregar necesariamente ningún valor semántico.
- Requiere una definición y una solución en línea para cada instancia en lugar de una referencia de clase a una solución única de un "clearfix" en el CSS y referencias de clase en el HTML.
- Hace que a otros les resulte difícil trabajar con el código, ya que es posible que tengan que escribir más trucos para solucionarlo.
- En el futuro, cuando necesite o desee utilizar otra solución clearfix, no tendrá que volver atrás y eliminar todas las
<br style="clear: both" />
etiquetas que se encuentran alrededor del marcado.
¿Qué problemas estamos tratando de resolver?
Hay dos consideraciones importantes al hacer flotar cosas:
Que contiene flotadores descendientes. Esto significa que el elemento en cuestión se hace lo suficientemente alto como para envolver a todos los descendientes flotantes. (No se quedan afuera).
Aislar a los descendientes de los flotadores exteriores. Esto significa que los descendientes dentro de un elemento deberían poder usarlo
clear: both
y no interactuar con flotadores fuera del elemento.
Contextos de formato de bloques
Sólo hay una manera de hacer ambas cosas. Y eso es establecer un nuevo contexto de formato de bloque . Los elementos que establecen un contexto de formato de bloque son un rectángulo aislado en el que los flotantes interactúan entre sí. Un contexto de formato de bloque siempre será lo suficientemente alto como para envolver visualmente a sus descendientes flotantes, y ningún elemento flotante fuera de un contexto de formato de bloque puede interactuar con los elementos internos. Este aislamiento bidireccional es exactamente lo que desea. En IE, este mismo concepto se llama hasLayout , que se puede configurar mediante zoom: 1
.
Hay varias formas de establecer un contexto de formato de bloque, pero la solución que recomiendo es display: inline-block
con width: 100%
. (Por supuesto, existen las advertencias habituales sobre el uso de width: 100%
, así que use box-sizing: border-box
o coloque padding
, margin
y border
en un elemento diferente).
La solución más robusta
Probablemente la aplicación más común de los flotadores es el diseño de dos columnas. (Se puede ampliar a tres columnas).
Primero la estructura de marcado.
<div class="container">
<div class="sidebar">
sidebar<br/>sidebar<br/>sidebar
</div>
<div class="main">
<div class="main-content">
main content
<span style="clear: both">
main content that uses <code>clear: both</code>
</span>
</div>
</div>
</div>
Y ahora el CSS.
/* Should contain all floated and non-floated content, so it needs to
* establish a new block formatting context without using overflow: hidden.
*/
.container {
display: inline-block;
width: 100%;
zoom: 1; /* new block formatting context via hasLayout for IE 6/7 */
}
/* Fixed-width floated sidebar. */
.sidebar {
float: left;
width: 160px;
}
/* Needs to make space for the sidebar. */
.main {
margin-left: 160px;
}
/* Establishes a new block formatting context to insulate descendants from
* the floating sidebar. */
.main-content {
display: inline-block;
width: 100%;
zoom: 1; /* new block formatting context via hasLayout for IE 6/7 */
}
Inténtalo tú mismo
Vaya a JS Bin para jugar con el código y ver cómo se construye esta solución desde cero.
Los métodos tradicionales clearfix se consideran perjudiciales
The problem with the traditional clearfix solutions is that they use two different rendering concepts to achieve the same goal for IE and everyone else. In IE they use hasLayout to establish a new block formatting context, but for everyone else they use generated boxes (:after
) with clear: both
, which does not establish a new block formatting context. This means things won't behave the same in all situations. For an explanation of why this is bad, see Everything you Know about Clearfix is Wrong.