07-CSS基础-浮动流

2019-08-08  本文已影响0人  xiaohan_zhang
网页的布局方式

网页的布局方式其实就是指浏览器是如何对网页中的元素进行排版的。

  垂直排版: 如果元素是块级元素, 那么就会垂直排版;
  水平排版: 如果元素是行内元素/行内块级元素, 那么就会水平排版;

  注意点:
  浮动流中没有居中对齐, 也就是没有center这个取值
  在浮动流中是不可以使用margin: 0 auto;

  特点:
  在浮动流中是不区分块级元素/行内元素/行内块级元素的
  无论是块级元素/行内元素/行内块级元素都可以水平排版
  在浮动流中无论是块级元素/行内元素/行内块级元素都可以设置宽高

  综上所述, 浮动流中的元素和标准流中的行内块级元素很像

浮动元素的脱标

脱标: 脱离标准流
当某一个元素浮动之后, 那么这个元素看上去就像被从标准流中删除了一样, 这个就是浮动元素的脱标。
如果前面一个元素浮动了, 而后面一个元素没有浮动 , 那么这个时候前面一个元素就会盖住后面一个元素。


浮动元素排序规则
  1. 相同方向上的浮动元素, 先浮动的元素会显示在前面, 后浮动的元素会显示在后面。
<style>
    .box1{
        float: left;
        width: 50px;
        height: 50px;
        background-color: red;
    }
    .box2{
        float: left;
        width: 100px;
        height: 100px;
        background-color: pink;
    }
    .box3{
        float: left;
        width: 150px;
        height: 150px;
        background-color: yellow;
    }
</style>
  1. 不同方向上的浮动元素, 左浮动会找左浮动, 右浮动会找右浮动。
<style>
    .box1{
        float: left;
        width: 50px;
        height: 50px;
        background-color: red;
    }
    .box2{
        float: right;
        width: 100px;
        height: 100px;
        background-color: pink;
    }
    .box3{
        float: left;
        width: 150px;
        height: 150px;
        background-color: yellow;
    }
    .box4{
        float: right;
        width: 200px;
        height: 200px;
        background-color: tomato;
    }
</style>
  1. 浮动元素浮动之后的位置, 由浮动元素浮动之前在标准流中的位置来确定。
<style>
    .box1{
        float: left;
        width: 50px;
        height: 50px;
        background-color: red;
    }
    .box2{
        width: 100px;
        height: 100px;
        background-color: pink;
    }
    .box3{
        float: left;
        width: 150px;
        height: 150px;
        background-color: yellow;
    }
    .box4{
        float: left;
        width: 200px;
        height: 200px;
        background-color: tomato;
    }
</style>
浮动元素贴靠现象
  1. 如果父元素的宽度能够显示所有浮动元素, 那么浮动的元素会并排显示。


  2. 如果父元素的宽度不能显示所有浮动元素, 那么会从最后一个元开始往前贴靠。


  3. 如果贴靠了前面所有浮动元素之后都不能显示下, 最终会贴靠到父元素的左边或者右边。


浮动元素字围现象

浮动元素不会挡住没有浮动元素中的文字, 没有浮动的文字会自动给浮动的元素让位置,这个就是浮动元素字围现象。
应用场景:图文混排

img{
    float: left;
    width: 100px;
    height: 100px;
}
p{
    width: 300px;
    height: 300px;
    background-color: yellow;
}

    <img src="images/timg.jpg" alt="">
    <p>篱落秋归见豆花,竹门当水岸横槎。今日立秋,同志们该贴秋膘了。篱落秋归见豆花,竹门当水岸横槎。今日立秋,同志们该贴秋膘了。篱落秋归见豆花,竹门当水岸横槎。今日立秋,同志们该贴秋膘了。篱落秋归见豆花,竹门当水岸横槎。今日立秋,同志们该贴秋膘了。篱落秋归见豆花,竹门当水岸横槎。今日立秋,同志们该贴秋膘了。篱落秋归见豆花,竹门当水岸横槎。今日立秋,同志们该贴秋膘了。篱落秋归见豆花,竹门当水岸横槎。</p>
盒子高度问题

在标准流中内容的高度可以撑起盒子的高度。

