网页布局的核心就是用CSS来摆放盒子位置,把盒子摆放到合适的位置需要用到CSS的定位机制。CSS的定位机制有三种,普通流(标准流),浮动和定位。

(1)普通流

实际上就是一个网页内标签元素正常从上到下,从左到右排列顺序的意思,比如块级元素会独占一行,行内元素会按顺序依次前后排列。

(2)浮动

(1)浮动最早是用来做文字环绕图片效果的。后来才开始用浮动的特性来布局。

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <style> div {
            width: 500px;
            height: 500px;
            border: 1px solid hotpink;
            margin: 0 auto;
        }

        img {
            float: right;
        }
    </style>
</head>

<body>
    <div>
        江南,日出江花红胜火,春来江水绿如蓝。 忆江南,怎不忆江南,日出江花红胜火,春来江水绿如蓝。
        忆江南,怎不忆江南,日出江花红胜火,春来江水绿如蓝。 忆江南,怎不忆江南,日出江花红胜火,春来江水绿如蓝。
        忆江南,怎不忆江南,日出江花红胜火,春来江水绿如蓝。 忆江南,怎不忆江南,日出江花红胜火,春来江水绿如蓝。
        忆江南,怎不忆江南,日出江花红胜火,春来江水绿如蓝。 忆江南,怎不忆江南,日出江花红胜火,春来江水绿如蓝。
        忆江南,怎不忆江南,日出江花红胜火,春来江水绿如蓝。 忆江南,怎不忆江南,日出江花红胜火,春来江水绿如蓝。
        忆江南,怎不忆江南,日出江花红胜火,春来江水绿如蓝。 忆江南,怎不忆江南,日出江花红胜火,春来江水绿如蓝。
        <img src="我好气呀.jpg" alt="">
        忆江南,怎不忆江南,日出江花红胜火,春来江水绿如蓝。 忆江南,怎不忆江南,日出江花红胜火,春来江水绿如蓝。
        忆江南,怎不忆江南,日出江花红胜火,春来江水绿如蓝。 忆江南,怎不忆江南,日出江花红胜火,春来江水绿如蓝。
        忆江南,怎不忆江南,日出江花红胜火,春来江水绿如蓝。 忆江南,怎不忆江南,日出江花红胜火,春来江水绿如蓝。
        忆江南,怎不忆江南,日出江花红胜火,春来江水绿如蓝。 忆江南,怎不忆江南,日出江花红胜火,春来江水绿如蓝。
       忆江南,怎不忆江南,日出江花红胜火,春来江水绿如蓝。 忆江南,怎不江南,日出江花红胜火,春来江水绿如蓝。

    </div>
</body>

</html>


(2)体会浮动:

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <style> div {
            width: 200px;
            height: 200px;
            background-color: pink;
            /* display: inline-block; 转换为行内块元素 就可以放在一行上 有宽度高度,但是元素之间存在空隙。 */
            float: left;
        }

        div:nth-child(2) {
            background-color: hotpink;
        }

        div:nth-child(3) {
            background-color: skyblue;
        }
    </style>
</head>

<body>
    <div></div>
    <div></div>
    <div></div>
</body>

</html>


(3)浮动体现在漂浮在标准流的上方

  • 浮动指设置了浮动属性的元素会脱离标准普通流的控制,移动到其父元素中指定位置的过程。
  • 浮动脱离标准流,不占位置,会影响标准流,只有左右浮动。
  • 浮动首先创建包含块的概念(包裹)。


<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <style> div:first-child {
            width: 200px;
            height: 200px;
            background-color: pink;
            float: left;
            /* 浮动体现在漂浮在标准流的上方 */
        }

        div:last-child {
            width: 140px;
            height: 300px;
            background-color: skyblue;
            /* float: right; */
        }
    </style>
</head>

<body>
    <div>200</div>
    <div>300</div>
    <!-- 如果两个盒子都不加浮动,就是标准流,块级元素自上而下显示 -->
</body>

