《Head First HTML 與 CSS》讀書筆記之CSS篇

本文爲閱讀《Head First HTML 與 CSS》的css部分的讀書筆記,方便回顧書上的知識,另一篇爲Head First HTML 與 CSS》讀書筆記之HTML篇

基本

常識與實踐

  • css的每一個語句包括一個場所,以及這個場所的一個屬性,還要應用到這個屬性一個樣式,一個典型的css規則如下:
p { // 需要增加樣式的元素: p,這稱爲選擇器(selector),匹配頁面中的所有p元素
	background-color: red; //背景色爲紅色      格式: < 屬性:值; >
	border: 1px solid gray; //邊框: 1像素,實線,灰色
}
  • css 的註釋: /* */
  • css驗證工具,你還可以把驗證圖標放到你的web頁面中

 

鏈接方式

內部鏈接

要爲html直接增加css樣式,需要在<head>元素中增加開始和結束style標記,css規則放在裏面

<style>
	p {
	   color: gray;
	}
</style>

css文件外置

另一種方式將css文件外置,如style.css,作爲樣式表(stylesheets),然後從html衆創建一個到這個文件的外部鏈接,用<link>元素,用外部樣式表的好處是要修改整個網站的樣式,只要進入這個樣式表,對css進行幾處修改即可。如:

<link type="text/css" rel="stylesheet" href="lounge.css" >
#放到<head>元素中,在html5中不再需要type這個屬性(可選),rel(relation)指定html與所鏈接文件間的關係,這裏指我們要鏈接到一個樣式表
#link是一個void元素

多樣式表

使用多個樣式表,順序很重要,一個樣式表會覆蓋在它上面鏈接的樣式表中的樣式,有時會有一個樣式表作爲頁面的基礎樣式,要修改樣式,鏈接這個樣式表,然後在下面提供自己的樣式表,指定要修改的樣式,如下所示:

<link rel="stylesheet" href="corperate.css">//總公司樣式
<link rel="stylesheet" href="beverage-division.css">//部門對總公司的樣式做了一些補充,甚至可以覆蓋公司的樣式
<link rel="stylesheet" href="lounge-seattle.css">//西雅圖休閒室對樣式表做了自己的調整

簡寫

css屬性太多,能不能不費吹灰之力就指定這些屬性呢?可以把同一屬性的值結合起來寫成一句,即簡寫。

簡寫格式

padding

padding: 0px 40px 30px 20px;,順序是上右下左,順時針有木有,如果都相同可以用padding: 20px;

padding-top: 0px;
padding-right: 40px;
padding-bottom:30px;
padding-left: 20px;

margin

上面的padding格式同樣對margin也適用,還有另一種方法,如果上下一樣,左右一致,可以這樣寫:margin: 0px 20px,前面指定上下,後面指定左右。

border

邊框屬性簡寫 border: thin solid #007e73;,可以用你喜歡的任何順序。

background

背景簡寫 background: white url(images/cocktail.gif) repeat-x;,同樣順序隨便

字體

字體簡寫的格式稍微複雜一些:

font : font-style font-variant font-weight font-size/line-height font-family
  • font的屬性中font-size必須有
  • font-size前的屬性是可選的,組合任意,不過必須出現在font-size之前
  • line-height是可選的,只要在font-size後加/然後指定行高即可
  • font-family名之間要使用逗號分隔
  • 如: font : small/1.6em Verdana, Helvetica, Arial,sans-serif;

簡寫的優劣

  • 不一定要用簡寫形式,有些人覺得長形式更可讀。
  • 簡寫的好處: 縮寫css文件大小,輸入更快。
  • 簡寫的不足: 如果存在問題,或者順序有誤,比較難調試
  • 簡寫記起來複雜,可以用參考手冊

 

選擇

子孫選擇器

父元素和子孫元素名之間有一個空格,子孫選擇器會選擇所有子孫,包括這個元素中嵌套的所有,不管嵌套多深,例如

#elixirs h2 {//選擇elixirs子孫的所有h2
	color: black;
}

直接孩子

如果要選擇直接的孩子,用>

