css之盒模型


盒模型由內容(content)、填充(padding)、邊框(border)、邊界(margin)組成,一個盒子中主要的屬性就5個:width、height、padding、border、margin。 

下面一一介紹盒子中的區域

width

寬度,CSS中width指的是內容的寬度,而不是盒子的寬度,CSS中height指的是內容的高度,而不是盒子的高度 

width:200px;
height: 200px;
padding:50px;
margin: 50px;
border: 5px solid red;
background-color: green;

上面的代碼,設置的寬度為200px,那么內容的寬度則為200px,但是當我們把鼠標移到盒子上,顯示的寬度為310px, 此寬度為盒子的寬度,真實占有寬度=  左border  +  左padding  +  width  +  右padding  +  右border,如果想保持一個盒子的真實占有寬度不變,那么加width就要減padding。加padding就要減width。

 

比如寫三個402*402的盒子,答案會有無窮多種,只有按照上述公式計算組合即可

.box1{width: 400px;height: 400px;border: 1px solid red;}
.box2{width: 200px;height: 200px;border: 6px solid red;padding: 95px;}
.box3{width: 0px;height: 0px;padding: 200px;border: 1px solid red;}

<div class="box1">第1個盒子</div> <div class="box2">第2個盒子</div> <div class="box3">第3個盒子</div>

padding

padding就是內邊距。padding的區域有背景顏色,css2.1前提下,並且背景顏色一定和內容區域的相同。也就是說,background-color將填充所有boder以內的區域。

padding是4個方向的,所以我們能夠分別描述4個方向的padding。方法有兩種,第一種寫小屬性;第二種寫綜合屬性,用空格隔開。

小屬性:這種適合只有一個方向需要設置值的時候采用,不然各個方向都要寫很麻煩。

 padding-top: 30px;padding-right: 20px;padding-bottom: 40px;padding-left: 100px;

綜合屬性:方向為上、右、下、左

/*如果寫了四個(表示方向為 上、右、下、左)*/
padding:30px 20px 40px 100px;

/*上、右、下、左(和右一樣)*/
padding: 20px 30px 40px;
/*如果寫了兩個(表示方向為 上、右、下(和上一樣)、左(和右一樣))*/ padding:30px 20px; /*如果寫了一個(表示方向為所有方向)*/ padding:30px;

一般的用法是:用小屬性層疊大屬性

 padding: 20px; /*各個方向都設置為20*/
padding-left: 30px;/*左邊單獨設置為30*/

  

不能把小屬性,寫在大屬性前面

padding-left: 30px;
padding: 20px; /*這樣寫上邊一行已經失去意義了*/

下面考一考你是否真的掌握了?說出下面盒子真實占有寬高

div{
	width: 200px;
	height: 200px;
	padding: 10px 20px 30px;
     padding-right: 40px;			
        border: 1px solid #000;
   }

真實占有寬度 = 200(內容寬) + 20(左填充) + 40(右填充) + 1(左邊框) + 1(右邊框) = 262px

內邊距會影響盒子大小,但是繼承的寬度, padding不會擠開

一些元素,默認帶有padding,比如ul標簽,所以,我們為了做站的時候,便於控制,總是喜歡清除這個默認的padding

*{margin: 0;padding: 0;}

*的效率不高,所以我們使用並集選擇器,羅列所有的標簽

body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0}

border

border就是邊框。邊框有三個要素:粗細、線型、顏色。顏色如果不寫,默認是黑色。另外兩個屬性不寫,顯示不出來邊框。border在各大瀏覽器中渲染會有細微差別,具體看這篇專門有介紹

border: 1px solid red;

border是一個大綜合屬性,上面代碼是把4個邊框,都設置為1px寬度、線型實線、red顏色。

border屬性能夠被拆開,有兩大種拆開的方式:

1) 按3要素:

border-width、border-style、border-color

 

border-width:10px;       → 邊框寬度
border-style:solid;      → 線型
border-color:red;        → 顏色

如果某一個小要素后面是空格隔開的多個值,那么就是上右下左的順序:

