Non-floated elements only accept the height of their non-floating child or content.
Examples
Situation 1: Non-swimming parent and non-swimming child. The parent will take the entire height of its child.
div{ border:1px solid; }
<div class="parent"> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Blanditiis magnam, soluta nihil libero sapiente, ullam omnis ipsa adipisci, mollitia vero ea iste nam doloribus iusto voluptatum itaque, dicta fuga assumenda.</p> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Blanditiis magnam, soluta nihil libero sapiente, ullam omnis ipsa adipisci, mollitia vero ea iste nam doloribus iusto voluptatum itaque, dicta fuga assumenda.</p> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Blanditiis magnam, soluta nihil libero sapiente, ullam omnis ipsa adipisci, mollitia vero ea iste nam doloribus iusto voluptatum itaque, dicta fuga assumenda.</p> </div>
Situation 2: A non-floating parent, but a floating child. Again, the parent takes only the height of the non-floating child (s), since floating elements do not affect the size of the parent.
div{ border:1px solid; } .float{ float:left; width:50%; }
<div class="parent"> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Blanditiis magnam, soluta nihil libero sapiente, ullam omnis ipsa adipisci, mollitia vero ea iste nam doloribus iusto voluptatum itaque, dicta fuga assumenda.</p> <p class=float>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Blanditiis magnam, soluta nihil libero sapiente, ullam omnis ipsa adipisci, mollitia vero ea iste nam doloribus iusto voluptatum itaque, dicta fuga assumenda.</p> <p class=float>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Blanditiis magnam, soluta nihil libero sapiente, ullam omnis ipsa adipisci, mollitia vero ea iste nam doloribus iusto voluptatum itaque, dicta fuga assumenda.</p> </div>
Situation 3: Floating parent and floating child. Now this situation is actually the solution of the 2nd Situation, but this situation / solution is not the best practice, especially if you want the parent object to be centered, aligned with its parent.
Now, why does this situation work? because floating elements will expand to contain floating child elements.
div{ border:1px solid; float:left; } .float{ float:left; width:50%; }
<div class="parent"> <p class=float>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Blanditiis magnam, soluta nihil libero sapiente, ullam omnis ipsa adipisci, mollitia vero ea iste nam doloribus iusto voluptatum itaque, dicta fuga assumenda.</p> <p class=float>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Blanditiis magnam, soluta nihil libero sapiente, ullam omnis ipsa adipisci, mollitia vero ea iste nam doloribus iusto voluptatum itaque, dicta fuga assumenda.</p> <p class=float>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Blanditiis magnam, soluta nihil libero sapiente, ullam omnis ipsa adipisci, mollitia vero ea iste nam doloribus iusto voluptatum itaque, dicta fuga assumenda.</p> </div>
Now, how can we solve the second situation without using the third situation. Answer: Clear CSS property.
An explicit CSS property indicates whether an element can be next to floating elements that precede it or should be moved down (cleared) below them. A clear property applies to both floating and non-floating elements.
MDN
Now How can we use clear ?
Decision on the stone age, place the element at the bottom of the parent element and give it clearfix . This is a good solution, but every time you need to add an additional element. It is useless if you cannot edit dynamic HTML.
div.parent{ border:1px solid; } .float{ float:left; width:50%; }
<div class="parent"> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Blanditiis magnam, soluta nihil libero sapiente, ullam omnis ipsa adipisci, mollitia vero ea iste nam doloribus iusto voluptatum itaque, dicta fuga assumenda.</p> <p class=float>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Blanditiis magnam, soluta nihil libero sapiente, ullam omnis ipsa adipisci, mollitia vero ea iste nam doloribus iusto voluptatum itaque, dicta fuga assumenda.</p> <p class=float>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Blanditiis magnam, soluta nihil libero sapiente, ullam omnis ipsa adipisci, mollitia vero ea iste nam doloribus iusto voluptatum itaque, dicta fuga assumenda.</p> <div style="clear:both"></div> </div>
Now you do not want to add an additional element, and then css3 do this task for you, create and create an element at the bottom of the parent with the pseudo:after element, then assign it a task to clear the floating elements.
.clearfix:after { content: ""; display: table; clear: both; }
div.parent{ border:1px solid; } .float{ float:left; width:50%; } .clearfix:after { content: ""; display: table; clear: both; }
<div class="parent clearfix"> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Blanditiis magnam, soluta nihil libero sapiente, ullam omnis ipsa adipisci, mollitia vero ea iste nam doloribus iusto voluptatum itaque, dicta fuga assumenda.</p> <p class=float>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Blanditiis magnam, soluta nihil libero sapiente, ullam omnis ipsa adipisci, mollitia vero ea iste nam doloribus iusto voluptatum itaque, dicta fuga assumenda.</p> <p class=float>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Blanditiis magnam, soluta nihil libero sapiente, ullam omnis ipsa adipisci, mollitia vero ea iste nam doloribus iusto voluptatum itaque, dicta fuga assumenda.</p> </div>
Sources