元素分類
在講解CSS佈局之前,我們需要提前知道一些知識,在CSS中,html中的標籤元素大體被分爲三種不同的類型:塊狀元素、內聯元素(又叫行內元素)和內聯塊狀元素。
常用的塊狀元素有:
<div>、<p>、<h1>...<h6>、<ol>、<ul>、<dl>、<table>、<address>、<blockquote> 、<form>
常用的內聯元素有:
<a>、<span>、<br>、<i>、<em>、<strong>、<label>、<q>、<var>、<cite>、<code>
常用的內聯塊狀元素有:
<img>、<input>
元素分類--塊級元素
什麼是塊級元素?在html中<div>、 <p>、<h1>、<form>、<ul> 和 <li>就是塊級元素。設置display:block
就是將元素顯示爲塊級元素。如下代碼就是將內聯元素a轉換爲塊狀元素,從而使a元素具有塊狀元素特點。
a{display:block;}
塊級元素特點:
1、每個塊級元素都從新的一行開始,並且其後的元素也另起一行。(真霸道,一個塊級元素獨佔一行)
2、元素的高度、寬度、行高以及頂和底邊距都可設置。
3、元素寬度在不設置的情況下,是它本身父容器的100%(和父元素的寬度一致),除非設定一個寬度。
元素分類--內聯元素
在html中,<span>、<a>、<label>、<input>、 <img>、 <strong> 和<em>就是典型的內聯元素(行內元素)(inline)元素。當然塊狀元素也可以通過代碼display:inline
將元素設置爲內聯元素。如下代碼就是將塊狀元素div轉換爲內聯元素,從頁使用div元素具有內聯元素特點。
內聯元素特點:
1、和其他元素都在一行上;
2、元素的高度、寬度、行高及頂部和底部邊距不可設置;
3、元素的寬度就是它包含的文字或圖片的寬度,不可改變。
小夥伴們你們觀查一下右側代碼段,有沒有發現一個問題,內聯元素之間有一個間距問題,這個問題在本小節的wiki中有介紹,感興趣的小夥伴可以去查看。
解決行內元素間隙bug問題
行內元素之間會產生間隙bug問題的場景:
1、當行內元素之間有“回車”、“tab”、“空格”時就會出現間隙。
如下代碼:
<a>1</a>
<a>2</a>
<span>33333</span>
<span>44444</span>
<em>555555</em>
</div>
解決方法:
1、寫在一行,之間不要有空格之類的符號。
<a>1</a><a>2</a><span>33333</span><span>44444</span><em>555555</em>
</div>
2、使用font-size:0
a,span,em{font-size:16px;}
網上還有很多有趣的方法可解決這個bug感興趣的小夥伴們快去搜索一下吧。
元素分類--內聯塊狀元素
內聯塊狀元素(inline-block)就是同時具備內聯元素、塊狀元素的特點,代碼display:inline-block
就是將元素設置爲內聯塊狀元素。(css2.1新增),<img>、<input>標籤就是這種內聯塊狀標籤。
inline-block元素特點:
1、和其他元素都在一行上;
2、元素的高度、寬度、行高以及頂和底邊距都可設置。
盒模型--邊框(一)
盒子模型的邊框就是圍繞着內容及補白的線,這條線你可以設置它的粗細、樣式和顏色(邊框三個屬性)。
如下面代碼爲div來設置邊框粗細爲2px、樣式爲實心的、顏色爲紅色的邊框:
div{ border:2px solid red; }
上面是border代碼的縮寫形式,可以分開寫:
div{ border-width:2px; border-style:solid; border-color:red; }
注意:
1、border-style(邊框樣式)常見樣式有:
dashed(虛線)| dotted(點線)| solid(實線)。
2、border-color(邊框顏色)中的顏色可設置爲十六進制顏色,如:
border-color:#888;//前面的井號不要忘掉。
3、border-width(邊框寬度)中的寬度也可以設置爲:
thin | medium | thick(但不是很常用),最常還是用象素(px)。
盒模型--邊框(二)
現在有一個問題,如果有想爲p標籤單獨設置下邊框,而其它三邊都不設置邊框樣式怎麼辦呢?css樣式中允許只爲一個方向的邊框設置樣式:
div{border-bottom:1px solid red;}
同樣可以使用下面代碼實現其它三邊上、右、左邊框的設置:
border-top:1px solid red; border-right:1px solid red; border-left:1px solid red;
盒模型--寬度和高度
盒模型寬度和高度和我們平常所說的物體的寬度和高度理解是不一樣的,css內定義的寬(width)和高(height),指的是填充以裏的內容範圍。
因此一個元素實際寬度(盒子的寬度)=左邊界+左邊框+左填充+內容寬度+右填充+右邊框+右邊界。
元素的高度也是同理。
比如:
css代碼:
div{ width:200px; padding:20px; border:1px solid red; margin:10px; }
html代碼:
<body> <div>文本內容</div> </body>
元素的實際長度爲:10px+1px+20px+200px+20px+1px+10px=262px。在chrome瀏覽器下可查看元素盒模型,如下圖:
盒模型--填充
元素內容與邊框之間是可以設置距離的,稱之爲“填充”。填充也可分爲上、右、下、左(順時針)。如下代碼:
div{padding:20px 10px 15px 30px;}
順序一定不要搞混。可以分開寫上面代碼:
div{ padding-top:20px; padding-right:10px; padding-bottom:15px; padding-left:30px; }
如果上、右、下、左的填充都爲10px;可以這麼寫
div{padding:10px;}
如果上下填充一樣爲10px,左右一樣爲20px,可以這麼寫:
div{padding:10px 20px;}
盒模型--邊界
元素與其它元素之間的距離可以使用邊界(margin)來設置。邊界也是可分爲上、右、下、左。如下代碼:
div{margin:20px 10px 15px 30px;}
也可以分開寫:
div{ margin-top:20px; margin-right:10px; margin-bottom:15px; margin-left:30px; }
如果上右下左的邊界都爲10px;可以這麼寫:
div{ margin:10px;}
如果上下邊界一樣爲10px,左右一樣爲20px,可以這麼寫:
div{ margin:10px 20px;}
總結一下:padding和margin的區別,padding在邊框裏,margin在邊框外。
css佈局模型
清楚了CSS 盒模型的基本概念、 盒模型類型, 我們就可以深入探討網頁佈局的基本模型了。佈局模型與盒模型一樣都是 CSS 最基本、 最核心的概念。 但佈局模型是建立在盒模型基礎之上,又不同於我們常說的 CSS 佈局樣式或 CSS 佈局模板。如果說佈局模型是本,那麼 CSS 佈局模板就是末了,是外在的表現形式。
CSS包含3種基本的佈局模型,用英文概括爲:Flow、Layer 和 Float。
在網頁中,元素有三種佈局模型:
1、流動模型(Flow)
2、浮動模型 (Float)
3、層模型(Layer)
流動模型(一)
先來說一說流動模型,流動(Flow)是默認的網頁佈局模式。也就是說網頁在默認狀態下的 HTML 網頁元素都是根據流動模型來分佈網頁內容的。
流動佈局模型具有2個比較典型的特徵:
第一點,塊狀元素都會在所處的包含元素內自上而下按順序垂直延伸分佈,因爲在默認狀態下,塊狀元素的寬度都爲100%。實際上,塊狀元素都會以行的形式佔據位置。如右側代碼編輯器中三個塊狀元素標籤(div,h1,p)寬度顯示爲100%。
流動模型(二)
第二點,在流動模型下,內聯元素都會在所處的包含元素內從左到右水平分佈顯示。(內聯元素可不像塊狀元素這麼霸道獨佔一行)
右側代碼編輯器中內聯元素標籤a、span、em、strong都是內聯元素。
浮動模型
塊狀元素這麼霸道都是獨佔一行,如果現在我們想讓兩個塊狀元素並排顯示,怎麼辦呢?不要着急,設置元素浮動就可以實現這一願望。任何元素在默認情況下是不能浮動的,但可以用CSS定義爲浮動,如div、p、table、img等元素都可以被定義爲浮動。如下代碼可以實現兩個div元素一行顯示。
div{
width:200px;
height:200px;
border:2px red solid;
float:left;
}
<div id="div1"></div>
<div id="div2"></div>
效果圖
當然你也可以同時設置兩個元素右浮動也可以實現一行顯示。
div{
width:200px;
height:200px;
border:2px red solid;
float:right;
}
效果圖
又有小夥伴問了,設置兩個元素一左一右可以實現一行顯示嗎?當然可以:
div{ width:200px; height:200px; border:2px red solid; } #div1{float:left;} #div2{float:right;}
效果圖
什麼是層模型?
什麼是層佈局模型?層佈局模型就像是圖像軟件PhotoShop中非常流行的圖層編輯功能一樣,每個圖層能夠精確定位操作,但在網頁設計領域,由於網頁大小的活動性,層佈局沒能受到熱捧。但是在網頁上局部使用層佈局還是有其方便之處的。下面我們來學習一下html中的層佈局。
如何讓html元素在網頁中精確定位,就像圖像軟件PhotoShop中的圖層一樣可以對每個圖層能夠精確定位操作。CSS定義了一組定位(positioning)屬性來支持層佈局模型。
層模型有三種形式:
1、絕對定位(position: absolute)
2、相對定位(position: relative)
3、固定定位(position: fixed)
層模型--絕對定位
如果想爲元素設置層模型中的絕對定位,需要設置position:absolute(表示絕對定位),這條語句的作用將元素從文檔流中拖出來,然後使用left、right、top、bottom屬性相對於其最接近的一個具有定位屬性的父包含塊進行絕對定位。如果不存在這樣的包含塊,則相對於body元素,即相對於瀏覽器窗口。
如下面代碼可以實現div元素相對於瀏覽器窗口向右移動100px,向下移動50px。
div{
width:200px;
height:200px;
border:2px red solid;
position:absolute;
left:100px;
top:50px;
}
<div id="div1"></div>
效果如下:
層模型--相對定位
如果想爲元素設置層模型中的相對定位,需要設置position:relative(表示相對定位),它通過left、right、top、bottom屬性確定元素在正常文檔流中的偏移位置。相對定位完成的過程是首先按static(float)方式生成一個元素(並且元素像層一樣浮動了起來),然後相對於以前的位置移動,移動的方向和幅度由left、right、top、bottom屬性確定,偏移前的位置保留不動。
如下代碼實現相對於以前位置向下移動50px,向右移動100px;
#div1{ width:200px; height:200px; border:2px red solid; position:relative; left:100px; top:50px; } <div id="div1"></div>
效果圖:
什麼叫做“偏移前的位置保留不動”呢?
大家可以做一個實驗,在右側代碼編輯器的19行div標籤的後面加入一個span標籤,在標並在span標籤中寫入一些文字。如下代碼:
<body> <div id="div1"></div><span>偏移前的位置還保留不動,覆蓋不了前面的div沒有偏移前的位置</span> </body>
效果圖:
從效果圖中可以明顯的看出,雖然div元素相對於以前的位置產生了偏移,但是div元素以前的位置還是保留着,所以後面的span元素是顯示在了div元素以前位置的後面。
層模型--固定定位
fixed:表示固定定位,與absolute定位類型類似,但它的相對移動的座標是視圖(屏幕內的網頁窗口)本身。由於視圖本身是固定的,它不會隨瀏覽器窗口的滾動條滾動而變化,除非你在屏幕中移動瀏覽器窗口的屏幕位置,或改變瀏覽器窗口的顯示大小,因此固定定位的元素會始終位於瀏覽器窗口內視圖的某個位置,不會受文檔流動影響,這與background-attachment:fixed;屬性功能相同。以下代碼可以實現相對於瀏覽器視圖向右移動100px,向下移動50px。並且拖動滾動條時位置固定不變。
#div1{ width:200px; height:200px; border:2px red solid; position:fixed; left:100px; top:50px; } <p>文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本。</p> ....
Relative與Absolute組合使用
使用position:absolute
可以實現被設置元素相對於瀏覽器(body)設置定位以後,大家有沒有想過可不可以相對於其它元素進行定位呢?答案是肯定的,當然可以。使用position:relative來幫忙,但是必須遵守下面規範:
1、參照定位的元素必須是相對定位元素的前輩元素:
<div id="box1"><!--參照定位的元素--> <div id="box2">相對參照元素進行定位</div><!--相對定位元素--> </div>
從上面代碼可以看出box1是box2的父元素(父元素當然也是前輩元素了)。
2、參照定位的元素必須加入position:relative;
#box1{
width:200px;
height:200px;
position:relative;
}
3、定位元素加入position:absolute,便可以使用top、bottom、left、right來進行偏移定位了。
#box2{
position:absolute;
top:20px;
left:30px;
}
這樣box2就可以相對於父元素box1定位了(這裏注意參照物就可以不是瀏覽器了,而可以自由設置了)。
盒模型代碼簡寫
還記得在講盒模型時外邊距(margin)、內邊距(padding)和邊框(border)設置上下左右四個方向的邊距是按照順時針方向設置的:上右下左。具體應用在margin和padding的例子如下:
margin:10px 15px 12px 14px;/*上設置爲10px、右設置爲15px、下設置爲12px、左設置爲14px*/
通常有下面三種縮寫方法:
1、如果top、right、bottom、left的值相同,如下面代碼:
margin:10px 10px 10px 10px;
可縮寫爲:
margin:10px;
2、如果top和bottom值相同、left和 right的值相同,如下面代碼:
margin:10px 20px 10px 20px;
可縮寫爲:
margin:10px 20px;
3、如果left和right的值相同,如下面代碼:
margin:10px 20px 30px 20px;
可縮寫爲:
margin:10px 20px 30px;
注意:padding、border的縮寫方法和margin是一致的。
顏色值縮寫
關於顏色的css樣式也是可以縮寫的,當你設置的顏色是16進制的色彩值時,如果每兩位的值相同,可以縮寫一半。
例子1:
p{color:#000000;}
可以縮寫爲:
p{color: #000;}
例子2:
p{color: #336699;}
可以縮寫爲:
p{color: #369;}
字體縮寫
網頁中的字體css樣式代碼也有他自己的縮寫方式,下面是給網頁設置字體的代碼:
body{ font-style:italic; font-variant:small-caps; font-weight:bold; font-size:12px; line-height:1.5em; font-family:"宋體",sans-serif; }
這麼多行的代碼其實可以縮寫爲一句:
body{ font:italic small-caps bold 12px/1.5em "宋體",sans-serif; }
注意:
1、使用這一簡寫方式你至少要指定 font-size 和 font-family 屬性,其他的屬性(如 font-weight、font-style、font-varient、line-height)如未指定將自動使用默認值。
2、在縮寫時 font-size 與 line-height 中間要加入“/”斜扛。
一般情況下因爲對於中文網站,英文還是比較少的,所以下面縮寫代碼比較常用:
body{ font:12px/1.5em "宋體",sans-serif; }
只是有字號、行間距、中文字體、英文字體設置。