#elixirs>h2 {//選擇elixirs的直接孩子h2
	color: black;
}

複雜選擇

更復雜的選擇,方法還是一樣

#elixirs blockquote h2 {//選擇elixirs中的blockquote中的h2元素
	color: blue;
}

規則添加

  • 要爲多個元素編寫一個規則,只需要在選擇器之間加上逗號,如 "h1,h2"。
h1,h2 {// 多個選擇器
 font-family: sans-serif;
 color: gray;
}
  • 元素可以指定多次規則,例如我們想給h1添加下邊框,但是不想給h2頁也加上,也不想分解上面的規則,可以給h1再增加一個屬性:
h1,h2 {
 font-family: sans-serif;
 color: gray;
}
h1{
border-bottom: 1px solid black;
}
  • 把元素的所有共同樣式歸組在一起(如果改變,只需要在一個規則中修改),然後把一個元素特定的樣式寫在另一個規則中.

 

當我們用選擇器選擇元素使用一個規則時,會對所有該元素應用這個樣式,所以如何單獨地選擇這些元素呢?這裏就需要類class,class可以定義一類元素,對屬於該類的所有元素應用樣式.要將一個元素加入一個類,只需要增加屬性"class",並提供類名,如"greentea":

<p class="greentea">
...
</p>

類元素選擇器

先選擇這個類中的元素,再用"."指定一個類,最後是類名,如:

p.greentea {
  color: green;
}

添加類元素

如果想對所有<blockquote>也做同樣的處理,可以:

blockquote.greentea,p.greentea {
  color: green;
}
<blockquote class = "greentea"

 

類選擇器

如果想把<h1>,<h2>,<h3>,<p><blockquote>都增加到greentea呢?要對類中的所有元素都用同一樣式可以用:

.greentea{
  color: green;
}
/*省略所有元素名,只有一個點,則會應用到所有成員*/

多類元素

元素可以有多個類,例如:

<p class="greentea raspberry blueberry"
#各個類名用空格分隔
#類中順序不重要

 

特定元素選擇器

如果多個選擇器都選擇了一個元素呢?例如上面的3個類都與p元素匹配,並且都定義了color屬性,那麼那個會勝出?

  • 如果某個規則更特定,則選擇更特定的元素
  • 如果特定程度相同,那麼會選擇css文件中最後列出的規則,例如下面的例子中會選擇p.blueberry的規則:
p { color : black;} // 對於所有段落
.greentea { color: green;} //對於所有greentea類,比上面特定
p.greentea { color : green;} //只選擇greentea類中的段落,比上面特定
p.raspberry { color : blue;} //同上,與greentea特定程度相同
p.blueberry { color : purple;} //同上,與greentea特定程度相同

id

id的作用

id屬性用來唯一地命名元素,通常你想對多個元素重用某些樣式,才能真正發揮類的作用。但是如果只有一個元素需要樣式,或者頁面上只有一個元素,那就應該使用id,每個元素只能有一個id,頁面中只能有一個元素擁有特定id,一個元素有一個id,同時可以屬於一個或多個類,id中不允許出現空格或其他特殊字符,如

<p id="footer">...</p>

選擇元素

用id選擇一個元素,需要在id前面使用一個#字符(類是[.]),id選擇器只與頁面中的一個元素匹配

#footer{
  color: red;
}//選擇id爲footer的任意元素
p#footer{
  color: red;
}//選擇id爲footer的<p>元素

 

實踐建議

  • 在複雜頁面中,可能有些頁面把id指定給一個段落,有些頁面分配給了一個列表,那麼需要爲該id定義多個規則,根據頁面上不同類型的元素應用不同的規則,如p#someid和blockquote#someid
  • 類名要以一個字母開頭,不過id名可以以一個數字或字母開頭,但它們都不能有空格

 

繼承

樣式繼承

  • 爲p選擇器增加font-family屬性時,也會影響到<p>元素中內部元素的字體。
  • 元素能夠從他們的父元素繼承樣式。
  • 不是所有的樣式都能繼承,只有一部分,如font-family。
  • 並不是所有元素都會繼承,如img沒有文本,所以不會受到字體影響。
  • 繼承的樣式可以覆蓋,例如給<em>提供一個特定的規則來覆蓋body中指定font-family,瀏覽器會使用更特定的規則:
