CSS基礎知識(三)——浮動float

浮動的框可以向左或向右移動,直到它的外邊緣碰到包含框或另一個浮動框的邊框爲止。由於浮動框不在文檔的普通流中,所以文檔的普通流中的塊框表現得就像浮動框不存在一樣。
float屬性一共有四個參數:left(左浮動)、right(右浮動)、none(不浮動)、inherit(繼承父元素的浮動屬性)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        *
        {
            /*取消所有的內外邊距*/
            padding: 0;
            margin: 0;
        }
        .test
        {
            width: 100px;
            height: 100px;
            background-color: red;
            float: left;/*不加左浮動兩個div就會換行排列,加上就會水平排列;並且左浮動和右浮動的元素排列順序是對稱的*/
            margin-right: 10px;
        }
    </style>
</head>
<body>
    <div class="test">1</div>
    <div class="test">2</div>
</body>
</html>

在上面的代碼中我設置了兩個左浮動的div,當兩個div同時具有浮動屬性時,他們就不會和一般的div一樣換行,他們會按照水平排列。但是如果一個div浮動一個div不浮動的話,就會產生兩個div的重疊效果,若是兩個div都不浮動就是根據塊級元素的特性進行換行。上面代碼的效果如下所示:
這裏寫圖片描述
還需要注意的是,擁有float屬性的元素將會成爲塊級元素,例如span是內聯元素,這個元素不能通過賦與其width和height屬性來佔據空間,但是如果在css樣式中爲span元素聲明瞭float屬性後,span元素就會被強制轉換爲塊級元素,此時width和height屬性就可以生效了。

接下來我們來利用float實現一個文字環繞圖片的效果,這裏可能有人會有疑問,不是說有float屬性的元素會脫離正常的文檔流進行排列嗎,那麼按照這種說法文字不是會和圖片重合嗎?這裏我們需要知道,當給元素設置了float屬性的時候,元素會脫離正常文檔流的排列方式,但浮動的元素雖然脫離了正常的文檔流,但依然佔據文檔流的空間,所以文檔流無法和設置了float屬性的元素重合,因此就能實現文字環繞圖片的效果了。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>float</title>
    <style>
        .per
        {
            width: 400px;
            height: 400px;
            border: 1px solid #ccc;
        }
        img
        {
            float: right;
        }
    </style>
</head>
<body>
    <div class="per">
        <img src="logo.png" width="200"/>
        慕課網是垂直的互聯網IT技能免費學習網站。以獨家視頻教程、在線編程工具、學習計劃、問答社區爲核心特色。在這裏,你可以找到最好的互聯網技術牛人,也可以通過免費的在線公開視頻課程學習國內領先的互聯網IT技術。
        慕課網課程涵蓋前端開發、PHP、Html5、Android、iOS、Swift等IT前沿技術語言,包括基礎課程、實用案例、高級分享三大類型,適合不同階段的學習人羣。以純乾貨、短視頻的形式爲平臺特點,爲在校學生、職場白領提供了一個迅速提升技能、共同分享進步的學習平臺。
        慕課網是垂直的互聯網IT技能免費學習網站。以獨家視頻教程、在線編程工具、學習計劃、問答社區爲核心特色。在這裏,你可以找到最好的互聯網技術牛人,也可以通過免費的在線公開視頻課程學習國內領先的互聯網IT技術。 慕課網課程涵蓋前端開發、PHP、Html5、Android、iOS、Swift等IT前沿技術語言,包括基礎課程、實用案例、高級分享三大類型,適合不同階段的學習人羣。以純乾貨、短視頻的形式爲平臺特點,爲在校學生、職場白領提供了一個迅速提升技能、共同分享進步的學習平臺。 慕課網是垂直的互聯網IT技能免費學習網站。以獨家視頻教程、在線編程工具、學習計劃、問答社區爲核心特色。在這裏,你可以找到最好的互聯網技術牛人,也可以通過免費的在線公開視頻課程學習國內領先的互聯網IT技術。 慕課網課程涵蓋前端開發、PHP、Html5、Android、iOS、Swift等IT前沿技術語言,包括基礎課程、實用案例、高級分享三大類型,適合不同階段的學習人羣。以純乾貨、短視頻的形式爲平臺特點,爲在校學生、職場白領提供了一個迅速提升技能、共同分享進步的學習平臺。
    </div>
