CSS 初學筆記
在上一篇文章中,我們學習了網頁的基本HTML架構;本篇則要介紹CSS: 一種用來美化網頁的語言,能讓原本單調的網頁變得更有層次與設計感。接下來,我們將說明CSS選擇器、網頁的排版方式,以及一些常見的外觀設定技巧。
CSS是什麼
全名為Cascading Style Sheet,如果說HTML是網頁的建材,CSS則是施工藍圖以及後續裝潢,讓我們能夠將HTML標籤所構成的網頁內容擺到正確的位置並且進行美化,讓整個網頁看起來更像是我們心中所想的樣子。舉例來說,底下是用CSS描述HTML文件中<h1>標籤的文字大小以及顏色:
h1 {
font-size: 32px;
color: rgb(255, 0, 0);
}導入這個CSS設定後,所有的<h1>標籤都會變成紅色字體,大小為32px,至於導入CSS到HTML的方式,建議是額外存成一個檔案 (ex: style.css),然後在HTML的head區域使用以下標籤來導入:
<html lang="en">
<head>
<link href="style.css" rel="stylesheet" type="text/css"> <!-- 導入CSS檔案 -->
</head>
...
</html><link> 在HTML中用來在文件中引入外部資源,其屬性設定了。href="style.css"- 指定要載入的 CSS 檔案路徑。rel="stylesheet"- 定義這個連結與當前文件的關係,stylesheet表示這個連結是樣式表。type="text/css"- 指定資源的MIME類型,這可以省略,預設值就是text/css。
CSS Selector
上面用標籤種類設定樣式的寫法稱為
element 選擇器,它會選擇所有指定標籤的元素,但這可能會遇到一個問題: 如果HTML中有許多相同的標籤,要如何只改變其中一個的樣式呢? 舉例來說,假設頁面上有兩個<h1>標題,但我們只想讓其中一個轉紅色。這時候就需要使用其他選擇器了:Class 選擇器
- 要能選取特定的標籤,我們必須先在HTML標籤中加入一些屬性,最常用的就是
class屬性,底下替兩種顏色的標題設定不同的class:<h1 class="black-title"> 黑色標題 </h1> <h1 class="red-title"> 紅色標題 </h1> - 將原先CSS指定標籤的寫法改成使用class名稱來選擇,selector的寫法上是一個小數點加class名稱 (".$className"):
.black-title { font-size: 32px; color: rgb(0, 0, 0); } .red-title { font-size: 32px; color: rgb(255, 0, 0); }
一個元素可以具備多個class,寫法是以空白區隔: class="name1 name2 name3 ..."
Id 選擇器
除了class選擇器外,另一個常用的選擇器是
id 選擇器。與class不同,id選擇器只用於選取具有唯一標識的元素,也就是說一份HTML文件中標籤的id不能重複。使用方法與class類似,但在HTML中使用id屬性,並在CSS中以井號(#)開頭來選擇:<h1 id="first-title"> 第一個標題 </h1>
<h1 id="second-title"> 第二個標題 </h1>#first-title {
font-size: 24px;
}
#second-title {
font-size: 20px;
}class 和 id 兩者的使用時機在於要套用樣式的元素是否重複,像是本文章的章節標題都是同樣大小與顏色,那他們套用的就是同樣class,而本網頁左上角的logo則是唯一的,因此使用id來選擇。選擇器應用
element、class、id 可以結合使用,達成更為精準的選取:- <h1 class=intro>, <p class=intro> 兩者class相同,但標題與段落要套用不同樣式,要區分就得同時指定標籤和class:
h1[class="intro"]、p[class="intro"],這種selector代表class只能等於"intro",不能同時有其他class,如果想要表達包含 intro class,則可以使用h1.intro。 - 由於HTML是有階層的,所以CSS選擇器也支援多階層的指定:
#main > .subsection1 > p- 選取id為main內部class為subsection1的全部<p>元素,結構上可以想像成:<div id="main"> <div class="subsection1"> <p>這是第一段落</p> <!-- 這個會被選取 --> <p>這是第二段落</p> <!-- 這個會被選取 --> ... - 當有一個以上的selector想套用同樣的樣式,我們可以透過逗號去分隔他們:
selector-1, selector-2 { ...。
Flex排版
了解CSS選擇器後,我們可以使用CSS來美化文件了,第一步就是先從排版開始,預設的HTML元素多半都是由上往下排列,這使網頁顯得有點單調。過去網頁要做到特定的排版會透過設定元素的
top , left 屬性來達成,這種方式需要把元素的絕對位置計算清楚才行,實在有點麻煩。因此後來CSS引入了Flexbox (彈性盒子) 來簡化排版工作。Flexbox允許我們將元素放在一個容器中,並且可以輕鬆地控制它們的排列、對齊方式以及間距,並且可以自動調整大小以適應容器的寬度或高度。在這篇初學筆記會介紹其中最重要的幾個屬性,為了展現效果會用底下3個block的HTML架構來當範例:
<div class="container">
<div class="block1">區塊1</div>
<div class="block2">區塊2</div>
<div class="block3">區塊3</div>
</div>flex-direction
我們有一個容器內有三個區塊,可以透過設定
flex-direction 來改變排列方式:.container {
display: flex; /* 啟用Flexbox */
flex-direction: XXX; /* 填入想要的模式 */
}設定出來的效果如下,可以看到預設的情況下div是由上往下排列跟使用column一樣,而使用row則是由左往右排列,另外還有兩種設定:
row-reverse 和 column-reverse,是將元素的順序反轉,可以讓元素從右往左或從下往上排列。no flex
區塊1
區塊2
區塊3
row
區塊1
區塊2
區塊3
column
區塊1
區塊2
區塊3
justify-content
除了改變排列方式外,還能透過
justify-content 來調整元素水平方向的對齊方式:.container {
display: flex; /* 啟用Flexbox */
flex-direction: row; /* 假定使用row */
justify-content: XXX; /* 填入想要的對齊方式 */
}底下顯示五種水平對齊方式:
flex-start- 將元素靠左對齊。flex-end- 將元素靠右對齊。center- 將元素置中對齊。space-between- 在元素之間平均分配空間,首尾元素靠邊。space-around- 在元素之間平均分配空間,首尾元素也會有一半的空間。
flex-start
區塊1
區塊2
區塊3
flex-end
區塊1
區塊2
區塊3
center
區塊1
區塊2
區塊3
space-between
區塊1
區塊2
區塊3
space-around
區塊1
區塊2
區塊3
align-items
相較於
justify-content 是來調整水平方向的對齊方式,align-items 則是用來調整垂直方向的對齊方式:.container {
display: flex; /* 啟用Flexbox */
flex-direction: row; /* 假定使用row */
justify-content: center;/* 假定使用center */
align-items: XXX; /* 填入想要的對齊方式 */
}底下顯示六種垂直對齊方式,為了讓效果更明顯,這邊在區塊的文字中插入一些<br>符號,讓區塊的高度不一樣:
flex-start- 元素靠上對齊。flex-end- 元素靠下對齊。center- 元素垂直置中對齊。stretch- 預設值,元素會拉伸以填滿容器的高度,但前提是元素沒有設定高度,如果設定了高度不會改變,整體效果會跟flex-start一樣。baseline- 元素的基線對齊,這邊讓文字大小不一樣讓效果可以更明顯,可以看到不同區塊的文字是切齊的。
flex-start
區塊1
區塊2
區塊3
flex-end
區塊1
區塊2
區塊3
center
區塊1
區塊2
區塊3
stretch
區塊1
區塊2
區塊3
baseline
區塊1
區塊2
區塊3
常用屬性設定
排版弄好後,進行各個元素的細部設定,底下會介紹一些適用於大部分標籤的常用屬性:
Font
$your-selector { /* 改成自己的selector */
font-family: Arial, sans-serif; /* 設定字體 */
font-size: 16px; /* 設定字體大小 */
line-height: 1.5; /* 設定行高 */
font-weight: normal; /* 設定字體粗細,normal為正常粗細 */
}font-family- 設定字體,常見的有 Arial, Helvetica, Times New Roman 等等。通常會一次設定多組,防止瀏覽器不支援該字體或是該字體沒有支援特定語言文字,只要無法帶入就會依序嘗試下一個字體。font-size- 設定字體大小,通常使用像素(px)或是相對單位(em, rem) - em是相較於parents元素的字體大小,rem則是相較於root元素的字體大小,如果想跟root元素同大小就設成1rem。line-height- 設定行高,這會影響到段落的可讀性。font-weight- 設定字體粗細,可以是 normal、bold、lighter,或是直接指定數值 (1~1000),normal = 400, bold = 700。
Color
$your-selector { /* 改成自己的selector */
color: rgb(0, 0, 0); /* 設定文字顏色 */
background-color: rgb(255, 255, 255); /* 設定背景顏色 */
}color- 設定文字顏色,可以使用顏色名稱 (ex: white, green)、HEX數值 (ex: #b1b1b1)、rgb($R, $G, $B),也可進階設定透明度: rgba($R, $G, $B, $A)。background-color- 設定元素的背景顏色,可填數值與color一樣。
Box
$your-selector { /* 改成自己的selector */
padding: 10px 30px; /* 設定內邊距 */
border: 1px solid rgb(0, 0, 0); /* 設定邊框 */
border-radius: 5px; /* 設定圓角 */
margin: 30px 15px 20px 5px; /* 設定外邊距 */
}Box Model
HTML元素是使用Box Model來呈現(如上圖),每個元素都可以被視為一個盒子,這個盒子有四個部分:
content- 盒子的內容區域,元素實際顯示的文字或圖片,以上圖為例是"Box Model"的區塊。padding- 內容與邊框之間的空白區域,又稱內邊距,也就是扣除文字的藍色區塊。border- 包圍內容和內邊距的邊框,上圖中的黑色邊界。margin- 盒子外部的空白區域,又稱外邊距,用來控制元素之間的距離,上圖中的綠色區域 (那其實是parents的背景)。
padding和margin兩者的差異在於padding會影響到元素的大小,而margin則不會,使用上如果是想讓背景擴大或是邊界拉遠則調大padding,如果只是想保持與其他元件的距離則調大margin。至於設定上常見兩種模式:
$Y $X- 兩個數值,描述上下與左右的距離。$top $right $bottom $left- 四個數值,用順時鐘描述: 上、右、下、左。
至於border相關的設定則是:
border- 設定元素的邊框,通常包含寬度、樣式 (ex: solid, dashed, dotted) 以及顏色。border-radius- 設定元素的邊框的角度,也就是讓background/border看起來是圓角,雖然只是一個小設定,但我覺得可以瞬間讓一個元件好看許多XD,舉例來說: w/o radius、w/ radius。
範例
CSS的介紹到這邊結束了~~~ 底下是前篇文章提到的本網站架構圖,其相對應的HTML跟CSS範例可從GitHub下載,其CSS排版大致可分為四個階層:
- Body = Header + Container + Footer - 標準的由上往下排版。
- Container = Aside + Center + Aside - container內部排版是使用row flex,由左至右。
- Center = Title + Sec. Intro + Sec. 1 + ... - 中央由大標題和多個section由上而下排版。
- Section = Image/Title + paragraph1 + ... - 以類似方式由上而下排列多個段落。

總結
上述就是關於CSS的基本用法,其實掌握了Flex排版以及顏色等屬性控制就能夠使網頁美化許多,剩下就是多多嘗試找到想要的配置,完成後就會有一個看起來美美的網頁,用來當blog算是足夠了,但想要的是可互動的頁面,例如: 本網頁左上角的閱讀紀錄條,需要導入Javascript來動態改寫HTML/CSS,這部分就下一篇再談談。