body {
  font-family : sans-serif;
}

em {
  font-family: serif;
}

那哪些元素能夠繼承

  • 如果樣式會影響你的文本外觀,那麼所有這些樣式都能繼承,如color,font-family,font-size,font-weight,font-style等和字體相關的屬性
  • 其他屬性不能繼承,如邊框,因爲如果body元素有邊框,不表示你希望body內的所有元素都有邊框
  • 根據常識確定,或者試試看

 

層疊

  • 瀏覽器會用多個樣式表組織樣式,首先是你的ccs所有樣式表,其次是用戶創建的樣式,最後瀏覽器本身會維護一組默認樣式
  • 給定一組樣式表中的一組樣式,瀏覽器會以層疊的方式確定具體使用哪個樣式
  • 讀者可以在他的css屬性上加上!important,那他就能覆蓋你的樣式
  • 瀏覽器需要選擇最特定的規則進行顯示
  • 特定性由3個數開始000:
  • 第一位: 這個選擇器包含id嗎?每個id加1分
  • 第二位: 這個選擇器包含類或僞類嗎?每個類和僞類加一分
  • 第三位: 這個選擇器包含元素名嗎?一個元素名加一分
  • 把它們讀作真正的數,100>010>001,例如h1.greentea的特定性值爲011,ol li p的特定性爲003。
  • 瀏覽器首先收集樣式表找到所有的聲明,然後對所有匹配的規則按作者,讀者和瀏覽器排序,再按特定性對組內的所有聲明分別排序,
    最後對於衝突的規則,按照他們在各個樣式表中出現的順序排序,如果兩個規則得分相同,最後出現的規則勝出。

 

媒體查詢

link媒體查詢

你可能想針對將要顯示頁面的設備調整頁面的樣式,可以用media屬性,在link元素中增加這個屬性.如

<link rel="stylesheet" href="lounge-mobile.css" mdeia="screen and (max-device-width: 480px)">
<link rel="stylesheet" href="lounge-print.css" media="print">
# 其他屬性包括min-device-width,max-device-width,orientation(橫向landscape,縱向portrait)

css媒體查詢

可以直接在css中增加媒體查詢,使用@media規則,把對所有媒體類型都通用的規則放在@media規則下面,例如

@media screen and (min-device-width: 481px){//當設備屏幕寬度大於480px時使用
#guarantee {
  margin-right: 250px;
}
}
@media screen and (max-device-width: 480px){//當設備屏幕小於等於480px時使用
 #guarantee {
   margin-right: 30px;
 }
}
@media print { // 如果要打印頁面,使用該規則
body {
  font-family: Times, "Times New Roman", serif;
}
}

實踐建議

  • 如果css文件相當龐大,建議使用link元素
  • 除了給出設備的媒體屬性,如果你更關心瀏覽器大小,可以用max-width和min-width

 

屬性

盒模型

盒模型是css看待元素的一種方式,css將每個元素看作由一個盒子表示,每個盒子由一個內容區以及可選的內邊距,邊框和外邊距組成。由內而外分別是:

  • 內容區: content ,包含內容,如文本或圖像
  • 透明內邊距: padding ,可選,包圍內容區
  • 邊框: border ,可選,內邊距周圍
  • 透明外邊距: margin,可選,包圍所有部分

內容區

內容區包含元素的內容,它的大小通常正好包含全部內容

padding 內邊距

  • 使用內邊距可以在內容與盒子邊框之間創建一些看得到的空間
  • css可以控制內邊距的寬度,甚至任意一邊的寬度,上下左右
  • 透明,無法指定樣式
  • 元素的背景顏色或背景圖像會延伸到內邊距下面,但不會延伸到外邊距
  • 設置padding的順序很重要,如果先設置padding-left再設置padding,剛纔設置的padding-left就會被覆蓋
padding: 25px;
padding-left: 80px;
# 我們首先有一個屬性來控制所有4個邊,另外再對每個邊單獨設置

