筆記 - CSS 基礎
本週開始從前端 CSS 基礎開始複習與學習。
CSS
All CSS properties - w3c school
display
- display: none
- display: block
- display: inline
- display: inline-block
- display: contents
- display: flex
- display: grid
等等
display:flex => Flexbox 排版系統
display: flex 之後,item 為 flex container。
Flex container properties:
- flex-direction: 改變 item 的排列方向 ( default: row, 表示 row 由左至右 為 main axis)屬性有 row, row-reverse, column, column-reverse 
- flex-wrap: 元素太多遇到邊界自動換行 - no wrap (default): 寬度不夠時,會壓縮元素寬度擠成一行
- warp: 寬度不夠時會自動換行
- wap-reverse:換行時,新的一行在舊的上面
 
- flex-flow: flex-direction flex-wrap 寫一起 
- justify-content: main axis 的對齊與間距。space 指 container 空間裡 item 的分佈- flex-start (default): 對齊起始點
- flex-end
- center
- space-between: 兩側貼邊界,在平均分配間距
- space-around: 每個 item 左右兩側空間平均分配
- space-evenly: 每個 item 間距、與邊界距離都相同
 
- align-items: cross axis 的對齊與間距- stretch (default): item 會延展填滿空間,除非有指定 width/height
- flex-start: 貼齊 cross axis start
- flex-end
- center
- baseline: 先對齊內容(文字下緣), item 隨著跑
 
- align-content(?)
position
定義元素與頁面流 (page flow) 的相互關係
The position CSS property sets how an element is positioned in a document. The top, right, bottom, and left properties determine the final location of positioned elements.
- position: static (default) 不會因為設定偏移值 (top/right/bottom/left) 而產生位移
- position: relative 定義 top/right/bottom/left 會產生偏移
- position: absolute 跳脫 page flow, 在 page flow 中不佔有空間- 元素大小會根據內容變化
- 定義偏移值後,元素會往上層尋找「非靜態區塊」(不是 position: static 的元素)做為定位參考點。若上層皆為 static,則會找到 HTML 最外層元素 <body>來做定位。
- 要使用 absolute 時,通常在此元素的 parent layer 定義 relative 做為定位參考點
 
- position: fixed 跳脫 page flow, 以當前頁面的可視區 viewport 來定位- 元素大小依內容變化,也不受 parent layer 影響
- 應用:header, 網頁右下客服框
 
CSS 優先級
CSS 樣式來源
CSS = Cascading Style Sheets,來源可分為三種,優先順序低 -> 高
- User agent origin:由「瀏覽器廠商」制定,就是瀏覽器預設樣式
- User origin:由「瀏覽器使用者」制定,使用者設定
- Author origin:由「網頁開發者」制定
CSS 套用方法
優先順序低 -> 高
- HTML 外部載入 <link href="style.css">
- HTML 內部載入 <style>...</style>
- HTML 行內套用 <div style="...">
CSS 選擇器
透過多種 CSS 選擇器,選取到特定的元素來指定樣式,分為三個等級,以下由高至低
- 等級一:id, ex.#article
- 等級二:class, attribute, pseudo-class. ex. .container,[type="radio"],:hover
- 等級三:element and pseudo-element. ex. div,::before
CSS 選擇器優先級計算:
以#article > .my-container div 為例
- 等級一:id #article
- 等級二:class .my-container
- 等級三:element div
 優先級得分是 1-1-1
若加入一個class #article > .my-container div.active,則會變成 1-2-1,優先級會比上一個選擇器高,裡面的樣式會優先呈現。
應用樣式優先級計算,在不修改前面的 code 前提下,修改或改寫 CSS 樣式。
CSS 撰寫順序
後面寫的會覆蓋掉前面寫的
實作中需注意的三件事
- 不輕易使用 !important避免導致日後難維護
- 遵守內容和樣式分離:盡量不要在 HTML 中另外撰寫 style 區塊及使用 inline style ,除非是用 JavaScript 動態控制樣式變化的時候
- 讓選擇器的優先級放低:盡量選用 Class 或 Element 的級別的選擇器,非必要不用 id 或複雜的選擇器組合,保留彈性給後續的樣式來覆蓋
偽元素與偽類
Pseudo-elements 偽元素
偽元素不存在於 DOM 節點中,但卻如真的元素一樣可受 CSS 操控樣式
寫法:選擇器後面加上兩個冒號與關鍵字,例如p::first-line,可以選取段落中的第一行文字
常用關鍵字如下,其中 ::before 與 ::after 尤其常用
- ::first-line - 選取第一行
- ::first-letter - 選取第一個字
- ::before - 在選取的元素前面插入東西
- ::after - 在選取的元素後面插入東西
- ::selection - 選取反白後的文字
| 1 | <p>Hello World</p> | 
| 1 | p::before { | 
可以看到 ♥ Hello World ^_^
::before 會變成 <p> 內的第一個子元素,::after 為 <p> 結束前的最後一個子元素。::before 與 ::after 兩者的預設值都是 display:inline 行內元素,並會繼承 p 標籤的其他屬性(例如字體大小)
Pseudo-class 偽類
偽類與元素的某個「狀態」有關,例如:
- :visited - 點擊過的超連結
- :checked - 被勾選的元素
- :hover - 滑鼠滑過的地方
- :focus - 滑鼠所在的表單輸入框
- :first-child - 第一個子元素
- :last-child - 最後一個子元素
- :nth-child() - 特定子元素
| 1 | <div class="example"> | 
| 1 | .example p:nth-child(odd) { | 
可以達成單雙數行背景顏色不同的效果。