CSS Floats

Discover how to use CSS floats for positioning elements and creating text wrap effects, and master how to clear them.

Understanding CSS Floats

The CSS float property was originally designed for image placement within text, allowing text to wrap around an image similar to how images are placed in newspaper layouts. Over time, it was adapted for creating multi-column layouts before the advent of Flexbox and Grid. While Flexbox and Grid are now the preferred methods for most layouts, understanding floats is still important, especially when dealing with older codebases or specific text-wrapping scenarios.

When an element is floated, it's taken out of the normal flow of the document but remains a part of it. Other elements (like text) will then flow around it.

📝 Key Concept

float was designed for text wrapping around elements but became a common, albeit less robust, tool for creating column layouts before modern CSS layout methods.

The float Property

The float property can take one of the following values:

  • none (default): The element does not float.
  • left: The element floats to the left of its container.
  • right: The element floats to the right of its container.
  • inherit: The element inherits the float value from its parent.
/* Example of a floated image */
<div class="text-with-image">
    <img src="image.jpg" alt="Example Image" class="float-right-image">
    <p>This is some paragraph text that will wrap around the floated image. The image is set to float right, so the text will flow to its left, filling the available space.</p>
    <p>More text continues here, demonstrating how content reflows around the floated element within its containing block.</p>
</div>

/* CSS for the floated image */
.float-right-image {
    float: right;
    width: 150px;
    height: 100px;
    margin-left: 20px; /* Space between image and text */
    margin-bottom: 10px;
}
Example: Float Right
Floated Div

This is some paragraph text that demonstrates the effect of floating an element to the right. The text will wrap around the floated div, filling the available space next to it. As you add more text, it will continue to flow around the floated element until it runs out of vertical space within the container or encounters a cleared element. This behavior is useful for magazine-style layouts.

The Problem: Collapsing Parent Containers

One of the most common issues with floats is that they take elements out of the normal document flow. This can cause the parent container of floated elements to "collapse" (its height becomes zero) if it doesn't contain any non-floated content.

/* HTML */
<div class="parent-container">
    <div class="float-element">Floated Item 1</div>
    <div class="float-element">Floated Item 2</div>
    <!-- Parent container will collapse if nothing clears the floats -->
</div>

/* CSS */
.parent-container {
    background-color: #f0f0f0;
    border: 2px solid red; /* Notice the border collapse */
    padding: 10px;
}
.float-element {
    float: left;
    width: 100px;
    height: 50px;
    background-color: var(--primary-color);
    margin: 10px;
    color: white;
    display: flex;
    align-items: center;
    justify-content: center;
}
Example: Collapsing Parent

Observe how the red border of the parent container only encompasses the padding, not the floated children:

Float 1
Float 2

Clearing Floats with clear

To fix the collapsing parent issue or to ensure subsequent content appears below all floated elements, you use the clear property.

  • clear: left;: Breaks past left-floated elements.
  • clear: right;: Breaks past right-floated elements.
  • clear: both;: Breaks past both left and right-floated elements.

Common Clearing Methods:

1. Empty <div> (Least Recommended)

Adding an empty <div> with clear: both; immediately after the floated elements. This is semantically bad as it adds unnecessary HTML.

<div class="parent-container">
    <div class="float-element">...</div>
    <div class="float-element">...</div>
    <div style="clear: both;"></div> <!-- Empty div to clear -->
</div>

2. The Overflow Method

Setting overflow: auto; or overflow: hidden; on the parent container. This creates a new block formatting context (BFC), which naturally contains floats. It's concise but can sometimes hide overflowing content.

.parent-container-cleared {
    background-color: #f0f0f0;
    border: 2px solid green;
    padding: 10px;
    overflow: hidden; /* or auto */
}
Example: Clearing with Overflow

The green border now correctly encompasses the floated items:

Float 1
Float 2

3. The Clearfix Hack (Recommended for older projects)

This method uses the ::after pseudo-element to generate content that has clear: both; applied to it, effectively clearing floats without adding extra HTML.

.clearfix::after {
    content: "";
    display: table; /* or block */
    clear: both;
}

You then apply the .clearfix class to the parent container.

Example: Clearing with Clearfix

The green border now correctly encompasses the floated items using `clearfix`:

Float 1
Float 2