文檔流、Position介紹
一、文檔流
1.首先我們要了解什麼是标準文檔流
HTML頁面的标準文檔流(預設布局)是:從上到下,從左到右,遇塊(塊級元素)換行。
2.然後我們要知道塊級元素和行内元素有哪些
- 塊級元素
- 獨占一行,不能與其他元素共處一行。
- 可以寬和高。
- 如果不設定寬度,那麼寬度将預設變為父親的100%,即和父親一樣寬 。
- div, form, table, p, pre, h1~h6, dl, ol, ul等。
- 行内元素
- 與其他元素處在同一行。
- 不可以設定寬和高,即width和height屬性對其無效。
- span,a,strong, em, label, input, select, textarea, img, br。
溫馨小提示:
(1).容器級的标簽,裡面可以放置任何東西(div、p、li等);文本級的标簽裡面,隻能放置文字、圖檔、表單元素。
(2).p标簽是一個文本級标簽。p裡面隻能放文字、圖檔、表單元素。其他的一律不能放。
(3).定義清單是一個組标簽,不過比較複雜,出現了三個标簽:
dl表示definition list 定義清單
dt表示definition title 定義标題
dd表示definition description 定義表述詞
dt、dd隻能在dl裡面;dl裡面隻能有dt、dd
3.塊級元素與行内元素的轉換
塊級元素可以設定為行内元素;
行内元素也可以設定為塊級元素。
-
display: block 設定屬性為塊級元素
未更改前樣式
span{
display: block;
width: 300px;
height: 30px;
border: 1px solid red;
}
很明顯行内元素不能設定高度和寬度以及不會獨占一行,經過改變以後擁有塊級元素的特性
- display: inline 設定屬性為行内元素
我們發現從原來的塊級元素獨占一行變成共處一行,且不能設定寬和高,明顯的行内元素特性p{ display: inline; width: 50px; height: 100px; background-color: skyblue; }
-
display:inline-block
将對象呈現為inline對象,但是對象的内容作為block對象呈現。之後的内聯對象會被排列在同一行内。比如我們可以給一個link(a元素)inline-block屬性值,使其既具有block的寬度高度特性又具有inline的同行特性。
p{ display: inline-block; width: 50px; height: 100px; background-color: skyblue; }
我們可以看到内容顯示為共處一行,但是同時又可以設定高與寬
二、脫離文檔流
也就是将元素從普通的布局排版中拿走,其他盒子在定位的時候,會當做脫離文檔流的元素不存在而進行定位。
1.首先要了解position定位方式
- absolute: 生成絕對定位的元素,相對于static定位以外的第一個父元素進行定位。元素的位置通過left,top,right以及bottom屬性進行規定。
- fixed: 生成絕對定位的元素,相對于浏覽器視窗進行定位。元素的位置通過left、top、right以及bottom屬性進行規定。
- relative: 生成相對定位的元素,相對于其正常位置進行定位。
- static: 預設值。沒有定位,元素出現在正常的流中(忽略 top, bottom, left, right 或者 z-index 聲明)。
- inherit: 規定應該從父元素繼承 position 屬性的值。
relative
relative使相對于正常文本流中的位置進行偏移
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus®">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>Document</title>
<style type="text/css">
#item1 {
width:100px;
height:100px;
background-color:green;
}
#item2 {
width:100px;
height:100px;
background-color:red;
}
</style>
</head>
<body>
<div id="content">
<div id="item1" >item1</div>
<div id="item2">item2</div>
</div>
</body>
</html>
效果圖
若将上述的css樣式改為
#item2 {
width:100px;
height:100px;
background-color:red;
position:relative; //相對定位
left:20px;
top:20px;
}
總結:relative是相對正常文檔流的位置進行偏移,原先占據的位置依然存在,也就是說它不會影響後面元素的位置。left表示相對原先位置右邊進行偏移,top表示相對原先位置下邊進行偏移。當left和right同時存在,僅left有效,當top和bottom同時存在僅top有效。relative的偏移是基于對象的margin左上側的。
absolute
為了友善我們進行觀察,現将上述原始網頁代碼最外層div加上margin值
#content{
margin-left: 100px;
margin-top: 100px;
}
我們注釋掉先前對item的position:relative,正常顯示如下
當我們修改position:absolute時
#item2 {
width:100px;
height:100px;
background-color:red;
position:absolute;
left:20px;
top:20px;
}
顯示效果如下
由此可見當父級元素的position屬性值為預設值時(static),absolute是相對于浏覽器視窗進行定位的。
如果設定content的position屬性值為非預設值,那麼absolute就是相對于該父級元素進行定位。
接下來我們設定父容器content的position為相對定位relative試試
#content{
margin-left: 100px;
margin-top: 100px;
position: relative;
border:5px solid black;//為了友善觀察為父容器設定個邊框
}
讓我們來看看效果吧
當我們把父容器的position設定為absolute
#content{
margin-left: 100px;
margin-top: 100px;
position: absolute;
border:5px solid black;
}
原來為改變前的樣式
改變後的樣式
注意到變化了嗎,當把外層父容器div設定為absolute時,外層div寬度由原來的100%變為auto.
- 當把一個元素position屬性設定為absolute或fixed的時候,會發生三件事:
- 把該元素往 Z 軸方向移了一層,元素脫離了普通流,是以不再占據原來那層的空間,還會覆寫下層的元素,簡稱脫離文檔流。
- 該元素将變為塊級元素,相當于給該元素設定了 display: block;(給一個内聯元素,如 ,設定 absolute 之後發現它可以設定寬高了)。
- 如果該元素是塊級元素,元素的寬度由原來的 width: 100%(占據一行),變為了 auto。
我們此時要注意一點就是我們如果給父容器設定了padding,margin,border等屬性
我們嘗試去給父容器寫一個padding,看看上面的圖有沒有什麼變化
#content{
margin-left: 100px;
margin-top: 100px;
position: absolute;
padding: 20px;
border:5px solid black;
}
由此可見,如果parent設定了margin,border,padding等屬性,那麼這個定位點将忽略padding,将會從padding開始的地方(即隻從padding的左上角開始)進行定位,這與我們會想當然的以為會以margin的左上端開始定位的想法是不同的.
fixed
生成絕對定位的元素,相對于浏覽器視窗進行定位,特殊的絕對定位
其餘兩個我不進行描述了大緻如上面介紹一般
我們發現能使脫離文檔流的定位方式有absolute和fixed
三、float屬性(魔鬼)
浮動可以了解為讓某個div元素脫離标準流,漂浮在标準流之上,和标準流不是一個層次。
我們先來設定四個小div吧
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus®">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>Document</title>
<style type="text/css">
.d1{
width: 400px;
height: 150px;
border: 3px solid black;
background-color: red;
}
.d2{
width: 320px;
height: 100px;
border: 3px solid black;
background-color: green;
}
.d3{
width: 200px;
height: 140px;
border: 3px solid black;
background-color: orange;
}
.d4{
width: 300px;
height: 110px;
border: 3px solid black;
background-color: skyblue;
}
</style>
</head>
<body>
<div class="d1">div1</div>
<div class="d2">div2</div>
<div class="d3">div3</div>
<div class="d4">div4</div>
</body>
</html>
我們先看看他的初始效果
當我們嘗試給div2加上float屬性時
float: left
.d2{
width: 320px;
height: 100px;
border: 3px solid black;
background-color: green;
float: left;
}
float: right
如果我們同時給div2和div3加上float:left呢
讓它們同時向左浮動
.d2{
width: 320px;
height: 100px;
border: 3px solid black;
background-color: green;
float: right;
}
.d3{
width: 200px;
height: 140px;
border: 3px solid black;
background-color: orange;
float: left;
}
如果我們同時給他們加上float:right呢
讓他們同時向右浮動
.d2{
width: 320px;
height: 100px;
border: 3px solid black;
background-color: green;
float: right;
}
.d3{
width: 200px;
height: 140px;
border: 3px solid black;
background-color: orange;
float: right;
}
當同時對div2、div3設定浮動之後,div3會跟随在div2之後,但其實一直到現在,div2在每個例子中都是浮動的,但并沒有跟随到div1之後。是以,我們可以得出一個重要結論:
假如某個div元素A是浮動的,如果A元素上一個元素也是浮動的,那麼A元素會跟随在上一個元素的後邊(如果一行放不下這兩個元素,那麼A元素會被擠到下一行);如果A元素上一個元素是标準流中的元素,那麼A的相對垂直位置不會改變,也就是說A的頂部總是和上一個元素的底部對齊。
div的順序是HTML代碼中div的順序決定的。靠近頁面邊緣的一端是前,遠離頁面邊緣的一端是後。
有關清楚浮動以及浮動的其他知識還有很多,這個僅僅是其中的一小部分,後面還要繼續整理