border 邊框

  • 他是圍繞內容的一條線
  • 邊框可以有不同的寬度,顏色和樣式
  • 內邊距將內容區與邊框隔開
  • 可以指定任意一邊的邊框樣式 border-top-color,border-top-style,border-top-width等
  • 鋸齒邊框(破折線+白色):
border-style: dashed;
border-color: white;

border-style 邊框樣式

  • solid 實線
  • ridge 脊線
  • dashed 破折
  • dotted 虛線
  • double 雙線
  • groove 槽線
  • outset 外凸
  • inset 內凸

border-width 邊框寬度

  • 關鍵字 thin medium thick
  • 像素 5px;

border-color 邊框顏色

和color 類似,使用顏色名,rgb或16進制碼

border-radius 邊框圓角

  • 可以爲4個角分別指定,如border-top-left-radius
  • 可以用px或em(相對於元素字體大小)

  border-radius: 15px;

margin 外邊距

  • 用外邊距在同一個頁面上的不同元素之間增加空間
  • 和內邊距一樣,css可以控制外邊距的寬度,甚至任意一邊的寬度,上下左右
  • 透明,無法指定樣式
  • 和padding一樣,設置margin的順序很重要
margin: 30px;
margin-right: 250px;

color 顏色

文本元素的字體顏色

  • color 元素實際控制着一個元素的前景色,他會控制文本和邊框顏色,不過你也可以用border-color屬性爲邊框指定自己的顏色
  • 改變p的字體顏色不會影響裏面的鏈接顏色.
  • web顏色按構成顏色的紅,綠,藍三個分量所佔數量來指定,每種顏色會分別指定一個從0到100%的數值,然後把它們混合起來得到最終的顏色.如100%紅,100%綠,100%藍混合在一起是白色。所有指定web顏色的方法最終都是告訴瀏覽器:一個顏色的紅綠藍分量分別是多少.
  • 對於文本和背景,要使用對比度最大的顏色,能提高可讀性

用16進制碼指定指定顏色

  • #fc1257,這種方式最常用
  • 以#開頭,分別用2位數字指定紅綠藍
  • 例如:
body {
  background-color: #cc6600;
}
  • wiki的web顏色表
  • 如果每一組分量中的兩位數字都相同,可以使用簡寫,例如#ccbb00可以簡寫成#cb0,不過如果是#ccbb10則不能簡寫

按名指定顏色

  • css只定義了大約150個顏色名,顏色名不區分大小寫
  • 16種基本顏色,所有瀏覽器都有,以及150種擴展色,它們是:aqua, black, blue, fuchsia, gray, green, lime, maroon, navy, olive, purple, red, silver, teal, white, yellow
  • 例如:
body {
  background-color: silver;
}

用紅綠藍值指定顏色

以rgb開頭,在小括號裏指定紅綠藍的百分比,例如:

body{
  background-color: rgb(80%, 40% , 0%)//橙色
}

還可以指定0-255之間的一個數值,例如:

body{
  background-color: rgb(204, 102, 0)//和上面顏色一致,255*80% = 204...
}

font-family 字體

大多數計算機上通常只安裝了部分字體,所以選擇字體時要當心,通常指定的font-family包含一個候選字體列表,他們都來自同一個字體系列,候選字體用逗號分隔,大小寫字母必須一致,最後總是放一個通用的字體系列名,如果一個字體名中包含多個單詞,比如Courier New,如何指定?用引號,"Courier New",如:

body{
  font-family: Verdana, Geneva, Arial, sans-serif;
}

字體系列

每個font-family包含一組有共同特徵的字體。共有5個字體系列:

  • Sans-serif : 無襯線體 , 在計算機上更容易識別, 很多人認爲在計算機顯示中最適合體文本,包括: [Verdana : 大多數pc上都有],[Geneva : 大多數Mac上都有],[Arial : 在PC和Mac上都很常見]
  • Serif : 有襯線體 , 新聞報紙的文字排版
  • Monospace : 固定寬度的字符,主要用於顯示軟件代碼示例
  • Cursive : 看似手寫的字體 , 有時會看到在標題中偶爾使用
  • Fantasy : 包含有某種風格的裝飾性字體

