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