<style>

        div{
            background-color: red;
        }

        p{
            width: 200px;
            height: 100px;
            background-color: blue;
        }
        
</style>
    
<div>
    <p></p>
</div>

在浮动流中浮动元素内容的高不可以撑起盒子的高。

<style>

        div{
            background-color: red;
        }

        p{
            float: left;
            width: 200px;
            height: 100px;
            background-color: blue;
        }
        
</style>
    
<div>
    <p></p>
</div>
清除浮动
    <style>
        body,div,ol,ul,li,dl,dt,dd,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{
            margin: 0;
            padding: 0;
        }
        .box1{
            background-color: red;
            /*这里*/
            height: 50px;
        }
        .box2{
            background-color: purple;
            /*margin有效*/
            /*margin-top: 20px;*/
        }
        .box1 p{
            background-color: blue;
        }
        .box2 p{
            background-color: green;
        }
        p{
            float: left;
        }
    </style>
<body>
    <div class="box1">
        <p>火影</p>
        <p>海贼</p>
    </div>
    <div class="box2">
        <p>漩涡鸣人</p>
        <p>路飞</p>
    </div>
</body>
父盒子添加高度前 父盒子添加高度后
<style>
    body,div,ol,ul,li,dl,dt,dd,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{
        margin: 0;
        padding: 0;
    }
    .box1{
        background-color: red;
    }
    .box2{
        background-color: purple;
        /*这里*/
        clear: both;
        /*margin无效*/
        margin-top: 30px;
    }
    .box1 p{
        background-color: blue;
    }
    .box2 p{
        background-color: green;
    }
    p{
        float: left;
    }
</style>
<body>
    <div class="box1">
        <p>火影</p>
        <p>海贼</p>
    </div>
    <div class="box2">
        <p>漩涡鸣人</p>
        <p>路飞</p>
    </div>
</body>
添加clear: both;前 添加clear: both;后
<style>
    body,div,ol,ul,li,dl,dt,dd,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{
        margin: 0;
        padding: 0;
    }
    .box1{
        background-color: red;
    }
    .box2{
        background-color: purple;
    }
    .box1 p{
        background-color: blue;
    }
    .box2 p{
        background-color: green;
    }
    p{
        float: left;
    }
    /*这里*/
    .wall{
        clear: both;
    }
    .h20{
        /*利用额外块级元素实现margin*/
        height: 20px;
        background-color: deepskyblue;
    }
</style>
<body>
    <div class="box1">
        <p>火影</p>
        <p>海贼</p>
    </div>
    <!--这里-->
    <div class="wall h20"></div>
    <div class="box2">
        <p>漩涡鸣人</p>
        <p>路飞</p>
    </div>
</body>
添加额外块级元素前 添加额外块级元素后
<style>
    body,div,ol,ul,li,dl,dt,dd,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{
        margin: 0;
        padding: 0;
    }
    .box1{
        background-color: red;
    }
    .box2{
        background-color: purple;
        /*margin有效*/
        margin-top: 20px;
    }
    .box1 p{
        background-color: blue;
    }
    .box2 p{
        background-color: green;
    }
    p{
        float: left;
    }
    /*这里*/
    .wall{
        clear: both;
    }
</style>
<body>
    <div class="box1">
        <p>火影</p>
        <p>海贼</p>
        <!--这里-->
        <div class="wall"></div>
    </div>
    <div class="box2">
        <p>漩涡鸣人</p>
        <p>路飞</p>
    </div>
</body>
添加额外块级元素前 添加额外块级元素后
<style>
    body,div,ol,ul,li,dl,dt,dd,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{
        margin: 0;
        padding: 0;
    }
    .box1{
        background-color: red;
        /*这里*/
        overflow: hidden;
        *zoom:1;
    }
    .box2{
        background-color: purple;
        /*margin有效*/
        margin-top: 20px;
    }
    .box1 p{
        background-color: blue;
    }
    .box2 p{
        background-color: green;
    }
    p{
        float: left;
    }
</style>
<body>
    <div class="box1">
        <p>火影</p>
        <p>海贼</p>
    </div>
    <div class="box2">
        <p>漩涡鸣人</p>
        <p>路飞</p>
    </div>
