[css] float浮动属性及其破坏性

1.引言

  正在学习css,float属性可以使元素脱离文档流,进行左右浮动。但是这个属性好用的同时,也带来了许多问题。在此做个简单的记录。

2.float用法:

  以块级元素为例,因为html页面遇块换行,所以块级元素通常都是从上至下布局的

  (最外围的黑色框框请忽略)

  

 

 

 假如我们需要页面左右布局,那么我们可以通过float属性来使两个盒子进行浮动:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
    </head>
    <body>
        <div style="width: 500px;height: 400px;border: 2px solid black;margin: auto;">
            <div style="float: left; width: 100px;height: 80px;background-color: firebrick;text-align: center;line-height: 80px;">
                div1
            </div>
            <div style="float: right; width: 150px;height: 80px;background-color: seagreen;text-align: center;line-height: 80px;">
                div2
            </div>
            
        </div>
    </body>
</html>

 

大部分网页的布局都不是简单的上中下,而是还分了左右布局,以博客园首页为例

 

 

 

这个网页的模式如下

  • 导航栏
  • 主体栏,分左中右三个分栏
  • 页脚

我们仿照首页来做一个简单的布局:

 

 

 

 

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style type="text/css">
            .header{
                height: 30px;
                text-align: center;
                background-color: cadetblue;
            }
            .main{
                height: 340px;
                width: 100%;
            }
            .left{
                float:left ;
                width: 25%;
                height: 200px;
                text-align: center;
                background-color: orange;
                line-height: 200px;
            }
            .right{
                float:right;
                width: 25%;
                height: 330px;
                text-align: center;
                background-color: orange;
                line-height: 330px;
            }
            .footer{
                height: 30px;
                text-align: center;
                background-color: rosybrown;
            }
        </style>
    </head>
    <body>
        <div style="width: 500px;height: 400px;border: 2px solid black;margin: auto;">
            <div class="header">导航栏</div>
            <div class="main">
                <div class="left">左分栏</div>
                <div class="right">右分栏</div>
                <div>中间部分</div>
            </div>
            <div class="footer">页脚</div>
        </div>
    </body>
</html>

在这里,我们是给主体部分设置了高度的:

 

 

 但是对于具体的页面来说,导航栏跟页脚之间的网页高度是不一定的,这个高度可能会随着分栏的高度变化而变化,所以我们取消主体的高度设置,理想中页脚应该会显示在最长的右分栏的下面。

然后再看将高度注释后的页面,我们发现页脚并没有在右分栏的下面,而是紧跟在并没有设置高度的中间部分后面。

 

 

 这里就出现了float元素使用中常见的“父元素坍塌”现象。

 

3.float的破坏性:

  从上面的代码中可以看出左中右三个分栏都在父元素主体部分中,虽然中间部分没有设置高度,但是父元素的边框应该是要包围这三个盒子的。可是当取消父元素高度以后,父元素的高度被计算成了“中间部分”这几个字的高度,显然,左右分栏没有把父元素的高度撑起来。

 

 

 

  回到float元素的特性“使元素脱离文档流”----我的理解就是,元素浮动以后,就去到了独立于文档流的另一个层面,同时,它的高度对于父元素来说也不存在了。所以在上图中,父元素计算高度时忽略了两个浮动框。

 

4.清除float

  我们在设计网页时,肯定要避免float导致父元素坍塌这种现象的出现。常用的解决办法有:

  (1)给父元素设置高度。(前提是子元素的高度固定)

  (2)给父元素设置overflow:hidden;

  (3)给父元素设置display: inline-block;

  (4)在父元素后面添加一个块级元素,并且给这个元素设置"clear:both"属性

  (5)添加伪类::after

  

 

posted @ 2020-04-08 12:50  hwinter_c  阅读(372)  评论(0编辑  收藏  举报