</html>

  • (4)浮动的元素总是找距离它最近的父级元素对齐,但是不会超出内边距的范围。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <style> .father {
            width: 500px;
            height: 300px;
            background-color: pink;
            border: 10px solid red;
            padding: 10px;
            /* 子类的浮动不会超过父类的内边框和内边距 */
        }

        .son {
            width: 200px;
            height: 200px;
            background-color: skyblue;
            float: right;
            /* 浮动总是找最近的父亲盒子对齐 */
        }
    </style>
</head>

<body>
    <div class="father">
        <div class="son"></div>
    </div>
</body>

</html>


(5)浮动的元素排列位置

  • 浮动的元素排列位置,跟上一个元素(块级)有关系。
  • 如果上一个元素有浮动,则A元素顶部会和上一个元素的顶部对齐;
  • 如果上一个元素是标准流,则A元素的顶部会和上一个元素的底部对齐。

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <style> section {
            width: 800px;
            height: 550px;
            background-color: pink;
        }

        section div:first-child {
            width: 200px;
            height: 200px;
            background-color: purple;
            float: left;
        }

        section div:last-child {
            width: 249px;
            height: 300px;
            background-color: skyblue;
            float: left;
        }
    </style>
</head>

<body>
    <section>
        <div>熊大</div>
        <div>熊二</div>
    </section>
</body>

</html>


(6)元素添加浮动后,元素会具有行内块元素的特性。元素的大小完全取决于定义的大小或默认的内容的多少。

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <style> div {
            height: 200px;
            background-color: pink;
            float: left;
            /* 块级元素添加浮动后,具有行内块的特性. */
        }

        span {
            background-color: skyblue;
            height: 100px;
            float: left;
            /* 行内元素添加浮动后,具有行内块的特性. */
        }
    </style>
</head>

<body>
    <div>昨夜雨疏风骤</div>
    <div>昨夜雨疏风骤</div>
    <span>人生天地间,忽如远行客.</span>
    <span>人生天地间,忽如远行客.</span>
</body>

</html>


浮动总结:
浮动的目的是为了让多个块级元素在同一行上显示。

清除浮动所造成的影响:
为什么清除浮动?
由于浮动元素不再占用源文档流的位置,所以它会对后面的元素排版产生影响,为了解决这些问题就需要清除浮动。本质是为了解决父级元素因为子级浮动引起内部高度为0的问题。

清除浮动的方法:

(1)额外添加法

W3C推荐的做法是通过在浮动元素末尾添加一个空的标签 <div style=”clear:both”></div>或者其他标签亦可。

        .clear {
            clear:both;
        } 

优:通俗易懂,书写方便.
劣:添加许多无意义的标签,结构化较差。

(2)父级添加overflow属性方法
通过触发BFC的方式,可以实现清除浮动效果。

overflow: hidden;

可以给父级添加:overflow为hidden | auto | scroll都可以实现
优:代码简洁
劣:内容增多时候容易造成不会自动换行导致内容被隐藏掉,无法显示需要溢出的元素。

(3)使用after伪元素清除浮动
:after方式为空元素的升级版,好处就是不用单独加标签了。
使用方法:

        .clearfix:after {
            /* 转换为块级元素 */
            display: block;
            content: ".";
            height: 0;
            /* 隐藏盒子 */
            visibility: hidden;
            /* 清除浮动 */
            clear: both;
        }
        .clearfix {
            /* *代表只有IE6.7能识别的特殊符号,zoom就是ie6.7清除浮动的方法 */
            *zoom:1;
        }

优:符合闭合浮动思想 结构语义化正确
劣:由于IE6-7不支持:after,使用zoom:1触发hasLayout。
代表网站:百度、淘宝网、网易等。

(4)使用before和after双伪元素清除浮动

       .clearfix:before, .clearfix:after {
            content: "";
            /* 触发bfc 防止外边距合并 */
            display: table;
        }

        .clearfix:after {
            clear: both;
        }

        .clearfix {
            *zoom: 1;
        }

优:代码更简洁
劣:由于ie6,7不支持:after,使用zoom:1触发ayout。
代表网站:小米、腾讯等。