</body>
添加overflow:hidden;前 添加overflow:hidden;后
注意:
由于overflow:hidden可以撑起盒子的高度, 所以可以直接设置margin属性;
IE8以前不支持利用overflow:hidden来清除浮动, 所以需要加上一个/zoom:1;
实际上/
zoom:1能够触发IE8之前IE浏览器的hasLayout机制;
优点可以不用添加额外的标签又可以撑起父元素的高度, 缺点和定位结合在一起使用时会有冲突;

*zoom:1;和_zoom:1的区别
这个是hack写法,用来识别不同版本的IE浏览器
_后面的属性只有IE6能识别
*后面的属性 IE6 IE7能识别

标签名称::before{
  属性名称:值;
}
给指定标签的内容前面添加一个子元素

标签名称::after{
  属性名称:值;
}
给指定标签的内容后面添加一个子元素

给前面的盒子添加伪元素来清除浮动。

<style>
    body,div,ol,ul,li,dl,dt,dd,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{
        margin: 0;
        padding: 0;
    }
    .box1{
        background-color: red;
    }
    .box2{
        background-color: purple;
        /*margin有效*/
        margin-top: 20px;
    }
    .box1 p{
        background-color: blue;
    }
    .box2 p{
        background-color: green;
    }
    p{
        float: left;
    }
    /*这里*/
    .clearfix::after {
        /*生成内容作为最后一个元素*/
        content: "";
        /*使生成的元素以块级元素显示,占满剩余空间*/
        display: block;
        /*避免生成内容破坏原有布局的高度*/
        height: 0;
        /*使生成的内容不可见,并允许可能被生成内容盖住的内容可以进行点击和交互*/
        visibility: hidden;
        /*重点是这一句*/
        clear: both;
    }
    .clearfix {
        /*用于兼容IE, 触发IE hasLayout*/
        *zoom:1;
    }
</style>
<body>
    <div class="box1 clearfix">
        <p>火影</p>
        <p>海贼</p>
    </div>
    <div class="box2">
        <p>漩涡鸣人</p>
        <p>路飞</p>
    </div>
</body>
添加伪元素前 添加伪元素后

注意:
本质上和内墙法一样, 都是在前面一个盒子的最后添加一个额外的块级元素;
添加伪元素后可以撑起盒子的高度, 所以可以直接设置margin属性;
CSS中还有一个东西叫做伪类, 伪元素和伪类不是同一个东西;

<style>
    body,div,ol,ul,li,dl,dt,dd,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{
        margin: 0;
        padding: 0;
    }
    .box1{
        background-color: red;
    }
    .box2{
        background-color: purple;
        /*margin有效*/
        margin-top: 20px;
    }
    .box1 p{
        background-color: blue;
    }
    .box2 p{
        background-color: green;
    }
    p{
        float: left;
    }
    /*这里*/
    .clearfix::before,.clearfix::after {
        content:"";
        display:table;
        /*重点是这一句*/
        clear:both;
    }
    .clearfix {
        zoom:1;
    }
</style>
<body>
    <div class="box1 clearfix">
        <p>火影</p>
        <p>海贼</p>
    </div>
    <div class="box2">
        <p>漩涡鸣人</p>
        <p>路飞</p>
    </div>
</body>
添加双伪元素前 添加双伪元素后

注意:
添加伪元素后可以撑起盒子的高度, 所以可以直接设置margin属性;
支持BFC的浏览器(IE8+,firefox,chrome,safari)通过创建新的BFC闭合浮动;
不支持 BFC的浏览器 (IE5-7),通过触发 hasLayout 闭合浮动。

高度塌陷问题:
在浮动布局中,父元素的高度默认是被子元素撑开的,当子元素浮动后,其会完全脱离文档流,将无法撑起父元素的高度,导致父元素的高度丢失。

元素开启BFC后的特点:
1、开启BFC的元素不会被浮动元素覆盖
2、开启BFC的元素子元素和父元素的外边距不会重叠
3、开启BFC的元素可以包含浮动的子元素,不会出现高度塌陷问题

如何开启BFC:
1、设置元素的浮动
2、将元素设为行内块元素
3、将元素overflow设为非visible
常用方式:overflow: hidden;

上一篇下一篇

猜你喜欢

热点阅读