浮動與定位在網頁設計中應用得很普遍,是兩種主要佈局方式的實現方法。css
咱們知道,網頁上通常來講,塊標籤是自上而下的一塊塊堆疊,行內標籤則在一行內從左到右依次並排,若是全部網頁的都這樣機械的排列着,也太單調了,因此有沒有一個東西讓標籤內容脫離這種文檔流呢,首先就能夠考慮float。html
float,使某元素浮動起來,能夠把元素移到,好比瀏覽器邊沿的左邊或右邊,看上去它們就像粘在邊沿上同樣,它下邊的文本則會充斥在它的一邊或者下面,以下例瀏覽器
<!DOCTYPE html> <html> <head> <title>float test</title> <style type="text/css"> /*reset*/ body,div,p,a,ul,li,h1,h2,h3,h4,h5,h6,pre,img{margin:0;padding:0;} .wrap{ width:300px; margin:0 auto; border:2px solid #30c13a; } .wrap .fl{ width:100px; float:left; background-color:#8cceff; } </style> </head> <body> <div class="wrap"> <p class="fl"> The Macintosh Classic is a personal </p> <p> It was the first Apple Macintosh sold under US$1,000. Production of the Classic was prompted by the success of the Macintosh Plus and the SE. </p> </div> </body> </html>
效果ide
float有三個值:left、right、none,向左、向右或者不使用浮動。上邊是向左浮動(藍色背景),跟在它後邊p標籤中的文本沒給任何樣式,原本兩個p標籤中的文本塊會一上一下分段堆疊,加了float left後,下邊p標籤中的文本,就環繞在它周圍,包括下邊和右邊。佈局
通常咱們在設置浮動時會給浮動塊一個寬度,這樣才能顯示浮動的意義,若是任由其充滿在其父元素中一整行就不須要浮動了,可是多的文本又會跑到浮動塊的下邊去,因此讓兩個塊分開來更合理,能夠對右邊環繞的文本塊加一個margin(或者再加一個padding),這個左邊距至少要是浮動塊的盒模型寬度(注意不是左邊元素自己的width屬性值,還包括了它的padding、border和margin),一般比這個寬度略大,好比這裏能夠給右邊那個文本塊設置:margin-left:110px; ,將兩個塊隔離開。優化
由於浮動脫離了html文檔流,因此有時候瀏覽器在計算塊的寬高時,沒有將浮動的模塊算在內,好比下邊這樣網站
<!DOCTYPE html> <html> <head> <title>float test</title> <style type="text/css"> /*reset*/ body,div,p,a,ul,li,h1,h2,h3,h4,h5,h6,pre,img{margin:0;padding:0;} .wrap{ width:300px; margin:0 auto; border:2px solid #30c13a; } .wrap .fl{ width:100px; float:left; background-color:#8cceff; } </style> </head> <body> <div class="wrap"> <p class="main"> It was the first Apple Macintosh sold under US$1,000. Production of the Classic was prompted by the success of the Macintosh Plus and the SE. </p> <p class="fl"> The Macintosh Classic is a personal </p> </div> </body> </html>
效果搜索引擎
就是將上例中的浮動模塊和右邊的文本模塊調換了位置,去掉了右邊文本塊的margin,外圍的類爲wrap的div明明將這個浮動塊包在裏邊,可是網頁上的border邊框能夠看出,高度的計算沒有把它放在裏邊,浮動也跑到外邊去了,所以浮動還要注意的是:若是要讓B圍繞A,且A浮動,在html代碼的組織上,要把A模塊的代碼放在B模塊以前,對於左或右均是如此。spa
浮動的一個經常使用的情形,就是水平導航條了。水平導航條有兩種方式能夠實現,例以下面一種,只要將li標籤的display屬性改成行內樣式,便可讓列表平鋪,這步起核心做用,可是在瞭解盒模型咱們知道,行內標籤的加margin、padding對上下方向是無效的,這裏只能讓列表選項左右拉長,上下卻不受控制,塊級標籤才行。設計
<ul> <li><a href="#">go</a></li> <li><a href="#">some</a></li> <li><a href="#">where</a></li> </ul> li {display:inline;}
採用浮動能夠解決這個問題。首選讓列表中的a標籤成爲塊級標籤,而後向左浮動列表項就水平展現了,一般要先去掉列表前綴樣式。
li{ list-style-type:none; } li a{ margin:5px; display:block; float:left; }
浮動可能產生的問題:
1.元素的border穿浮動塊而過
代碼和效果
<!DOCTYPE html> <html> <head> <title>float test</title> <style type="text/css"> /*reset*/ body,div,p,a,ul,li,h1,h2,h3,h4,h5,h6,pre,img{margin:0;padding:0;} .wrap{ width:400px; height:100px; margin:0 auto; border:2px solid #3c3c3c; } .wrap .banner{ font-size:120%; font-weight:normal; } .wrap .banner{ margin:5px; border: 2px dashed #30c13a; /*overflow:hidden;*/ } .wrap .fr{ float:right; width:100px; color:#fff; margin-left:10px; margin-right:10px; background-color:#c19132; } </style> </head> <body> <div class="wrap"> <div class="fr"> <ul> <li>Apple</li> <li>Google</li> <li>Microsoft</li> </ul> </div> <h1 class="banner"> Welcome To CSS World </h1> </div> </body> </html>
效果
添加overflow後
右上角,標題的邊框穿過了浮動的列表,爲消除這種因背景色或邊框在浮動元素的下方出現的情形,須要使用overflow,咱們知道overflow是文本溢出時採起的措施,好比hidden隱藏多出寬高範圍的文本。具體說是,在.wrap .banner{...}中添加overflow:hidden便可,IE6可能還要加一個zoom:1;(這是一個神奇的IE屬性,解決了好多IE顯示問題~)
2. 只浮動,但不須要環繞
通常的浮動和環繞,代碼
<!DOCTYPE html> <html> <head> <title>float test</title> <style type="text/css"> /*reset*/ body,div,p,a,ul,li,h1,h2,h3,h4,h5,h6,pre,img{margin:0;padding:0;} .wrap{ width:400px; height:136px; margin:0 auto; border:2px solid #3c3c3c; } .wrap .left-sidebar{ width:100px; background-color:#e0c898; text-align:center; float:left; } .wrap .left-sidebar ul{list-style-type:none;} .wrap .main{ margin-left:110px; } .wrap .copyright{ background-color: #000; color:#fff; padding:5px; text-align: center; } </style> </head> <body> <div class="wrap"> <div class="left-sidebar"> <ul> <li>A</li> <li>B</li> <li>C</li> <li>D</li> <li>E</li> <li>F</li> </ul> </div> <div class="main"> <p> The Macintosh Classic is a personal computer that was manufactured by Apple Computer from October 15, 1990 to September 14, 1992. </p> </div> <div class="copyright"> <p>Copyright 1996-2015. Some Inc.</p> </div> </div> </body> </html>
效果
clear清除包圍後
有的網站多是這樣的,左邊一個相似於導航條的東西,浮在瀏覽器左邊,右邊是主要文本內容,假如這個導航條高度比較高,而右邊的文本又很少,因此本該放在頁底的版權聲明跑到文本內容下邊,導航條右邊了。如何解決?就要使用clear屬性,有三個值:left、right、both。好比clear:left,就是在告訴瀏覽器,我不會包圍左浮動的元素,若是是both,則是不包圍左或者右浮動的元素,通常版權聲明始終在頁底,因此咱們能夠在版權的代碼(.wrap .copyright{..})上加上clear:both,效果如右圖(在這裏只須要clear left就行)。
定位,源於網頁設計者想控制網頁上的元素的位置,使它們能放在任何地方,假如你在博客園看某人的博客,好比我這個模板(ThinkInside),會發現頂部導航欄老是懸浮在頂部,即使向下滾動網頁,這就是定位的很好體現。使用Chrome查看它的代碼能夠找到這樣的
使用了position屬性,值爲fixed,即固定,規定了left、right和top屬性,離左邊、右邊和頂部的距離,就完成了定位(其實還與父元素的position屬性有關)。
網頁設計常常遇到像logo放在哪兒,文字如何放到圖片上等,這就是如何以及在何處顯示特定的元素的問題,解決它的屬性---position,一個精確的定位離不開設置它的left、top等屬性。
position有四個屬性值:absolute(絕對定位)、relative(相對定位)、fixed(固定定位)、static(靜態定位)。
首先,靜態定位是position的默認值,即跟隨html文檔流的排列形式,沒有進行定位,它忽略給出的left、right、top、bottom值,以及z-index(若是把網頁看作是水平的,它就是在豎直方向上的值,即所謂的「層」,層越高(z-index值越大)就越被擺放在網頁的外面,裏面的層就被覆蓋掉了)。
絕對定位,經過設置它距離父元素的左、右、上或下的距離,它甚至能夠脫離頁面文檔流。前面介紹float時,咱們看到標題的邊框線穿過了浮動的元素底部,就是因爲浮動元素再也不是html文檔流,因此其餘元素不知道它的存在,對於絕對定位也有可能面臨這種狀況,因此絕對定位的元素能夠覆蓋網頁上其餘的元素,它被擺在外面。
若是使用了絕對定位,而它的父元素裏邊沒有將position屬性設置成absolute或者relative的話,它必定是相對於瀏覽器的邊沿進行定位的,即你設置的left距離左邊界多遠,徹底是相對於瀏覽器的邊界的,必須清楚這一點。舉例
<!DOCTYPE html> <html> <head> <title>float test</title> <style type="text/css"> /*reset*/ body,div,p,a,ul,li,h1,h2,h3,h4,h5,h6,pre,img{margin:0;padding:0;} .wrap{ width:760px; height:630px; margin:0 auto; border:2px solid #c19132; } .wrap .piece{ width:100px; height:60px; background-color:#0092ff; position:absolute; right:0; } </style> </head> <body> <div class="wrap"> <div class="piece"> </div> </div> </body> </html>
效果
從代碼中能夠看到,即使類名爲piece的div就放在類名爲wrap的div中,不出意外它至少也要挨着那個邊框線,可是如今給了它position絕對定位,讓它距離右邊距(right)爲0,它卻跟瀏覽器邊沿挨着了。
相對定位,若是A元素設置了相對定位屬性(position:relative),B是A裏面的子元素,如今要對B進行定位,B將以誰爲參照進行定位呢,答案是A。相對定位就是在告訴它裏面的子元素:若是大家使用position進行位置控制的話,請以我當前的位置爲標準。若是你設置了position:absolute和left:10px,top:5px,那是在距離我(A)的左邊界10像素,上邊界5像素來擺放你。因此相對定位做用的對象是它的子元素,並且它的子元素也要設置position爲absolute,不然子元素的left,right等的屬性沒意義。
固定定位,就像定位屬性開始說的,有時候讓導航一直懸在那裏是爲了方便用戶,還有好比爲了強化公司品牌,將logo一直固定在右上角,也能夠這樣幹。它與設置背景圖片background-attachment設爲fixed時做用同樣,前者是將背景圖片固定,用戶滾動網頁時背景圖片跟着滾動。固定定位IE6不支持,用IEtest打開博客看頂部就能夠看到奇葩效果。
重點:除了靜態定位和相對定位,不能將float屬性與其餘的定位方式同時應用於同一元素。
因此如今,請把一張小圖放在一張大圖上,即所謂的飄浮,就很好辦了。首先,咱們須要的不是相對於瀏覽器邊沿定位,而是放在某個元素中,由於要相對於大圖放置,因此是相對定位,直接用img標籤不能達到效果
<img src="大圖" /> <img src="小圖" />
因img是自開自閉標籤,相對定位屬性是對子元素起做用,難道把一個img放在另外一個img裏面?固然不行,方法就是在兩個img外面加個div包起來,使小圖相對於這個父元素div來定位。代碼
<!DOCTYPE html> <html> <head> <title>float test</title> <style type="text/css"> /*reset*/ body,div,p,a,ul,li,h1,h2,h3,h4,h5,h6,pre,img{margin:0;padding:0;} .pt{ /*父元素設置相對定位,使子元素相對於它偏移*/ position:relative; } .pt .smallimg{ /*子元素相對於父元素絕對定位*/ position:absolute; top: 30px; left:60px; } </style> </head> <body> <div class="pt"> <!-- 大圖 --> <img src="./image/blue.png" /> <!-- 小圖 --> <img class="smallimg" src="./image/doraemon.png" /> </div> </body> </html>
效果
其餘的文字飄浮、什麼定位差很少同一個道理,若是想對定位元素相互覆蓋的話,設置一個z-index屬性,越大的就會越在網頁表面,從而拒絕被覆蓋。
須要注意的是,與定位相關的left、right、top、bottom屬性均可以給負值,能夠制形成它們像懸在某一個塊的邊界上那樣的效果,一半在裏面,一半在外面。
OK,既然浮動與定位均可以使圖片、文本等元素位移,假如讓一個大的div位移呢?這就牽涉到網頁的佈局設計了。不少我的網站,好比某些博客,是經典的三欄設計
頁面設計 代碼順序
banner裏邊放logo,暱稱,簽名 or whatever,左邊放導航,右邊放說明,主要內容展現在中間(隨便說的),底下再標識版權(記得clear both)。有兩種可選的方案是:
一,left-sidebar:向左浮動,right-sidebar像右浮動,main設置好margin-left和margin-right;二,left-sidebar和main均向左浮動,right-sidebar向右浮動,固然main仍是要設置margin的。使用float的佈局,有的稱爲「流式設計」。而一般會把wrap整個給一個固定寬度,如960px,居中,而後再對其中的div浮動。它的html代碼順序相對於佈局基本同步(上右圖),注意float的塊要放在圍繞它的塊的前面。
等全部作好後,可能再就是針對不一樣的屏幕尺寸用@media作下適配,基本就能夠用了(若是不考慮IE的話)(說得簡單其實偶還不會=_=#)。
還有一種稱爲固定寬度設計,不管屏幕多大,先劃分好全部的大小塊,給一個固定的寬度,這樣作起來比較簡單。頁面設計和代碼順序均和上面同樣。
還記得盒模型中說過嗎?css有的屬性能夠給負值,如margin、left。給一個足夠的負值,它能夠「越過」它前面的元素,跑到它前面去,這在網頁優化時頗有用,能夠將一部分體現網頁內容的更多的暴露給搜索引擎。清楚了position定位後,就能夠實現。一樣是上面的頁面設計,它的代碼順序多是這樣的
main主要內容在更前面,若是直接按文檔流走的話,達不到上面頁面設計的效果,因此咱們能夠給left-sidebar的left給一個負值,假設#main的盒模型寬度是480px,注意不是它的width屬性值,要算上left/right padding + left/right border + left/right margin及width的和,給#left-sidebar使用絕對定位,left值給這個寬度值的負數,這樣在頁面上看上去它在#main的左邊,而#main這個塊給一個margin-left值,由於要避免被定位偏移後的#left-sidebar覆蓋(#left-sidebar使用絕對定位後脫離了文檔流),這個值是整個#left-sidebar這個div的盒模型寬度,或者再大一點,使它們之間邊間清晰。這是對整個大div的定位。
經過定位徹底能夠達到跟浮動同樣的效果,就看你想不想進一步玩玩。