border-width:10px 20px;
border-style:solid dashed dotted;
border-color:red green blue yellow;

2) 按方向:

border-top、border-right、border-bottom、border-left
border-top:10px solid red;
border-right:10px solid red;
border-bottom:10px solid red;
border-left:10px solid red;

按方向還能再拆一層,就是把每個方向的,每個要素拆開,一共12條語句:

border-top-width:10px;
border-top-style:solid;
border-top-color:red;
border-right-width:10px; border-right-style:solid; border-right-color:red;
border-bottom-width:10px; border-bottom-style:solid; border-bottom-color:red;
border-left-width:10px; border-left-style:solid; border-left-color:red;

border可以沒有

border:none;
/*某一條邊沒有*/
border-left: none;
/*或者*/
border-left-width: 0;

IE6瀏覽器兼容問題

不支持高度小於12px的盒子,任何小於12px的盒子,在IE6中看都偏大,原因是在IE6下,所有標簽的最小高度都是為12px

解決辦法很簡單,就是將盒子的字號,設置小(小於盒子的高),比如0px

height: 4px;
_font-size: 0px;

 margin

margin和padding的用法差不多,只不過一個是內邊距,一個是外邊距,不過margin的值可以設置為負值

margin的塌陷現象

標准文檔流中,豎直方向的margin不疊加,以較大的為准。

 

如果不在標准流,比如盒子都浮動了,那么兩個盒子之間是沒有塌陷現象的

盒子居中

margin的值可以為auto,表示自動。當leftright兩個方向,都是auto的時候,盒子居中了

margin:0 auto;

注意:

1)使用margin:0 auto; 的盒子,必須有width,有明確的width

2)只有標准流的盒子,才能使用margin:0 auto; 居中。也就是說,當一個盒子浮動了、絕對定位了、固定定位了,都不能使用margin:0 auto;

3margin:0 auto;是在居中盒子,不是居中文本。文本的居中,要使用  text-align:center; 

margin:0 auto;       → 讓這個div自己在大容器中居中。
text-align: center;  → 讓這個div內部的文本居中。

善於使用父元素的padding,而不是子元素的margin

margin這個屬性,本質上描述的是兄弟和兄弟之間的距離; 最好不要用這個marign表達父子之間的距離。所以,我們一定要善於使用父親的padding,而不是兒子的margin

如果父親沒有border,那么兒子的margin實際上踹的是“流”,踹的是這“行”。所以,父親整體也掉下來了,比如:

 

關於margin的IE6兼容問題

IE6雙倍margin bug

出現連續浮動的元素,攜帶和浮動方向相同的margin時,隊首的元素,會雙倍marign。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>Document</title>
    <style type="text/css">
        *{
            margin: 0;
            padding: 0;
        }
        ul{
            border: 1px solid #000;
            height: 100px;
            list-style: none;
        }
        ul li{
            float: left;
            width: 120px;
            height: 40px;
            margin-left: 40px;
            background-color: orange;
        }
        ul li.no1{
            margin-left:20px;
        }
    </style>
</head>
<body>
    <ul>
        <li class="no1"></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
    </ul>
</body>
</html>

解決方案:

1)使浮動的方向和margin的方向,相反。

float: left;
margin-right: 40px;

2)使用hack單獨給隊首的元素,寫一個一半的margin

ul li.no1{_margin-left:20px;}

IE63px bug

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>Document</title>
    <style type="text/css">
        *{
            margin: 0;
            padding: 0;
        }
        div{
            width: 400px;
            height: 400px;
            background-color: orange;
        }
        div p{
            margin-right: 10px;
            float: right;
            width: 100px;
            height: 100px;
            background-color: green;
        }
    </style>
</head>
<body>
    <div>
        <p></p>
    </div>
</body>
</html>

解決辦法:不用管,因為根本就不允許用兒子踹父親。所以,如果出現了3px bug,說明你的代碼不標准。

 

本文非原創,純粹是學習筆記


免責聲明!

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



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