@font-face 指定字體

  • @font-face 允許你定義一種字體的名字和位置,然後可以在你的頁面中使用。
  • web字體標準: 字體文件使用".woff"文件擴展名,表示web開放字體格式(web open font format)
  • 常用字體格式: [TrueType : .ttf],[OpenType : .otf 建立在tt之上],[Embedded OpenType字體 : .eot otf的壓縮形式 微軟專用,僅ie支持],[SVG字體 : .svg 通用圖像格式],[Web開放字體格式 : .woff 推薦使用,瀏覽器支持最廣泛]
  • 缺點: 獲取字體需要花費時間,第一次獲取字體時頁面性能可能會受影響。管理多個字體文件痛苦,最後移動設備和小型設備不支持。
  • 有字體託管服務可以爲你託管web字體。
  • 瀏覽器會先在用戶計算機上查找Verdana字體,如果有,這個元素就使用這個字體,如果不可用,找Geneva,以此類推,
    如果前面指定的字體都沒有找到,就用瀏覽器默認的Sans-serif字體,就是我們最後指定的通用字體。
  • 利用font-family可以創建一個首選字體列表
  • 把該規則增加到文件的最上面,放在body規則之上
@font-face {
font-family: "Emblema One"; //創建一個名字
src: url("http://wickedlysmart.com/hfhtmlcss/chapter8/journal/EmblemaOne-Regular.woff"),
     url("http://wickedlysmart.com/hfhtmlcss/chapter8/journal/EmblemaOne-Regular.tff");
//src屬性告訴瀏覽器到哪裏找到這個字體,瀏覽器會嘗試每一個src文件,直到找到它支持的一個文件。
}

 

@import

@import 允許導入其他CSS文件

font-weight 控制文本的粗細

  • lighter : 相對於繼承的值使文本稍細一點。
  • normal : 正常
  • bold : 粗體
  • bolder : 相對於繼承的值使文本稍粗一點。
  • 還可以設置爲100到900之間的一個數(100的倍數),不過並沒有廣泛支持,通常不使用

font-size 讓文本更大或更小

  • 像素px指定大小 : font-size: 14px; //告訴瀏覽器字母高度是多少像素.14px中間不能有空格
  • 百分數%指定大小 : font-size: 150%; //指定相對於父元素的字體大小
  • em指定字體大小 : font-size: 1.2em; //指定相對於父元素的字體的比例因子,稱爲相對大小
  • 好吧,百分數和em看上去差別不大,可能%更容易理解些,例子:
body {
   font-size: 14px;
}
h1 {
   font-size: 150%; //父元素body,這裏是14*150% = 21px
}
h2 {
   font-size: 1.2em; //父元素body,這裏是14*1.2 = 17px
}
  • 關鍵字指定字體大小 : font-size: small;, small通常定義爲12px,下面每一級大小約比前一個大小大20%,包括:xx-small,x-small,small,medium,large,x-large,xx-large

指定字體大小的祕訣

(1)選擇一個關鍵字(推薦small或medium),作爲body的字體大小,爲頁面默認字體大小 (2)使用em或百分數,相對於body字體大小指定其他元素的字體大小(em或百分數)這樣改變web頁面中字體大小就很容易,只要改變body字體大小就可以了,例如:

body { font-size : small; }
h1 { font-size : 150%; }
h2 { font-size : 120%; }

注意老版IE不支持用像素指定的文本縮放

瀏覽器默認字體大小

  • 大多數情況下,瀏覽器默認的body字體大小都是16像素
  • 如果在body中指定字體大小爲90%,這將是默認字體的90%
  • h1 : 200%, 相對於默認字體,下同
  • h2 : 150%
  • h3 : 120%
  • h4 : 100%
  • h5 : 90%
  • h6 : 60%

