手记

CSS之Float奥秘刨根问底

今天在写网页的过程中无意发现了一个问题,于是花了数小时来研究,原来看似简单的“float”背后隐藏着“不为人知”的小秘密。

关于float基础知识这里就带过,只给大家分享一下我今天遇到的问题。

问题如下:

  <style>
        *{ margin: 0px 0px;padding: 0px 0px}

        a{
            position: absolute;
            line-height: 100px;
            padding-left:50px;
        }
        li{
            display: inline;
            float: left;
            border:1px solid blue;
            width:100px;
            height:100px;
        }
        div{
            height: 50px;
            width: 50px;
            border: 1px solid red;
        }
    </style>
<body>
  <ul>
         <li><a href="#">a1</a></li>
         <li><a href="#">a2</a></li>
         <li><a href="#">a3</a></li>
  </ul>
  <div>d1</div>
</body>

在我以为实现如上代码应该出现的效果是,li浮动,不占据块空间,于是div上移,神奇的事情出现了!!

为神马div中的内容跑出来了???

百思不得其姐,我开始上网查资料,突然发现“float”远比我想象的神奇。
这里给读者分享一篇文章:https://www.cnblogs.com/jjucap/p/5345945.html
读完这篇文章我在想,what??excuse me?什么是浮动框?什么是行框?

【划重点!非常重要!!!】

首先,这里要说一下float的来源,最初,float是用于文字环绕的。

其次,非常重要的一点就是:浮动元素不会占据相邻非浮动元素的块空间,但是它会占据非浮动元素内的行框空间!!!!

浮动元素不会占据相邻非浮动元素的块空间”这句话是什么意思?

我们知道元素浮动以后就会飘起来,也就是“飞上天”了,此时不占据块空间(地面空间),也就是我写的代码中,a1,a2,a3是飞起来的,所以后面的div(红色边框)会跑上来(div并没有浮动,它在地面上)。

“浮动元素会占据非浮动元素内的行框空间!”这句话...又是什么意思?!

所谓“行框”就,是所有行高当中的最大值构成的行内框。行内框的高度就是行高。如下图,“小仙女”所占据的行高最大。如图:

呃。。。可能还是有点难理解。。。

这么比喻吧。我是一个人a(一段文字),被容器A包裹起来了,浮动之后,容器A飞上天了,但是容器A的影子还在地面上,容器A的影子里不允许被别人(文字)占用。但容器A的影子里允许有容器B。

那原本容器B中的文字b会去哪里呢?

①如果容器B的宽度小于容器A的宽度,则b会在容器A的影子之后,且不在同一行(b不一定会在容器B中,也不是一定不在容器B中,有可能容器B高度很大),也就是我们最开始看到的图片那样:a1、a2、a3所在的容器宽度大于d1所在的容器宽度,d1只能在后面显示,而d1所在的容器(红色边框)却在上面,文字与容器分离:


②如果容器B的宽度大于容器A的宽度,则b依旧在容器A的影子之后,但b会在容器B中。

同样的,字母和数字有点不太正常。

仔细看这个图片,是不是有种文字环绕的效果呢?

这也就是当初设计float的初衷。

这里再安利一个文章,写的也比较好,还不懂的同学可以再仔细看看,仔细思考思考:http://blog.csdn.net/hedong37518585/article/details/6645884

那我们如何解决这个问题?

①clear:both;——给div单独添加该属性后有如下效果:

②overfloat:hidden;——给div单独添加该属性后有如下效果:

③给div同时添加以上两个属性:

第一次写手记,还望给位大牛们发现错误后及时改正我。谢谢。如有看不懂本文的同学,可以仔细看看我分享的链接,长辈们写的要精炼许多。

2人推荐
随时随地看视频
慕课网APP