CSS 初學筆記

看起來unsplash過期了
在上一篇文章中,我們學習了網頁的基本HTML架構;本篇則要介紹CSS: 一種用來美化網頁的語言,能讓原本單調的網頁變得更有層次與設計感。接下來,我們將說明CSS選擇器、網頁的排版方式,以及一些常見的外觀設定技巧。

CSS是什麼


全名為Cascading Style Sheet,如果說HTML是網頁的建材,CSS則是施工藍圖以及後續裝潢,讓我們能夠將HTML標籤所構成的網頁內容擺到正確的位置並且進行美化,讓整個網頁看起來更像是我們心中所想的樣子。舉例來說,底下是用CSS描述HTML文件中<h1>標籤的文字大小以及顏色:

CSS

h1 { font-size: 32px; color: rgb(255, 0, 0); }
導入這個CSS設定後,所有的<h1>標籤都會變成紅色字體,大小為32px,至於導入CSS到HTML的方式,建議是額外存成一個檔案 (ex: style.css),然後在HTML的head區域使用以下標籤來導入:

HTML

<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:

    HTML

    <h1 class="black-title"> 黑色標題 </h1> <h1 class="red-title"> 紅色標題 </h1>
  • 將原先CSS指定標籤的寫法改成使用class名稱來選擇,selector的寫法上是一個小數點加class名稱 (".$className"):

    CSS

    .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中以井號(#)開頭來選擇:

HTML

<h1 id="first-title"> 第一個標題 </h1> <h1 id="second-title"> 第二個標題 </h1>

CSS

#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>元素,結構上可以想像成:

    HTML

    <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架構來當範例:

HTML

<div class="container"> <div class="block1">區塊1</div> <div class="block2">區塊2</div> <div class="block3">區塊3</div> </div>

flex-direction

我們有一個容器內有三個區塊,可以透過設定 flex-direction 來改變排列方式:

CSS

.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 來調整元素水平方向的對齊方式:

CSS

.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 則是用來調整垂直方向的對齊方式:

CSS

.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

CSS

$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

CSS

$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

CSS

$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,這部分就下一篇再談談。