text-decoration 文本裝飾

  • underline : 下劃線 ,下劃線文本通常被用戶誤認爲是鏈接文本,所以要謹慎使用
  • none : 無效果
  • overline : 上劃線
  • line-through : 刪除線,html有個<del>的元素可以將內容標記爲要刪除的內容
  • 一次可以設置多個裝飾
  • 如果文本繼承了你不想要的文本裝飾,可以使用值"none"來去除裝飾
  • 如果em有兩個不同的規則,不會累加,要把這兩個值合併到一個規則中,才能同時得到這兩個文本裝飾.
  • 例如:
em {
  text-decoration: line-through;
}

font-style 字體風格

  • italic : 斜體 ,斜體文本向右傾斜,另外襯線還有彎曲
  • oblique : 傾斜 ,並不是使用一組專門設計的傾斜字符,而是由瀏覽器將正常文字傾斜

list-style 改變列表中列表項的外觀

  • 列表的主要屬性是list-style-type,利用這個屬性可以控制列表中使用的項目符號
    • disc,默認
    • circle,圓圈標記
    • square,方塊標記
    • none,刪除列表標記

定製列表標記

  • 如果想定製列表的標記,可以用list-style-image爲列表設置標記圖像,如:
li{
  list-style-image: url(images/backpack.gif);
  padding-top: 5px;
  margin-left: 20px;
}
  • 對於有序列表也一樣,可以用list-style-type控制一個有序列表標記:
  • decimal,十進制
  • upper-alpha,大寫字母
  • lower-alpha,小寫字母
  • upper-roman,大寫羅馬數字
  • lower-roman,小寫羅馬數字
  • 列表項的項目符號的位置如何控制?用list-style-position,有兩個取值inside(標記在列表項裏)和outside(列表項外)。
    區別如下:

其他屬性

left 指定一個元素的左邊所在位置

top 控制一個元素頂部的位置

background-image 在元素後面放置一個圖像,如

background-image: url(images/background.gif);
//用url括起來,注意沒有引號

background-repeat 背景圖像是否重複

  • 默認在水平和垂直方向上重複
  • 控制平鋪行爲,no-repeat,repeat-x,repeat-y,inherit;
background-repeat: no-repeat;

background-position 背景圖像的位置

  • 可以按像素指定,或百分數,還可以用關鍵字,如top,left,right,bottom和center
background-position: top left;

background-color 控制元素的背景顏色

text-align 對齊

  • text-align會對塊元素中的所有內聯內容對齊,而不僅僅是文本
  • text-align只能在塊元素上設置,對內聯元素無效
  • left 左對齊
  • center 居中
  • right 右對齊

letter-spacing 在字母之間設置間距

line-height 設置文本元素中的行間距

body {
	font-size: small;
	font-family: Verdana, Helvetica, Arial, sans-serif;
	line-height: 1.6em; //調整爲字體大小的1.6倍
}
  • line-height元素有點特殊,可以對它直接使用一個數,而不是相對度量,代表各元素行高是其自己字體大小的多少倍
#elixirs {
  line-height: 1;//代表elixirs中的所有元素的行間距爲其自己字體大小的1倍
}
  • 設置line-heightnormal,允許瀏覽器選擇一個適當的行高大小,通常根據字體來確定。

border-bottom 下邊框

  • 下邊框會延伸到頁面邊緣,但是文本的underline屬性的下劃線只會出現在文本下面
  • 1px solid black

width 指定元素寬度

  • 寬度永遠是設置的值
  • width屬性只指定內容區的寬度
  • 要確定整個盒子的寬度,需要將內容區的寬度加上左和右內邊距,左右外邊距和邊框的寬度
  • 一個塊的默認寬度爲"auto",它會延伸佔滿可用的空間
  • 如果使用百分數,那麼寬度會計算爲元素所在容器寬度的一個百分比
  • 高度也是默認的,也是"auto",一般,不用指定元素的高度,就讓它們默認爲auto

a元素和它的多重人格

  • 頁面上的鏈接有多重顯示樣式,包括未訪問,已訪問或者處於懸停狀態等(還有focus和active),這裏需要用到僞類
  • foucs是指瀏覽器將焦點放在你的鏈接上時就是焦點狀態,瀏覽器允許用戶按下tab鍵輪流訪問時,瀏覽器訪問到某個鏈接,某個鏈接就擁有了"焦點"
  • active是指用戶第一次單擊一個鏈接時,就處於活動狀態。
    - a元素可能同時處於多個狀態,一般認爲適當的順序是link,visited,hover,focus,active
  • 例子:
