Single-Column Layout
這是第一段
This is a Second-Level Heading
這是第二段
摘要:屬性是中最重要的用于控制布局的屬性。布局的高度多數(shù)情況下,布局中結(jié)構(gòu)化元素乃至任何元素的高度是不必設(shè)定的。更新效果如圖以上措施使布局有了明顯改觀。
display 屬性這是《CSS設(shè)計指南》的讀書筆記,用于加深學(xué)習(xí)效果。
display是 CSS 中最重要的用于控制布局的屬性。每個元素都有一個默認(rèn)的 display 值。對于大多數(shù)元素它們的默認(rèn)值通常是 block 或 inline 。一個 block 元素通常被叫做塊級元素。一個 inline 元素通常被叫做行內(nèi)元素。
blockdiv 是一個標(biāo)準(zhǔn)的塊級元素。一個塊級元素會新開始一行并且盡可能撐滿容器。其他常用的塊級元素包括 p 、 form 和HTML5中的新元素: header 、 footer 、 section 等等。
inlineimg 是一個標(biāo)準(zhǔn)的行內(nèi)元素。你可以把兩個 標(biāo)簽寫在兩行,但這并不影響圖片再瀏覽器中的顯示效果,它們會并列出現(xiàn)在一行上。而且標(biāo)簽直接的空白(標(biāo)記中的兩個
標(biāo)簽雖然分別位于兩行,但這并不影響圖片在瀏覽器中顯示時的效果。圖片是行內(nèi)元素,所以它們顯示的時候就會并列出現(xiàn)在一行上。而且,標(biāo)簽之間的空白(包括制表、回車和空格)都會被瀏覽器忽略。
a 元素是最常用的行內(nèi)元素,它可以被用作鏈接。
none另一個常用的 display 值是 none。一些特殊元素的默認(rèn) display 值是它,例如script。display:none 通常被 JavaScript 用來在不刪除元素的情況下隱藏或顯示元素。
把display設(shè)置為 none,該元素及所有包含在其中的元素,都不會在頁面中顯示。它們原來占據(jù)的空間也會被回收。
其他 display 值相對的屬性是 visibility,這個屬性常用的值是 visible(默認(rèn))和 hidden。把元素的 visibility 設(shè)定為 hidden,元素會隱藏,但它占據(jù)的空間仍然存在。
還有很多的更有意思的 display 值,幾乎所有HTML元素的display屬性值要么為block,要么為inline。最明顯的一個例外是table元素,它有自己特殊的display屬性值。這里有一份詳細(xì)的列表。
塊級元素(比如標(biāo)題和段落)會相互堆疊在一起沿頁面向下排列,每個元素分別占一行。而行內(nèi)元素(比如鏈接和圖片)則會相互并列,只有在空間不足以并列的情況下才會折到下一行顯示 。
塊級元素和行內(nèi)元素是可以互相轉(zhuǎn)化的:
/*默認(rèn)為塊級元素*/ p {display: inline;} /*默認(rèn)為行內(nèi)元素*/ a {display: block;}
屬性了 display 屬性之后,我們來看下頁面布局:
布局的基本概念多欄布局有三種基本的實現(xiàn)方案:固定寬度、流動、 彈性。
固定寬度布局的大小不會隨用戶調(diào)整瀏覽器窗口大小而變化,一般是900到1100像素寬。其中960像素是最常見的,因為這個寬度適合所有現(xiàn)代顯示器,而且能夠被16、12、10、8、6、5、4和3整除,不僅容易計算等寬分欄的數(shù)量,而且計算結(jié)果也能得到?jīng)]有小數(shù)的像素數(shù)。
流動布局的大小會隨用戶調(diào)整瀏覽器窗口大小而變化。這種布局能夠更好地適應(yīng)大屏幕,但同時也意味著放棄對頁面某些方面的控制,比如隨著頁面寬度變化,文本行的長度和頁面元素之間的位置關(guān)系都可能變化。Amazon.com的頁面采用的就是流動中欄布局,在各欄寬度加大時通過為內(nèi)容元素周圍添加空白來保持內(nèi)容居中,而且現(xiàn)在的導(dǎo)航條會在布局變窄到某個寬度時收縮進(jìn)一個下拉菜單中,從而為內(nèi)容騰出空間。
彈性布局與流動布局類似,在瀏覽器窗口變寬時,不僅布局變寬,而且所有內(nèi)容元素的大小也會變化,讓人產(chǎn)生一種所有東西都變大了的感覺。
布局的高度多數(shù)情況下,布局中結(jié)構(gòu)化元素(乃至任何元素)的高度是不必設(shè)定的。事實上,我甚至想告訴你根本不應(yīng)該給元素設(shè)定高度。除非你確實需要這樣做,比如在頁面中創(chuàng)造一個絕對定位的元素。
布局的寬度為什么正常情況下都應(yīng)該保持元素height屬性的默認(rèn)值auto不變呢?很簡單,只有這樣元素才能隨自己包含內(nèi)容的增加而在垂直方向上擴(kuò)展。這樣擴(kuò)展的元素會把下方的元素向下推,而布局也能隨著內(nèi)容數(shù)量的增減而垂直伸縮。假如你明確設(shè)定了元素的高度,那么超出的內(nèi)容要么被剪掉,要么會跑到容器之外——取決于元素overflow屬性的設(shè)定。
與高度不同,我們需要更精細(xì)地控制布局寬度,以便隨著瀏覽器窗口寬度的合理變化,布局能夠作出適當(dāng)?shù)恼{(diào)整,確保文本行不會過長或過短。如果隨意給元素添加內(nèi)邊距、邊框,或者元素本身過大,導(dǎo)致浮動元素的寬度超過包含元素的布局寬度,那浮動元素就可能“躲”到其他元素下方。應(yīng)該讓這些內(nèi)容元素自動擴(kuò)展到填滿欄的寬度。(這是塊級元素的默認(rèn)行為)
三欄-固定寬度布局我們先從一個簡單的居中的單欄布局開始吧??聪旅?HTML 代碼,主要標(biāo)記的 ID 是 wrapper:
Single-Column Layout
這是第一段
This is a Second-Level Heading
這是第二段
布局相關(guān) css 如下:
#wrapper { width:960px; margin:0 auto; border:1px solid; } article { background:#ffed53; }
如圖所示,通過給外包裝設(shè)定寬度值,并將其水平外邊距設(shè)定為 auto,這個單欄布局在頁面上居中了。隨著向里添加內(nèi)容,這一欄的高度會相應(yīng)增加。外包裝中的article元素本質(zhì)上就是一個沒有寬度的塊級盒子(關(guān)于“沒有寬度的盒子”,請參見3.2節(jié)),它水平擴(kuò)展填滿了外包裝。
下面,我們再向外包裝里添加一個導(dǎo)航元素,讓它作為第二欄。
HTML 代碼如下:
Single-Column Layout
這是第一段
This is a Second-Level Heading
這是第二段.
這里我們將兩欄都添加float: left,以讓它們并排顯示。
#wrapper { width:960px; margin:0 auto; border:1px solid; overflow:hidden; } nav { width:150px; float:left; /*浮動*/ background:#dcd9c0; } nav li { /*去掉列表項目符號*/ list-style-type:none; } article { width:810px; float:left; /*浮動*/ background:#ffed53; }
這里我們把兩欄的總寬度設(shè)定為外包裝的寬度(150+810=960),并浮動它們,就可以創(chuàng)造出并肩排列的兩欄來。每一欄的長度取決于內(nèi)容多少。
接下來我們添加第三欄。
Single-Column Layout
這是第一段
This is a Second-Level Heading
這是第二段.
接下來我們調(diào)整一下 article 這一欄的寬度,為第三欄騰出空間
#wrapper { width:960px; margin:0 auto; border:1px solid; overflow:hidden; } nav { width:150px; float:left; background:#dcd9c0; } article { width:600px; float:left; background:#ffed53; } aside { width:210px; float:left; background:#3f7ccf; }
如圖所示,通過把三個浮動容器的總寬度設(shè)定為恰好等于外包裝的寬度(150+600+210=960),就有了三欄布局的框架。
現(xiàn)在我們再添加一個頁眉和頁腳:
A Fixed-Width Layout
Single-Column Layout
這是第一段
This is a Second-Level Heading
這是第二段.
為了讓頁腳在最下一欄不浮動到 aside 后邊,我們?yōu)轫撃_應(yīng)用clear:both,以組織它向上移動。
css 樣式如下:
* {margin:0; padding:0;} #wrapper { width:960px; margin:0 auto; border:1px solid; } header { background:#f00; } nav { width:150px; float:left; background:#dcd9c0; } nav li { list-style-type:none; } article { width:600px; float:left; background:#ffed53; } aside { width:210px; float:left; background:#3f7ccf; } footer { clear:both; background:#000; }
現(xiàn)在效果如圖:
現(xiàn)在各欄太擁擠,每欄的高度也都由文本內(nèi)容決定,我們現(xiàn)在修改一下,為內(nèi)容間加上空白。
為欄設(shè)定內(nèi)邊距和邊距為了讓內(nèi)容與欄邊界空開距離,為欄添加水平外邊距和內(nèi)邊距,但這樣會導(dǎo)致布局寬度增大,進(jìn)而浮動欄下滑。
比如,我們給 article 增加內(nèi)邊距:
article { width: 600px; float: left; background: #ffed53; padding: 10px 20px; }
效果如圖:
由于增加了內(nèi)邊距導(dǎo)致article的總寬度增加,導(dǎo)致右邊的欄不能再與前兩排并列在一起。有三種方法來預(yù)防改問題發(fā)生:
從設(shè)定的元素寬度中減去添加的水平外邊距、邊框和內(nèi)邊距的寬度和。
在容器內(nèi)部的元素上添加內(nèi)邊距或外邊距。
使用CSS3的box-sizing屬性切換盒子縮放方式,比如section {box-sizing:border-box;} 。 應(yīng)用box-sizing屬性后,給section添加邊框和內(nèi)邊距都不會增大盒子,相反會導(dǎo)致內(nèi)容變窄。
重設(shè)寬度以抵消內(nèi)邊距和邊框一個代代相傳的解決方案是通過數(shù)學(xué)計算。CSS開發(fā)者需要用比他們實際想要的寬度小一點(diǎn)的寬度,需要減去內(nèi)邊距和邊框的寬度。比如我們給600像素寬的中間欄增加了20像素的內(nèi)邊距,為了抵消增加的內(nèi)邊距,可以把欄減少40像素而設(shè)定為560像素。值得慶幸地是你不需要再這么做了...
給容器內(nèi)部元素應(yīng)用內(nèi)邊距和邊框把外邊距和內(nèi)邊距應(yīng)用到內(nèi)容元素上確實有效,不過這樣的前提是這些元素沒有明確的設(shè)定寬度,這樣內(nèi)容才會隨內(nèi)外邊距的增加而縮小。
與其為容器中的元素添加外邊距,不如在欄中再添加一個沒有寬度的div,讓它包含所有內(nèi)容元素,然后再給這個div應(yīng)用邊框和內(nèi)邊距。如此一來,只要為內(nèi)部div設(shè)定一次樣式,就可以把讓所有內(nèi)容元素與欄邊界保持一致的距離。而且,將來再需要調(diào)整時也會很方便。任何新增內(nèi)容元素的寬度都由這個內(nèi)部div決定。
下面我們用這種方法修復(fù)上面第三欄浮動到下邊的問題。
接下來,我們不僅要給內(nèi)部 div 應(yīng)用內(nèi)邊距,還要給她應(yīng)用外邊距和邊框。
/*更新 css*/ article { width:600px; float:left; background:#ffed53; } article .inner { margin:10px; border:2px solid red; padding:20px; }
效果如圖:
以上措施使布局有了明顯改觀。就這么簡單的幾下,布局就顯得更專業(yè)了。處理欄及其內(nèi)部div的關(guān)鍵在于,浮動欄并設(shè)定欄寬,但不給任何內(nèi)容元素設(shè)定寬度。要讓內(nèi)容元素擴(kuò)展以填充它們的父元素——內(nèi)部div。這樣,只要簡單地設(shè)定內(nèi)部div的外邊距和內(nèi)邊距,就可以讓它們以及它們包含的內(nèi)容與欄邊界保持一定距離。
使用 box-sizing:border-box人們慢慢的意識到傳統(tǒng)的盒子模型不直接,所以他們新增了一個叫做 box-sizing 的CSS屬性。當(dāng)你設(shè)置一個元素為 box-sizing: border-box; 時,此元素的內(nèi)邊距和邊框不再會增加它的寬度。這里有一個與前一頁相同的例子,唯一的區(qū)別是兩個元素都設(shè)置了 box-sizing: border-box;
nav { -webkit-box-sizing:border-box; -moz-box-sizing:border-box; box-sizing:border-box; width:150px; float:left; background:#dcd9c0; padding:10px 10px; } article { -webkit-box-sizing:border-box; -moz-box-sizing:border-box; box-sizing:border-box; width:600px; float:left; background:#ffed53; padding:10px 20px; } aside { -webkit-box-sizing:border-box; -moz-box-sizing:border-box; box-sizing:border-box; width:210px; float:left; background:#3f7ccf; padding:10px 10px; }
這是目前為止最好的解決方法了,那最簡單有效的方法就是在 css 里添加這樣一條規(guī)則:
* { -webkit-box-sizing:border-box; -moz-box-sizing:border-box; box-sizing:border-box; }三欄-中欄流動布局
中欄流動布局的目的是在屏幕變窄時,中欄變窄,左欄和右欄寬度不變。
這里我們使用負(fù)外邊距實現(xiàn)。
實現(xiàn)三欄布局且讓中欄內(nèi)容區(qū)流動(不固定)的核心問題是處理右欄的定位,并在中欄內(nèi)容區(qū)大小改變時控制右欄與布局的關(guān)系。
這里我們使用Ryan Brill給出的控制兩個外包裝容器的外邊距的解決方案。其中一個外包裝包圍三欄,另一個外保障包圍左欄和中欄。
html代碼示例如下:
/*三欄外包裝(包圍全部三欄)*//*結(jié)束三欄外包裝(threecolwrap)*//*兩欄外包裝(包圍左欄和中欄)*/ /*左欄*/ /*中欄*//*結(jié)束兩欄外包裝(twocolwrap)*/ /*右欄*/
css規(guī)則如下:
* { margin: 0; padding: 0; } body { font: 1em helvetica, arial, sans-serif; } div#main_wrapper { min-width: 600px; max-width: 1100px; /*超過最大寬度時,居中布局*/ margin: 0 auto; /*背景圖片默認(rèn)從左上角開始拼接*/ background: url(images/bg_tile_150pxw.png) repeat-y #eee; } header { padding: 5px 10px; background: #3f7ccf; } div#threecolwrap { /*浮動強(qiáng)制它包圍浮動的欄*/ float: left; width: 100%; /*背景圖片右對齊*/ background: url(images/bg_tile_210pxw.png) top right repeat-y; } div#twocolwrap { /*浮動強(qiáng)制它包圍浮動的欄*/ float: left; width: 100%; /*把右欄拉到區(qū)塊外邊距騰出的位置上*/ margin-right: -210px; } nav { float: left; width: 150px; background: #f00; padding: 20px 0; } /*讓子元素與欄邊界保持一定距離*/ nav>* { margin: 0 10px; } article { width: auto; margin-left: 150px; /*在流動居中的欄右側(cè)騰出空間*/ margin-right: 210px; background: #eee; padding: 20px 0; } /*讓子元素與欄邊界保持一定距離*/ article>* { margin: 0 20px; } aside { float: left; width: 210px; background: #ffed53; padding: 20px 0; } /*讓子元素與欄邊界保持一定距離*/ aside>* { margin: 0 10px; } footer { clear: both; width: 100%; text-align: center; background: #000; }
百分比寬度基本原理:上面兩幅圖展示了流動中欄布局。三欄中的右欄是210像素寬。為了給右欄騰出空間,中欄article元素有一個210像素的右外邊距。包圍左欄和中欄的兩欄外包裝上210像素的負(fù)右外邊距,會把右欄拉回article元素右外邊距(在兩欄外包裝內(nèi)部右側(cè))創(chuàng)造的空間內(nèi)。中欄aticle元素的寬度是auto,因此它仍然會力求占據(jù)浮動左欄剩余的所有空間??墒牵环矫嫠约旱挠彝膺吘嘣趦蓹谕獍b內(nèi)為右欄騰出了空間,另一方面兩欄外包裝的負(fù)右外邊距又把右欄拉到了該空間內(nèi)。
上面的例子中,我們用到了百分比寬度,百分比是一種相對于包含塊的計量單位。你還能同時使用 min-width 和 max-width 來限制最大或最小寬度!
你可以用百分比做布局,但是這需要更多的工作。如果我們上邊的例子中 nav 用百分比寬度做布局,當(dāng)窗口寬度很窄時 nav 的內(nèi)容會以一種不太友好的方式被包裹起來。
inline-block 布局上面的例子我們實現(xiàn)多欄并列的方式是使用float,不過我們也可以使用inline-block。下邊是我們把 float 替換為inline-block 的例子。
nav { width:150px; display: inline-block; vertical-align: top; background:#dcd9c0; } article { word-spacing:0; width:600px; display: inline-block; vertical-align: top; background:#ffed53; } aside { word-spacing:0; width:210px; display: inline-block; vertical-align: top; background:#3f7ccf; }
使用inline-block,有一些事情需要你牢記:
vertical-align 屬性會影響到 inline-block 元素,你可能會把它的值設(shè)置為 top 。
你需要設(shè)置每一列的寬度
如果HTML源代碼中元素之間有空格,那么列與列之間會產(chǎn)生空隙
特別是第三條,如果我們不做任何修改,兩個 block 之間會存在空格,像這樣:
因為列與列之間產(chǎn)生了空格,所以 aside 跑到了下邊。這里最簡單的解決辦法是:
內(nèi)容
其他解決方案可以參考這篇文章 Fighting the Space Between Inline Block Elements
其他布局方式初次之外,css 還提供了 column、flexbox等布局方式,這些以后有機(jī)會再介紹吧。
總結(jié)這篇文章我們介紹了用浮動的有寬度的元素來創(chuàng)建多欄布局、如何讓固定布局在頁面上居中以及讓它們在一定范圍內(nèi)可以伸縮。同時也了解了如何使用內(nèi)部div在浮動元素中生成間距,而又不會改變布局的總寬度。
參考鏈接CSS入門指南-2:盒子模型、浮動和清除
CSS入門指南-3:定位元素
學(xué)習(xí)CSS布局
Fighting the Space Between Inline Block Elements
Flex 布局教程:語法篇
最后,感謝女朋友支持。
歡迎關(guān)注(April_Louisa) | 請我喝芬達(dá) |
---|---|
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/112398.html
摘要:屬性是中最重要的用于控制布局的屬性。布局的高度多數(shù)情況下,布局中結(jié)構(gòu)化元素乃至任何元素的高度是不必設(shè)定的。更新效果如圖以上措施使布局有了明顯改觀。 這是《CSS設(shè)計指南》的讀書筆記,用于加深學(xué)習(xí)效果。 display 屬性 display是 CSS 中最重要的用于控制布局的屬性。每個元素都有一個默認(rèn)的 display 值。對于大多數(shù)元素它們的默認(rèn)值通常是 block 或 inline ...
摘要:層疊樣式表二修訂版這是對作出的官方說明。速查表兩份表來自一份關(guān)于基礎(chǔ)特性,一份關(guān)于布局。核心第一篇一份來自的基礎(chǔ)參考指南簡寫速查表簡寫形式參考書使用層疊樣式表基礎(chǔ)指南,包含使用的好處介紹個方法快速寫成高質(zhì)量的寫出高效的一些提示。 迄今為止,我已經(jīng)收集了100多個精通CSS的資源,它們能讓你更好地掌握CSS技巧,使你的布局設(shè)計脫穎而出。 CSS3 資源 20個學(xué)習(xí)CSS3的有用資源 C...
摘要:內(nèi)聯(lián)元素在水平方向上相互挨著,總體上會從左上方流向右下方。,增加元素,設(shè)置屬性,兩個內(nèi)聯(lián)元素并排擺放,但只有左右方向有。還能與其它內(nèi)聯(lián)元素并排。 寫在前面:作為一個剛開始寫技術(shù)博客的新手,看到有人收藏了文章,寫作動力又猛增了。這應(yīng)該就是寫技術(shù)博客的好處之一:能給自己增加成就感和驅(qū)動力。最近關(guān)于css布局和定位相關(guān)內(nèi)容整理地有點(diǎn)慢,因為同時在做freecodecamp上的題,所以節(jié)奏有點(diǎn)...
摘要:我們會在本文給出一個易于理解的入門介紹。項的順序的屬性另外一個的能力,是能夠輕松改變元素的顯示順序。她想讓成為頁面的第一個元素,顯示在之前。可接受的值有,或者一個數(shù)字后面緊跟著,,或其他長度單位。 轉(zhuǎn)載請注明出處:葡萄城官網(wǎng),葡萄城為開發(fā)者提供專業(yè)的開發(fā)工具、解決方案和服務(wù),賦能開發(fā)者。 原文出處:https://www.sitepoint.com/flexbox-css-flexible-...
摘要:年末促銷葡萄城歲末福利火熱放送中近幾年,領(lǐng)域出現(xiàn)了一些復(fù)雜的專用布局工具,用以代替原有的諸如使用表格浮動和絕對定位之類的各種變通方案。重點(diǎn)推薦年末促銷葡萄城歲末福利火熱放送中靈活高效的前端開發(fā)工具包,可快速搭建企業(yè)應(yīng)用程序 轉(zhuǎn)載請注明出處:葡萄城官網(wǎng),葡萄城為開發(fā)者提供專業(yè)的開發(fā)工具、解決方案和服務(wù),賦能開發(fā)者。 【年末促銷】葡萄城 2018 歲末福利火熱放送中 近幾年,CSS領(lǐng)域出...
閱讀 3606·2021-11-22 11:59
閱讀 974·2021-09-27 13:36
閱讀 3635·2021-09-24 09:47
閱讀 2304·2021-09-01 11:39
閱讀 1002·2021-08-31 09:37
閱讀 2334·2021-08-05 10:01
閱讀 1714·2019-08-30 15:55
閱讀 724·2019-08-30 15:54