CSS - basic
Last updated
Was this helpful?
Last updated
Was this helpful?
在HTML的學習中已經知道要放這些區塊了,問題是,如何指定區塊的大小和位置?
新增一個css檔案(例如main.css)。我建議你先在你的資料夾中新增加這幾個資料夾,assets通常用來放檔案例如圖片,css用來放所有的css,js用來放javascript。此時你在Brackets上的資料夾也會相對應改變。並在HTML的<head>中加入CSS連結。我目前把main.css放在css這個子資料夾中,你可以在href中找到相對應的路徑。接下來就要編輯CSS改變這個文檔的Layout。
因為你用Brackets編輯器,你可以對著id按右鍵,選「Quick Edit」。
先想好各個區塊的大小和位置,然後先用最簡單的置放方法。一開始寫先寫width再寫height。CSS在選擇id的時候,前面都會有個前綴#,這就是為什麼我前面都用#nav或#content來指稱某個<div>。如果是class的話,就會有前綴.。
再來是設定高度,但你會發現,怎麼出來的結果和你「希望」出現的內容仍然不太一樣。因為事實上你還沒進行排版。這時候我會為<div>加上背景色來幫助我瞭解現在各<div>的位置(先定義背景顏色比較好找,剩下的問題就是怎麼把它們排好。的確是不一樣。
用float:left
可以讓<div>
的排列就好似word一樣,從上到下,從左至右排。但就會受到<div>
在HTML檔案中出現順序的影響。
float
常用在編排例如相片頁面,當視窗拉大,每列的相片就變多,視窗拉小,每列就變少(拉動你的視窗試試看)。這些位置的變化都需要拉一拉視窗看看自己的設計在視窗變瘦變胖的時候有沒有差別,像上面這樣的設計就是在視窗拉大時會出問題。這是因為都設為float:left
的關係,所以視窗拉很大的時候,就全部靠左並排了。
你可以利用clear:both讓某個<div>左右兩邊都不可以有其他的元素,既然強迫左右兩邊不可以有其他元素,那麼就只有上下才能有元素。這回像個網頁了。
我希望讓banner不管怎麼捲動都不會離開視窗。我可以利用position:fixed希望讓#banner固定。
固定是固定住了,但問題來了,其一:捲上去上面有一條透明的區域;其二:文字都捲到#banner背後去了。
會有怪空白是因為<body>預設的margin不為0,所以把<body>的margin設為0。
會捲到背後去是因為position:fixed說明說到「若設為position:fixed會把該<div>移出正常的<div>流」,相當於另外開了一個「圖層」在前景或背景(用z-index控制);此時,後面的#navigation、#content、#supporting就因此「往上跑了」
解決辦法是,強制#navigation、#content、#support必須距離視窗上緣上面有一段空間,且該空間的高剛好等於#banner的高(100px)。你可以在每一個<div>的CSS中加入margin-top: 100px,但你也可以統一用下面的語法,一次性設定三個<div>的margin-top。
margin: 0 auto; 的意思是,上下margin為0,左右auto,那就置中了。
這時我希望也將#nav的<div>區塊固定。#nav固定會使得#content和#supporting往左邊跑,此時就需要把#content的左方margin往右邊挪相當於#navigation寬度的距離(#support會跟著往右跑,所以只要挪#content就好,不過這就意味著,寫網頁牽一髮動全身。右邊的字有點突出邊界,之後處理完選單的視覺化後再處理)。
Box model: how content fits to it outer
padding 文字內縮,控制文字要離邊框多遠。
margin 控制這個block要距離別的block多遠。
padding和margin都有top, right, bottom, left的區別
width和height都是指content的width和height
你可以看見#nav左邊有很大的一塊空白,很醜。請運用Google Chrome所提供的box view,把左方的空白拿掉。 之後我們會處理怎麼把左邊那個點拿掉。
Padding: space between content and border 增加內容和框線(border)的間隔。
我覺得之前#nav的鏈結文字和該<div>
的邊緣靠得太近,所以我要嘗試在內容區塊與的框線加上間隔,這個框線到內容間的間隔稱為padding。 所以我要在每個<div>
(包含#navigation、#content、#supporting、#banner)的CSS中新增padding屬性,讓內容距離邊框10px。結果發現#nav怎麼遮到#content了? 這是Box model的特性,注意前面那頁下面還有寫一行字,就是width指的是content width。padding新增10px後,#navigation胖了一點點。那要怎麼解決這問題會比較方便?
有一個做法就是在裡面再夾一層才放文字,然後在這個內層的不要限制width大小。 為什麼這樣是可以達到效果的?因為外層的所包含的內容物padding為0,卻有width限制,所以外層的content與外框width會相同。 內層則不限制width(自由擠壓文字),但padding==10
,這樣的結果就是內層的文字會內縮。卻不會造成邊界的改變。 你會看見我用了一個class,並一次性修改所有.container
block的padding,讓所有的.container
內的內容都可以內縮10px
。 不過你應該還是會看到文字突出框框邊界,這是因為你的邊界小於單一文字長度的關係。
我們經常在網站上面看到下圖的效果,你認為是怎麼做的?特色是,你看上面的#banner、#content、#footer是置中你的視窗的,唯獨#nav的區塊往左邊靠,偏偏他又靠右黏著中間的#content區塊(提示,margin可以是負值)。
這時候你若把#content division的內容增加多一點,按左方#nav的超鏈結,中間的#content division會隨之捲動到該超鏈結所指的位置。但你會發現,超鏈結打下去後,其所對應到的<div>對齊的位置在視窗的最上方,這是因為我們將#content block強制設定margin-top:100px的緣故,但超鏈結對齊的還是視窗的最上緣。
修正想法是使得每一個.item division的出現位置都距離上緣padding: 100px。但這會在每一個.item division前方新增一個空白段落。
這時候一個取巧的做法就是,強制用負值的margin把每個區塊上拉100px。請注意比較上下的效果。這原因是因為<a>所觸發的捲動是以border為準?
可以用線上的color picker來挑顏色,如。
現在的問題是,網頁偏左,所以我要想辦法把它調整到正中央。做法是把所有的<div>包在一個<div>中,也就是<body>底下立刻給一個<div>然後把這個<div>的屬性用css指定一個寬度,這邊要注意的是,這個外部的<div>它的寬度應該和內部最寬的那一個設成一樣的寬度,才會剛好置中,所以這邊要設定為800px。並把margin設定為0 auto; 參考。
解決完區塊排版後,現在要做的事情是,怎麼把內容在<div>
中或<div>
間「排好」(注意,不是在解決字型或者漂亮不漂亮的問題),例如前述那個內容顯然突出邊界了。這時候要用的就是box model。你在google做image search都可以找到類似的圖。其中這張圖算是資訊比較齊全的。參考說明: border 邊框。