a:link {
  color: green;
}
a:visited {
  color: red;
}
a:hover {
  color: yellow;
}

僞類

  • 上面的a:link,a:visited和a:hover就是僞類
  • 它們都允許我指定樣式,就好像他們是類一樣,但是沒有人在html中真正輸入這些類
  • 瀏覽器會仔細檢查所有a元素,把它們增加到正確的僞類中,如果一個鏈接已訪問過,會放到:visited類中,如果懸停,瀏覽器會把這個鏈接
    扔到:hover僞類中。瀏覽器會在後臺向這些類增加和刪除元素.
  • 僞類不止能處理鏈接,還能對其他類型的元素提供處理,如first-child對應元素的第一個子元素。

佈局和定位

  • 流:瀏覽器從html文件最上面開始,從上到下沿着元素流逐個顯示所遇到的各個元素。
  • 塊元素從上向下流,各元素之間有一個換行,內聯元素從左上方流向右下方,在水平方向上相互挨着擺放(只要右邊還有空間放的下)
  • 文本是內聯函數的特殊情況,瀏覽器會把它分解成適當大小的內聯元素,以適應給定的空間。
  • 對於外邊距,瀏覽器並排放置兩個內聯元素時,外邊距會相加,但是當上下放置兩個塊元素時,會把它們共同的外邊距摺疊在一起,高度爲最大的外邊距高度。
    事實上只要兩個垂直外邊距碰到一起,它們就會摺疊,但是如果外面的元素有一個邊框,那麼兩個元素的外邊距就不會碰到一起,就不會摺疊

float

  • float屬性首先儘可能遠地向左或向右浮動一個元素,然後在它下面的所有內容會繞流這個元素。
  • 對於所有浮動元素都有一個要求:它必須有一個寬度。
  • 浮動元素的外邊距不會摺疊,因爲它只是浮在頁面上,注意到這一點可以避免常見css錯誤.
  • 內聯元素也可以浮動,如浮動圖像
  • float屬性可以設置爲left或right,不能是中間
#amazing {
  width: 200px;
  float: right;
}
  • 下面看瀏覽器如何處理float(想象一下word的圖片浮動):
    (1)首先,瀏覽器像往常一樣,正常將元素流入頁面,從最上面開始。
    (2)瀏覽器遇到浮動元素時,會把它儘可能放在最右邊,還會從流中刪除這個段落,好像它浮在頁面上一樣。
    (3)由於該浮動段落已經從正常的流中刪除,所以其他塊元素會填在這裏,就好像沒有這個段落一樣。
    (4)對於內聯元素定位時,它們會考慮浮動元素的邊界,因此會繞着浮動元素。

clear

  • 當元素流入頁面時,在這個元素左邊,右邊或兩邊不允許有浮動內容,例如爲防止頁腳和右邊欄重疊,可以用clear設置:
#footer {
  background-color: #675c47;
  color:            #efe5d0;
  text-align:       center;
  padding:          15px;
  margin:           10px;
  font-size:        90%;
  clear:            right;
}
  • 現在瀏覽器放置元素時會查看右邊有沒有浮動元素,如果有就下移,直到沒有浮動元素爲止。

兩欄效果

  • 把sidebar放在頁眉下面,然後用float將sidebar欄向右浮動,通過將main div的右外邊距設置得和sidebar的寬度相同,來創建兩欄效果,不過此時如果頁面太寬,頁腳會上移造成重疊問題,
    這個問題可以在頁腳腫添加clear屬性解決。還有一個問題是因爲我們把sidebar放在主要內容前,所以在小的移動設備上會看到邊欄在最前面。
  • 右緊左松,讓主內容向左浮動,設置仿照上面的。這樣div的順序是正確的,不過邊欄過於擴展不好,還是固定些好
  • 使用絕對定位,類似浮動效果,當主內容區的垂直空間縮小,邊欄會向下覆蓋頁腳
  • 使用css表格

