關於盒子模型.定位.浮動.頁面布局的一些總結和的經驗心得


自學了半年前端,一開始學的時候沒有把基礎打牢,頁面布局時經常出問題.寫了幾個頁面后逐漸積累了一些經驗,在這里我把它整理出來:

 

文檔流:網頁中的元素在網頁中所占據的位置.網頁中並不是所有的元素都占據文檔流的

   舉例:某個網站的布局如下,標題區域占據文檔流,內容區域就會排在標題區域的下面

   

   當標題區域不占據文檔流時,標題區域和內容區域發生了重合:

   

   通俗的說:標題區域失去文檔流之后,內容區域不知道他的存在了,所以他會認為顯示在網頁(body)中的只有自己一個元素,因此內容區域會顯示在最上面.

   而標題區域實際上並沒有消失不見.所以他們會發生重合的情況.

 

定位:

css中定位用position實現,position有四個值:

position:absolute(絕對定位):不占據文檔流,可以設置偏移量.

position:relative(相對定位):占據文檔流,無論偏移量為何值,始終占據最初的文檔流

position:fixed(固定定位):不占用文檔流,永遠固定在屏幕的某個具體位置.

position:static(默認定位):static是position的默認值,也就是說"position:static"這條在css里寫不寫都是一樣的.static是position四個定位里唯一一個不開啟定位的屬性

 

定位的繼承:

<body>
    <div class="div4">
        <div class="div3">
            <div class="div2">
                <div class="div1">
                    <div class="div0"></div>
                </div>
            </div>
        </div>
    </div>
</body>

(1)何為定位繼承:在下面的例子中,如果div0繼承了div1,div1的偏移量為10px,那么div0的默認偏移量就是10px,如果給div0設置20px的偏移量,那么div0的偏移量就是(10+20)px

 (2)繼承誰的定位:網頁中的元素會其繼承定位父元素的位置.

這里有一組結構上嵌套的div,他們呈現的網頁上的效果如下:

div0的定位是"top:20px",但它這個20像素是相對於誰的呢?div1,div4,還是body?

這要看哪個div開啟了定位,如果div1開啟了定位,那么div0就會相對於div1橫向的偏移20像素,如果div1沒有開啟定位,那么div0就會向外找div2是否開啟了定位......直到找到body或者找到其他開啟了定位的祖先元素:

 

被div0繼承定位的元素,就是div0的定位父元素.

 

相對定位+外邊距

下圖是一個手機端的優惠券領取界面,每一個優惠券div內部的布局都是相同的.為了讓保持內部的布局不變,讓里面的圖片和文字永遠相對於父級div定位,就必須將父級元素開啟定位.

如果使用絕對定位,元素不占用文檔流,那所有的優惠券div都會重疊在一起

因此要使用相對定位,相對定位如果設置了偏移量,元素所占用的文檔流就會和網頁實際顯示的位置出現偏差,因此,如果想要使用相對定位,在本例中應該使用內外邊距控制元素位置,而不是偏移量.

 

 

浮動:浮動有左浮動(float:left)和右浮動(float:right)兩種情況,浮動不占據文檔流.

 

清除浮動:

可以使用clear屬性清除浮動,clear可以取四個值,分別是none\right\left\both

以(clear:right)來說明,字面意思是清除某元素左側的浮動元素,但實際上並不是:

 <!DOCTYPE html>
 <html>
 <head>
     <title></title>
     <style type="text/css">
         .leftDiv{
             width: 100px;
             height: 100px;
             border: 1px solid #f00;
             float: left;
             clear: right;
         }
         .rightDiv{
             width: 100px;
             height: 100px;
             border: 1px solid #000;
             float: left;
         }
     </style>
 </head>
 <body>
     <div class="leftDiv"></div>
     <div class="rightDiv"></div>
 </body>
 </html>

程序執行的結果如圖所示:

紅色方塊(leftDiv)已經設置了右浮動,但是並沒有改變右側的黑色方塊(divRight),為什么呢?

float:right的意思是不允許左邊有浮動對象,但是這個屬性是應用在紅色方塊上的,他不會影響到黑色方塊,如果想要清除掉用測浮動的黑色方塊,應該在黑色方塊上設置清除左浮動.

還是上面的代碼,只需要在右邊的div上加一個clear:left就ok了

.rightDiv{
             clear:left;
         }

執行結果:

 

總結起來就是:clear確實是清除某側的浮動,但是clear只會影設置該屬性的元素自身,不會影響到其他元素.

 

解決高度塌陷問題:

這是一個浮動很常見的應用場景

 

浮動不占據文檔流,為了不讓下面的元素和該元素重合在一起,需要給他設置一個能夠占據文檔流的父級div,高度和浮動元素的高度相等:

但因為浮動元素不占據文檔流,他的父級div會認為他不存在.因此他無法將父級元素撐開,在下圖中,父級div變成了一條線,這就是高度塌陷問題:

 

如果給父級元素設置一個固定的高度,會非常不利於網頁的維護.這時就希望浮動元素能夠把他的父元素撐開:

        .clearfix:after{
            content: "";
            display: block;
            clear: both;
        }
        .clearfix{
            zoom: 1;
        }

給父元素添加clearfix這個樣式就可以做到,原理是在父元素的后面加一個屬性,清除左右浮動讓他跑到最下面,設置為block使之可以獨占一行.

這個方法使用方便,而且可復用,能夠解決兼容性問題.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM