twitter bootstrap - w3schools - Comprender la clase clearfix de Bootstrap
html clearfix class (3)
.clearfix {
*zoom: 1;
&:before,
&:after {
display: table;
content: "";
// Fixes Opera/contenteditable bug:
// http://nicolasgallagher.com/micro-clearfix-hack/#comment-36952
line-height: 0;
}
&:after {
clear: both;
}
}
- ¿Por qué no usar
display:block
? - Además, ¿por qué también se aplica al
::before
pseudoclass?
Cuando se utiliza un clearfix en un contenedor principal, se envuelve automáticamente alrededor de todos los elementos secundarios.
Generalmente se usa después de elementos flotantes para despejar el diseño de flotación.
Cuando se utiliza el diseño flotante, alineará horizontalmente los elementos secundarios. Clearfix borra este comportamiento.
Ejemplo - Paneles Bootstrap
En bootstrap, cuando se utiliza el panel de clase, hay 3 tipos de elementos secundarios: panel-encabezado, panel-cuerpo, panel-pie de página. Todos los cuales tienen pantalla: diseño de bloque, pero panel-body tiene un clearfix pre-aplicado. panel-body es un tipo de contenedor principal, mientras que panel-header & panel-footer no está destinado a ser un contenedor, solo tiene la intención de contener texto básico.
Si se agregan elementos flotantes, el contenedor primario no se envuelve alrededor de esos elementos porque el contenedor primario no hereda la altura de los elementos flotantes.
Por lo tanto, para panel-header y panel-pie de página, se necesita clearfix para borrar el diseño flotante de los elementos: la clase Clearfix da una apariencia visual de que la altura del contenedor principal se ha aumentado para acomodar todos sus elementos secundarios.
<div class="container">
<div class="panel panel-default">
<div class="panel-footer">
<div class="col-xs-6">
<input type="button" class="btn btn-primary" value="Button1">
<input type="button" class="btn btn-primary" value="Button2">
<input type="button" class="btn btn-primary" value="Button3">
</div>
</div>
</div>
<div class="panel panel-default">
<div class="panel-footer">
<div class="col-xs-6">
<input type="button" class="btn btn-primary" value="Button1">
<input type="button" class="btn btn-primary" value="Button2">
<input type="button" class="btn btn-primary" value="Button3">
</div>
<div class="clearfix"/>
</div>
</div>
</div>
El elemento :before
pseudo no es necesario para el propio clearfix .
Es solo una característica adicional que ayuda a evitar el colapso de márgenes del primer elemento secundario. Por lo tanto, se garantiza que el margen superior de un elemento de bloque secundario del elemento "clearfixed" se colocará debajo del borde superior del elemento clearfixed.
display:table
se está utilizando porque display:block
no funciona. Usando la display:block
márgenes del display:block
colapsarán incluso con un elemento :before
.
Hay una advertencia: si vertical-align:baseline
se usa en celdas de tabla con elementos clearfixed <div>
, Firefox no se alineará bien. Entonces quizás prefiera usar la display:block
pesar de perder la característica de contra-colapso. En caso de mayor interés, lea este artículo: Clearfix interfiere con la alineación vertical .
.clearfix
se define en less/mixins.less
. Justo encima de su definición hay un comentario con un enlace a este artículo:
Un nuevo truco de micro clearfix
El artículo explica cómo funciona todo.
ACTUALIZACIÓN: Sí, las respuestas solo de enlace son malas. Sabía esto incluso en el momento en que publiqué esta respuesta, pero no tenía ganas de copiar y pegar estaba bien debido a derechos de autor, plagio y lo que es tuyo. Sin embargo, ahora siento que está bien, ya que me he vinculado al artículo original. Sin embargo, también debería mencionar el nombre del autor para obtener crédito: Nicolas Gallagher. Aquí está la esencia del artículo (nótese que el "método de Thierry" se refiere al "clearfix reloaded" de Thierry Koblentz ):
Este "micro clearfix" genera pseudo-elementos y establece su
display
en latable
. Esto crea una celda de tabla anónima y un nuevo contexto de formato de bloque que significa que:before
pseudo-elemento impide el colapso del margen superior. El pseudo-elemento:after
se usa para borrar los flotadores. Como resultado, no hay necesidad de ocultar el contenido generado y se reduce la cantidad total de código necesario.Incluir el selector
:before
no es necesario para borrar los flotantes, pero evita que los márgenes superiores colapsen en los navegadores modernos. Esto tiene dos beneficios:
Garantiza la coherencia visual con otras técnicas de contención de flotación que crean un nuevo contexto de formato de bloque, por ejemplo,
overflow:hidden
Garantiza la coherencia visual con IE 6/7 cuando se aplica
zoom:1
.NB : Hay circunstancias en las que IE 6/7 no contendrá los márgenes inferiores de flotantes dentro de un nuevo contexto de formato de bloque. Más detalles se pueden encontrar aquí: Mejor contención de flotación en IE usando expresiones CSS .
El uso de
content:" "
(tenga en cuenta el espacio en la cadena de contenido) evita un error de Opera que crea espacio alrededor de elementos clearfixed si el atributocontenteditable
también está presente en algún lugar del HTML. Gracias a Sergio Cerrutti por detectar esta solución. Una solución alternativa es usarfont:0/0 a
.Legacy Firefox
Firefox <3.5 se beneficiará del uso del método de Thierry con la adición de
visibility:hidden
para ocultar el carácter insertado. Esto se debe a que las versiones heredadas de Firefox necesitancontent:"."
para evitar que aparezca espacio extra entre elbody
y su primer elemento secundario, en determinadas circunstancias (por ejemplo, jsfiddle.net/necolas/K538S/ ).Los métodos alternativos de contención de flotación que crean un nuevo contexto de formato de bloques, como aplicar
overflow:hidden
odisplay:inline-block
al elemento contenedor, también evitarán este comportamiento en las versiones heredadas de Firefox.