流體與凍結設計

  • 上面討論的都是流體佈局(liquid layouts),下面討論凍結佈局(frozen layouts),凍結佈局會鎖定元素,
    如將body中的所有內容都放到一個id爲#allcontent的div中
#allcontent {
  width: 800px;
  padding-top: 5px;
  padding-bottom: 5px;
  background-color: #675c47;
}

那麼頁面的寬度將被限制爲800px,無論瀏覽器寬度如何變化都不會移動,但這會導致瀏覽器很寬時,右邊有很多空白空間

凝膠布局 Jello

  • 凝膠布局會鎖定頁面中內容區的寬度,不過會將它在瀏覽器中居中,將內容區的內外邊距設爲auto即可,瀏覽器會確定正確的外邊距是多少,確保左和右外邊距相同,所以內容會居中,如下所示
#allcontent {
  width: 800px;
  padding-top: 5px;
  padding-bottom: 5px;
  background-color: #675c47;
  margin-left: auto;
  margin-right: auto;
}

絕對定位

  • 例如上面的邊欄,將邊欄絕對定位時,它會從流中刪除並根據制定的top,left,right或bottom屬性定位
  • 由於邊欄在流之外,其他元素甚至不知道有這樣一個元素,它們會將它完全忽略,所以流中的內聯內容不會圍繞在一個絕對定位的元素周圍。
  • 如將側邊欄絕對定位
#sidebar {
  position: absolute;
  top:  100px;
  right:  200px;
  width:  280px;
}
  • 關於絕對定位還有一個分層放置的問題,一個元素可以放在另一個絕對定位元素上面,那如何分層?誰在上面?每個定位元素都有一個z-index的屬性,這會指定它在一個虛擬z軸上的位置(上面的元素“更靠近”你,z-index更大).
  • 可以對任何元素指定絕對位置
  • position的默認值爲static,將元素放在正常的文檔流中。position共有4個值:static,absolute,fixed和relative。fixed將元素放在相對於瀏覽器窗口(區別頁面)的一個位置上,固定元素永遠不會移動。relative讓元素正常流入頁面,不過在頁面上顯示之前要進行偏移。
  • 絕對元素不必像浮動元素一樣指定寬度,不過默認會佔瀏覽器的整個寬度,所以如果要改變這種行爲就要設置width屬性
  • 指定元素位置還可以用百分數,相對於瀏覽器寬度.

css表格

  • 類似電子表格,在表格中只放置塊元素,所以要把圖像包圍在一個div中。
  • 爲整個表格創建一個div,然後爲每一行分別創建一個div,對於每一列,只要在行div中放置一個塊級元素。
  • 例如一行兩列的表格可以按如下方式創建:
<div id="tableContainer">
  <div id="tableRow">
    <div id="main">
      ...
    </div>
    <div id="sidebar">
      ...
    </div>
  </div>
</div>
  • 對應的css爲:
#tableContainer {
  display: table;
  border-spacing: 10px;//於是不再需要div中的外邊距
}
#tableRow {
  display: table-row;
}
#main {
  display: table-cell;
  background:       #efe5d0 url(images/background.gif) top left;
  font-size:        105%;
  padding:          15px;
  /*margin:           0px 10px 10px 10px;*/
  vertical-align: top;//確保表格兩個單元格中的所有內容相對於單元格上邊對齊,默認爲中間對齊,可以設置爲top,middle,bottom
}
#sidebar {
  display: table-cell;
  background:       #efe5d0 url(images/background.gif) bottom right;
  font-size:        105%;
  padding:          15px;
  /*margin:           0px 10px 10px 10px;*/
  vertical-align: top;
}
  • 上面的border-spacing會在單元格之間增加10像素空間,另外在邊界周圍也會增加10像素空間,但是border-spacing和外邊距創建的空間不會摺疊!就會導致頁眉和頁腳與兩列之間有20像素的空間,如何修正?將頁眉(頁腳)的下邊距(上邊距)設爲0即可。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章