</body>
</html>

這裏寫圖片描述
這樣我們就成功利用float實現了文字環繞圖片的效果了。

浮動有好處自然也有弊端,其中最常見的弊端就是父元素塌陷。舉個例子,我們爲一個父元素的height聲明爲auto,意思就是這個父元素的高度由其包含的子元素決定,這時如果我們爲其子元素聲明瞭float屬性,那麼這個子元素將跳出正常的文檔流排列方式,此時父元素無法獲取到子元素的高度,那麼父元素的高度爲0,這就造成了塌陷。
下面就是一個塌陷的代碼實例

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            *
            {
                margin: 0;
                padding: 0;
            }
            .per
            {
                width: 500px;
                height: auto;
                border: 1px solid #000000;
            }
            .test
            {
                width: 80px;
                height: 30px;
                background: red;
                border: 1px solid #FFFFFF;
                float: left;/*由於子元素設置了浮動屬性,所以脫離了正常的標準流佈局,導致高度設置了auto的父元素per無法檢測子元素高度發生了坍塌*/
            }
            .bro
            {
                width: 100px;
                height: 100px;
                background: blue;
            }
        </style>
    </head>
    <body>
        <div class="per">
            <div class="test"></div>
            <div class="test"></div>
            <div class="test"></div>
            <div class="test"></div>
        </div>
        <div class="bro"></div>
    </body>
</html>

這裏寫圖片描述
既然有塌陷那麼我們就必須找到解決塌陷的辦法,解決塌陷的辦法一共有四種:
這裏寫圖片描述
(1)、手動爲父元素的高度賦值
這種方法最簡單,但是在開發過程中非常不實用,當子元素的高度發生變化後,我們無法預料到子元素的高度是否會超出父元素造成頁面混亂,因此不推薦。
(2)、clear屬性
clear:left不允許元素左邊有浮動對象
clear:right不允許元素右邊有浮動對象
clear:both不允許元素兩側有浮動對象
clear:inherit繼承父類元素clear的值

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .div1
            {
                width: 100px;
                height: 100px;
                background: red;
                float: left;
            }
            .div2
            {
                width: 120px;
                height: 120px;
                background: blue;
                clear: left;/*不允許左邊有浮動元素,因此div2正常顯示,但是div1還是在原位,只是讓div2正常顯示了而已*/
            }
            .per
            {
                width: 200px;
                height: 400px;
                border: 1px solid #CCC;
            }
        </style>
    </head>
    <body>
        <div class="per">
            <div class="div1"></div>
            <div class="div2"></div>
        </div>
    </body>
</html>

通過我們之前學習的知識可以知道,當一個div有浮動另一個div沒有的情況下(默認是相鄰兄弟元素),兩個div會發生重疊;兩個div都有浮動屬性的話,兩個div會進行水平排列而不換行,但是在上面的代碼中我們發現我們爲div2聲明瞭clear:left屬性,禁止了其左邊有浮動元素,因此div2的顯示是正常換行的。
這裏寫圖片描述
那麼我們到底如何利用clear進行塌陷的處理呢?最常用的辦法就是在所有浮動子元素的最後加上一個空白的子元素,併爲其聲明clear:both,這種方法的原理就是這個空白的子元素會因爲clear:both的限制強行換行,但是因爲空白元素高寬均爲0所以其只是換行到了前面子元素的高度處,由於這個空白元素不是浮動的,所以父元素能檢測到這個高度,塌陷解決。

