css-浮动模型、div包裹浮动元素

一、问题明确

当一个div的子元素为浮动元素时,这个作为容器的div是不能将其子元素包裹住的。具体问题描述如下:
我们创建一个作为包裹容器的div,border设置为黑色的实线,其下有红色的div子元素。具体代码如下:

    <div class="wrapper">
        <div class="box">a</div>
        <div class="box">b</div>
        <div class="box">c</div>
    </div>
.wrapper{
    text-align: center;
    border: 1px solid black;
}

.box{
    margin-top: 10px;
    width:50px;
    height: 50px;
    background-color: red;
}

其展示效果如下:
在这里插入图片描述
可以看到,红色的div都被黑色实线包裹住了。接下来我们将a、b、c三个div设置为向右浮动,即在.box选择器中添加 float: left;。a、b、c三个div的排列变为如下:
在这里插入图片描述
我们会发现,这个作为包裹容器的黑色方框并没有被a、b、c撑开,也就是说着三个div并没有被这个包裹容器包裹住。那么这是由于什么原因造成的呢?想要知道原因我们必须知道什么是css的浮动模型。

二、浮动模型

前面已经总结过了什么是层次模型(传送门),及绝对定位时,当前元素会脱离其所在层,来到新的层。那么这个元素也就不再占据原来所在层的位置。那么浮动模型其实也有类似之处。当元素带有浮动属性时,那么它也来到了一个新的层,但是这个元素又不是完全脱离了它原来所在的层次,这个层次中的有些元素还当这个元素还在这个层(这些元素有:产生了 bfc(带有position:absolute 或者 display:inline-block或者float:left/right或者overflow:hidden属性的的元素都称之为产生了bfc)和 文本属性的元素),其他元素则完全当它不存在了。
怎么理解上面这句话呢?我们一楼层做比喻。原来所有的元素都在第一层里。比如第一节提到的a、b、c三个div以及起包裹作用的div都在第一层,大家都占据了各自的位置,当然包裹容器的黑色方框能把a、b、c包裹住。但是,当我们将a、b、b设置了浮动属性之后,那么我们可以将a、b、c视为搬到了第二层。此时包裹容器当然就包裹不住a、b、c了,自然也就没有被撑开。这是自然的,**第一楼的住户怎么能在一楼拥抱住二楼的用户呢?**而那些产生了bfc、或者是文本属性的元素却能在一楼就拥抱住二楼的用户呢?比如说,我们将包裹容器的css增加了overflow:hidden触发了bfc之后,它就能将另一层的a、b、c包裹住,如下:
在这里插入图片描述
这就相当于已经搬到二楼的用户a、b、c打了个电话给还在一楼的包裹容器,把a、b、c原来在一楼的位置告诉了包裹容器,这样,包裹容器就知道了该在一楼的哪个位置,多大范围包裹住原来a、b、c所在的位置。

三、解决办法

3.1、使得div产生bfc

这一点在上面已经说过了。

3.2、清除浮动属性

使用伪元素选择器,在a、b、c的最后清除浮动的属性。也就是说让a、b、c搬回一楼:

.wrapper{
    text-align: center;
    margin-left: 100px;
    margin-top: 10px;
    border: 1px solid black;
}

.box{
    /*float: left;*/
    margin-top: 10px;
    width:50px;
    height: 50px;
    background-color: red;
}
.wrapper::after{
    content:"";
    clear:both;
    display: block;
    
}

效果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值