(3)、overflow和zoom搭配使用

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .per
            {
                width: 500px;
                height: auto;
                border: 1px solid #000;
                /*overflow和zoom搭配使用解決父元素塌陷*/
                overflow: hidden;/*overflow用來修剪溢出元素,若將子元素test的長度改爲1000,那麼在屏幕上顯示的依然是父元素的500*/
                zoom: 1;/*IE專用屬性 通過子元素的高度來放大/縮小父元素的高度 使得父元素擁有了高度*/
            }
            .test
            {
                width: 100px;
                height: 30px;
                background: red;
                border: 1px solid #fff;
                float: left;/*高度爲auto的父元素塌陷*/
            }
        </style>
    </head>
    <body>
        <div class="per">
            <div class="test"></div>
            <div class="test"></div>
            <div class="test"></div>
        </div>
    </body>
</html>

這裏寫圖片描述

(4)、給父元素添加浮動

<!DOCTYPE html>
<html lang="en">
        <head>
            <meta charset="UTF-8">
            <title>Title</title>
            <style>
                .per
                {
                    width: 500px;
                    height: auto;
                    border: 1px solid #000000;
                    float: left;/*爲父元素添加浮動效果解決塌陷問題*/
                }
                .test
                {
                    width: 100px;
                    height: 30px;
                    background: red;
                    border: 1px solid #ffffff;
                    float: left;/*導致高度爲auto的父元素塌陷*/
                }
            </style>
    </head>
    <body>
        <div class="per">
            <div class="test"></div>
            <div class="test"></div>
            <div class="test"></div>
        </div>
    </body>
</html>

這裏寫圖片描述

到這裏我們浮動的基本知識就學習完畢了,最後使用float的知識完成一個慕課網的導航欄,注意div的分層思想。

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            *
            {
                padding: 0;
                margin: 0;
            }
            .head
            {
                width: 100%;
                height: 64px;
                background: lightgreen;
            }
            .logo
            {
                width: 160px;
                height: 40px;
                float: left;
                margin-top: 12px;
            }
            .nav
            {
                width: 320px;
                height: 64px;
                float: left;
            }
            .nav-li
            {
                width: 80px;
                height: 64px;
                text-align: center;
                line-height: 64px;
                color: #333333;
                float: left;
            }
            .icons
            {
                width: 320px;
                height: 64px;
                float: right;
                padding-right: 10px;
            }
            .i01
            {
                width: 64px;
                height: 64px;
                background-image: url("001.png");
                background-position: center;/*讓圖片居中顯示*/
                background-repeat: no-repeat;
                float: left;
            }
            .i02
            {
                width: 64px;
                height: 64px;
                background-image: url("002.png");
                background-position: center;
                background-repeat: no-repeat;
                float: left;
            }
            .i03
            {
                width: 64px;
                height: 64px;
                background-image: url("003.png");
                background-position: center;
                background-repeat: no-repeat;
                float: left;
            }
            .i04
            {
                width: 64px;
                height: 64px;
                background-image: url("004.png");
                background-position: center;
                background-repeat: no-repeat;
                float: left;
            }
            .i05
            {
                width: 64px;
                height: 64px;
                background-image: url("005.png");
                background-position: center;
                background-repeat: no-repeat;
                float: left;
            }
        </style>
    </head>
    <body>
        <!--頭部導航欄-->
        <div class="head">
            <!--logo圖片-->
            <div class="logo">
                <img src="logo.png" width="160" height="40"/>
            </div>
            <!--左側導航文字-->
            <div class="nav">
                <div class="nav-li">實戰</div>
                <div class="nav-li">路徑</div>
                <div class="nav-li">猿問</div>
                <div class="nav-li">手記</div>
            </div>
            <!--右側導航圖片-->
            <div class="icons">
                <div class="i01"></div>
                <div class="i02"></div>
                <div class="i03"></div>
                <div class="i04"></div>
                <div class="i05"></div>
            </div>
        </div>
    </body>
</html>

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章