# CSS 筆記 ## CSS 參考網址 - [w3schools](https://www.w3schools.com/css/) :::success 學習完後可去練習的地方練習我們設計的題目,可以試試看會不會~~ ::: ## How to use CSS 有三種插入style的方式: 1. [External CSS](#External-CSS) 2. [Internal CSS](#Internal-CSS) 3. [Inline CSS](#Inline-CSS) ### External CSS 將CSS指令寫在另一個副檔名為.css的檔案中(不能包含任何HTML指令),可以直接改變整個網站風格 指令: ```html <head> <link rel="stylesheet" href="檔案名稱/路徑"> </head> ``` ### Internal CSS 將CSS指令寫在和HTML指令同一個檔案中,只能修改此網頁的風格 指令: ```html <head> <style> body { background-color: linen; } h1 { color: maroon; margin-left: 40px; } </style> </head> ``` ### Inline CSS 將CSS指令寫在相關的元素附近,只能修改一個元素的風格 指令: ```html <!DOCTYPE html> <html> <body> <h1 style="color:blue;text-align:center;">This is a heading</h1> <p style="color:red;">This is a paragraph.</p> </body> </html> ``` #### Priority :::warning 當同時使用External, Internal, Inline CSS時,將以Inline CSS的內容作為最後表現形態 即CSS優先順序為: Inline > Internal > External 但在任一CSS後面加入"!important",則無視優先順序 ::: ------------------------------------------------------- ## Selectors CSS 選擇器可用來**尋找**(或選擇)想要裝飾的HTML元素。 **CSS selectors 的五種分類:** 1. [Simple selectors](#Simple-selectors) - 以name, id, class作為選擇參考 2. [Combinator selectors](#Combinator-selectors) - 以特殊關聯符連結兩個simple seletors,例:`>`、`+`、`~` 3. [Pseudo-class selectors](#Pseudo-class-selectors) - 以特定狀態作為選擇參考,例:`:hover`、`:visited`、`first-child` 4. [Pseudo-elements selectors](#Pseudo-class-selectors) - 選擇並裝飾元素的部分區塊,例:`::first-line`、`::before` 5. [Attribute selectors](#Attribute-selectors) - 以屬性或其值作為選擇參考,例:`a[target="_blank"]`、`[attribute~="value"]` ### 1. Simple selectors 用name、id、class選擇要修改風格的元素 * name 所有用到**同一個tag名稱**的element都會改變風格。 ```html <!DOCTYPE html> <html> <head> <style> p { text-align: center; color: dodgerblue; } </style> </head> <body> <p>Every paragraph will be affected by the style.</p> <p>Me too!</p> <p>And me!</p> </body> </html> ``` <div style="border:1px solid"> <p style="text-align: center;color: dodgerblue;">Every paragraph will be affected by the style.</p> <p style="text-align: center;color: dodgerblue;">Me too!</p> <p style="text-align: center;color: dodgerblue;">And me!</p> </div> <!-- ![螢幕擷取畫面 2024-01-21 223017](https://hackmd.io/_uploads/ByNX0jqY6.png) --> * id(#) 用**id**選擇**特定元素**改變其風格,==一個頁面中的id要唯一==。 ```html <!DOCTYPE html> <html> <head> <style> #para1 { text-align: center; color: dodgerblue; } </style> </head> <body> <p id="para1">Hello World!</p> <p>This paragraph is not affected by the style.</p> </body> </html> ``` <div style="border:1px solid"> <p style="text-align: center;color: dodgerblue;">Hello World!</p> <p>This paragraph is not affected by the style.</p> </div> <!-- ![image](https://hackmd.io/_uploads/H12ERsqtp.png) --> * class(.) --> 用**class名稱**選擇要改變風格的**所有特定元素** (一個元素可以屬於多個class,以空格分開) ```html <!DOCTYPE html> <html> <head> <style> .center { text-align: center; color: dodgerblue; } </style> </head> <body> <h1 class="center">Dodgerblue and center-aligned paragraph.</h1> <p class="center">Dodgerblue and center-aligned paragraph.</p> </body> </html> ``` <div style="border:1px solid"> <h1 style="text-align: center;color: dodgerblue;">Dodgerblue and center-aligned paragraph.</h1> <p style="text-align: center;color: dodgerblue;">Dodgerblue and center-aligned paragraph.</p> </div> <!-- ![image](https://hackmd.io/_uploads/HkHwCocYT.png) --> * name + class --> 改變特定tag中特定class名稱的風格 ```html <!DOCTYPE html> <html> <head> <style> p.center { text-align: center; color: dodgerblue; } </style> </head> <body> <span class="center">This span will not be affected</h1> <p class="center">This paragraph will be red and center-aligned.</p> </body> </html> ``` <div style="border:1px solid"> <span>This span will not be affected</span> <p style="text-align: center;color: dodgerblue;">This paragraph will be dodgerblue and center-aligned.</p> </div> <!-- ![image](https://hackmd.io/_3uploads/HyLdCicK6.png) --> * Universal(*) --> 改變**所有頁面**上元素的風格 ```html <!DOCTYPE html> <html> <head> <style> * { text-align: center; color: dodgerblue; } </style> </head> <body> <h1>Hello world!</h1> <p>Every element on the page will be affected by the style.</p> <p id="para1">Me too!</p> <p>And me!</p> </body> </html> ``` <div style="border:1px solid"> <h1 style="text-align: center;color: dodgerblue;">Hello world!</h1> <p style="text-align: center;color: dodgerblue;">Every element on the page will be affected by the style.</p> <p style="text-align: center;color: dodgerblue;">Me too!</p> <p style="text-align: center;color: dodgerblue;">And me!</p> </div> <!-- ![image](https://hackmd.io/_uploads/BJgwJhcFa.png) --> * group --> 將不同的元素改成同一個風格 ```html <!DOCTYPE html> <html> <head> <style> h1, h2 { text-align: center; color: dodgerblue; } </style> </head> <body> <h1>Hello World!</h1> <h2>Smaller heading!</h2> <p>This is a paragraph.</p> </body> </html> ``` <div style="border: 1px solid;"> <h1 style="text-align: center;color: dodgerblue;">Hello World!</h1> <h2 style="text-align: center;color: dodgerblue;">Smaller heading!</h2> <p>This is a paragraph.</p> </div> <!-- ![image](https://hackmd.io/_uploads/HJp1gnqYa.png) --> -------------------------------------------------- ### 2. Combinator selectors 用來指定和其他元素有關係的特定元素,通常有父子、兄弟、前後,由多個simple selector組成。 * descendant selector (space) --> 是特定元素的後代元素會被修改 ```html <!DOCTYPE html> <html> <head> <style> div p { //所有包含在div中的p都會被修改 background-color: DodgerBlue; } </style> </head> <body> <div> <p>Paragraph 1 in the div.</p> <p>Paragraph 2 in the div.</p> <section><p>Paragraph 3 in the div.</p></section> </div> <p>Paragraph 4. Not in a div.</p> <p>Paragraph 5. Not in a div.</p> </body> </html> ``` <div style="border: 1px solid;"> <div> <p style="background-color: DodgerBlue;">Paragraph 1 in the div.</p> <p style="background-color: DodgerBlue;">Paragraph 2 in the div.</p> <section><p style="background-color: DodgerBlue;">Paragraph 3 in the div.</p></section> </div> <p>Paragraph 4. Not in a div.</p> <p>Paragraph 5. Not in a div.</p> </div> <!--![image](https://hackmd.io/_uploads/r1ybsent6.png)--> * child selector (>) --> 是特定元素的子元素會被修改 ```html <!DOCTYPE html> <html> <head> <style> div > p { // div的child為p的 background-color: DodgerBlue; } </style> </head> <body> <div> <p>Paragraph 1 in the div.</p> <p>Paragraph 2 in the div.</p> <section> <!-- not Child but Descendant --> <p>Paragraph 3 in the div (inside a section element).</p> </section> <p>Paragraph 4 in the div.</p> </div> <p>Paragraph 5. Not in a div.</p> </body> </html> ``` <div style="border: 1px solid;"> <div> <p style="background-color: DodgerBlue;">Paragraph 1 in the div.</p> <p style="background-color: DodgerBlue;">Paragraph 2 in the div.</p> <section> <!-- not Child but Descendant --> <p>Paragraph 3 in the div (inside a section element).</p> </section> <p style="background-color: DodgerBlue;">Paragraph 4 in the div.</p> </div> <p>Paragraph 5. Not in a div.</p> </div> <!-- ![image](https://hackmd.io/_uploads/H1Dj2enK6.png)--> :::info :::spoiler Child和Descendant差異 * Child(子元素) * 直接位於父類別的元素(只縮排一次) eg: ```html <div> <p>Paragraph 1 in the div.</p> <div> ``` * Descendant(後代) * 位於父類別內的所有元素(可以縮排一次或多次) eg: ```html <div> <section> <p>Paragraph 3 in the div (inside a section element).</p> </section> </div> ``` ::: * adjacent sibling selector (+) --> 是在同一個父元素下且在特定元素==後==的**一個元素**會被修改(有相同父元素的子元素) ```html <!DOCTYPE html> <html> <head> <style> div + p { background-color: DodgerBlue; } </style> </head> <body> <div> <p>Paragraph 1 in the div.</p> </div> <p>Paragraph 2. After a div.</p> <p>Paragraph 3. After a div.</p> </body> </html> ``` * paragraph2和`<div>`屬於同一個父元素且paragraph2在`<div>`之後 <div style="border: 1px solid;"> <div> <p>Paragraph 1 in the div.</p> </div> <p style="background-color: DodgerBlue;">Paragraph 2. After a div.</p> <p>Paragraph 3. After a div.</p> </div> <!--![image](https://hackmd.io/_uploads/B1tDjv0KT.png)--> * general sibling selector (~) --> 是在同一個父元素下且在特定元素==後==的**所有元素**會被修改(有相同父元素的子元素) ```html <!DOCTYPE html> <html> <head> <style> div ~ p { background-color: DodgerBlue; } </style> </head> <body> <p>Paragraph 1.</p> <div> <p>Paragraph 2.</p> </div> <p>Paragraph 3.</p> <p>Paragraph 4.</p> </body> </html> ``` <div style="border: 1px solid;"> <p>Paragraph 1.</p> <p>Paragraph 2.</p> <p style="background-color: DodgerBlue;">Paragraph 3.</p> <p style="background-color: DodgerBlue;">Paragraph 4.</p> </div> ### 3. Pseudo-class selectors * 用來設定元素的狀態(可以搭配HTML class) * eg:滑鼠游標經過文字時會放大文字 * 使用順序:++a:link、a:visited -> a:hover -> a:active++ ```html <html> <head> <style> /* unvisited link */ a:link { color: red; } /* visited link */ a:visited { color: green; } /* mouse over link */ a:hover { color: hotpink; } /* selected link */ a:active { color: blue; } </style> </head> <body> <h2>Styling a link depending on state</h2> <p><b><a href="default.asp" target="_blank">This is a link</a></b></p> <p><b>Note:</b> a:hover MUST come after a:link and a:visited in the CSS definition in order to be effective.</p> <p><b>Note:</b> a:active MUST come after a:hover in the CSS definition in order to be effective.</p> </body> </html> ``` 滑鼠游標放到"This is a link"時字的顏色會變粉紅色 link: ![image](https://hackmd.io/_uploads/ByUqGd6s1l.png) hover: ![image](https://hackmd.io/_uploads/ByOuTITjJl.png) 其他指令舉例: * first-child -> 遇到某父類別中的第一個子元素 * lang -> 特定的語言會被修改 :::info :::spoiler link, visited, hover, active**區別**及**排列順序** * **link v.s. visited** * link:尚未被訪問的連結使用的格式 * visited:已被訪問的連結使用的格式 * **hover v.s. active** * hover:當鼠標懸浮於目標之上時所顯示的格式 * active:當鼠標按下左鍵(尚未釋放左鍵前)所展現的格式 * 在CSS的定義中,link, visited, hover, focus, active的排列有一定的順序,排列順序如下: ***link -> visited -> hover -> focus -> active*** ::: ### 4. Pseudo-elements selectors 用在修改特定部分的元素(可以搭配class使用、針對同一個元素可以多個Pseudo-elements一起使用),例如一段文字中只修改第一行的風格。 * `::first-line`:第一行的的長度會依照網頁大小不同而不同(只能用在block-level的元素) ```html <style> p::first-line { color: #ff0000; font-variant: small-caps;/*字母改大寫形式,但尺寸與小寫字母相同(第一個字母除外)*/ } </style> </head> <body> <p>You can use the ::first-line pseudo-element to add a special effect to the first line of a text. Some more text. And even more, and more, and more, and more, and more, and more, and more, and more, and more, and more, and more, and more.</p> </body> ``` ![image](https://hackmd.io/_uploads/B1Jl9y6Ya.png) 其他舉例: * `::first-letter`:第一個字母(只能用在block-level的元素) * `::before`:在特定元素前插入一些內容 * `::after`:在特定元素後插入一些內容 * `::marker`:針對list編號修改風格 * `::selection`:設定當滑鼠游標選取某段文字時的風格,像是color、background、cursor和outline ### 5. Attribute selectors --> 依照attribute或attribute值的內容選擇元素 有`target`屬性的才會修改風格,`target`也可以改成 `target="_blank"`代表屬性有特定值時才修改風格 ```html <style> a[target] { background-color: yellow; } </style> </head> <body> <h2>CSS [attribute] Selector</h2> <p>The links with a target attribute gets a yellow background:</p> <a href="https://www.w3schools.com">w3schools.com</a> <a href="http://www.disney.com" target="_blank">disney.com</a> <a href="http://www.wikipedia.org" target="_top">wikipedia.org</a> </body> </html> ``` ![image](https://hackmd.io/_uploads/rk-MkgTta.png) 其他舉例: * `[attribute~="value"]`:屬性值為特定的單詞(空白分隔) * `[title~="flower"]`可調整的類別:`title="flower"`、 `title="klematis flower"` * `[attribute|="value"]`:屬性值為特定的文字(可以有'-'符號連接) *`[class~="top"]`可調整的類別:`class="top"`、`class="top-text"` * **不能**調整的類別:`class="topcontent"` * `attribute^= "value"`:屬性值由特定的文字開頭 * `[class~="top"]`可調整的類別:`class="top"`、`class="top-text"`、`class="topcontent"` * `attribute$= "value"`:屬性值由特定的文字結尾 * `[class$="test"]`可調整的類別: `class="first_test"`、 `class="my-test"`、`class="mytest"` * `attribute*= "value"`:屬性值為特定的文字(可以是某個詞的一部分) * eg:`[class*= "te"]` title有te文字都會被調整 * 針對特定的styling forms不用class或ID,依據input type去調整 * eg:`input[type="text"]` # 主要使用 CSS ## Background - background-color ` background-color: lightblue; /*把背景換藍色*/ ` - background-image ` background-image: url("paper.gif"); /*背景圖片是paper.gif*/ ` - background-repeat `background-repeat: repeat-x; /*水平重複*/` `background-repeat: repeat-y; /*垂直重複*/` `background-repeat: no-repeat;/*不重複*/` - background-attachment `background-attachment: fixed;/*固定背景*/` `background-attachment: scroll;/*滾動背景*/` - background-position `background-position: right top;/*右上*/` `background-position: left bottom;/*左下*/` ## Color 可以更改字的顏色或背景顏色,CSS裡有已命名好的顏色,也可以自己用別的方式去設定顏色,例如 - RGB - HEX - HSL ```html <!DOCTYPE html> <html> <body> <h3 style="color:Tomato;">Hello World</h3> <h3 style="background-color:Orange;">Hello World</h3> <h3 style="border:2px solid DodgerBlue;">Hello World</h3> <h3 style="background-color:rgb(255, 99, 71);">...</h3> <h3 style="background-color:#ff6347;">...</h3> <h3 style="background-color:hsl(9, 100%, 64%);">...</h3> <h3 style="background-color:rgba(255, 99, 71, 0.5);">...</h3> <h3 style="background-color:hsla(9, 100%, 64%, 0.5);">...</h3> </body> </html> ``` - 做出來長這樣 ![螢幕擷取畫面 2024-01-21](https://hackmd.io/_uploads/BkCNSs5Yp.png) ## Box Model - Content - 內容,包含文字和圖像 - Padding - 框框跟內容的中間 - Border - 框框的樣式、大小以及顏色 - Margin - 框框外面的邊界大小 ![image](https://hackmd.io/_uploads/BkSQ63Ica.png) ```html <!DOCTYPE html> <html> <head> <style> div { background-color: yellow; width: 300px; border: 15px solid lightblue; padding: 50px; margin: 20px; } </style> </head> <body> <div>This is a example.</div> </body> </html> ``` - 做出來的樣子 ![image](https://hackmd.io/_uploads/rkC4ypIc6.png) ## Float `float: right;` - left - 靠左 - right - 靠右 - none - 預設 - inherit - 繼承父元素的設定 inline才能用,block不能用,因為block占據整個畫面無法靠左或靠右,可以利用display轉換成inline ## RWD 響應式網頁:可以根據不同的螢幕大小去設計一個有彈性的使用者介面 ```html <style> body { background-color: pink; //原本背景是粉色 } @media screen and (min-width: 480px) { //視窗大於480px時背景會變綠色 body { background-color: lightgreen; } } </style> ``` - 小於480px的樣子 ![image](https://hackmd.io/_uploads/rJ9mEaU9p.png) - 大於480px的樣子 ![image](https://hackmd.io/_uploads/HkREVaLca.png) ## Flex 可以有效率的調整排版,像是置中區塊、對齊內容,也可以配合響應式網頁進行換行,一個屬性只對單一方向排版 以下是常見的屬性: - `display:flex;` //宣告此容器要使用flex - `flex-direction: column;` //控制主軸方向,row:水平方向; column:垂直方向 - `flex-wrap: wrap;` //wrap:換行; nowrap:不換 - `justify-content: center` //center:置中;flex-start:靠左;flex-end:靠右 - `align-items:center` //center:置中;flex-start:靠上;flex-end:靠下 Flexbox 的組成包含: - container : 父元素(容器) &lt;div>元素 - items : container &lt;div>中的項目 ![image](https://www.casper.tw/images/2017/flex/flex.png) 要有flex佈局,父容器就要將`dispaly`屬性設為`flex`,而內部第一層的子元素就會自動成為flex items :::spoiler Flex vs. Inline-Flex - Flex:彈性容器會變成block元素 `display: flex;` - Inline-Flex:彈性容器會變成inline元素 `display: inline-flex;` ::: --- ### Flex Container * [設定顯示方向及換行](#flex-flow:-設定顯示方向以及是否換行(為`flex-direction`與`flex-warp`的縮寫)) * [指定顯示方向](#flex-direction:-指定顯示方向) * [控制是否換行](flex-wrap:-控制超出範圍時是否換行) * [水平方向對齊](#justify-content:-控制主軸方向的對齊(通常為水平對齊)) * [單行垂直方向對齊](#align-items:-控制交錯軸方向的單行對齊(通常為垂直對齊)) * [整體垂直方向對齊](#align-content:-整體以交錯軸方向對齊) #### flex-direction: 指定顯示方向 設定flex的軸線(主軸與交錯軸),會影響內元件對齊。 * 下圖是預設軸線方向: ![image](https://www.casper.tw/images/2017/flex/flex-axis.png) * row - 預設值,讓物件沿左到右水平顯示 * 程式碼 ```html= <html> <head> <style> .flex-container { display: flex; flex-direction: row; background-color: DodgerBlue; } .flex-container > div { background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px; } </style> </head> <body> <div class="flex-container"> <div>1</div> <div>2</div> <div>3</div> </div> </body> </html> ``` * 結果預覽 <div style="display: flex; flex-direction: row; background-color: DodgerBlue;"> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">1</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">2</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">3</div> </div> * row-reverse - 讓物件由右到左水平顯示(水平反轉) * 程式碼 ```css= .flex-container { display: flex; flex-direction: row-reverse; background-color: DodgerBlue; } ``` * 結果預覽 <div style="display: flex; flex-direction: row-reverse; background-color: DodgerBlue;"> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">1</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">2</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">3</div> </div> * column - 讓物件由上到下垂直顯示(主軸轉為垂直向下) * 程式碼 ```css= .flex-container { display: flex; flex-direction: column; background-color: DodgerBlue; } ``` * 結果預覽 <div style="display: flex; flex-direction: column; background-color: DodgerBlue;"> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">1</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">2</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">3</div> </div> * column-reverse - 讓物件由下到上垂直顯示(主軸轉為垂直向上) * 程式碼 ```css= .flex-container { display: flex; flex-direction: column-reverse; background-color: DodgerBlue; } ``` * 結果預覽 <div style="display: flex; flex-direction: column-reverse; background-color: DodgerBlue;"> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">1</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">2</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">3</div> </div> 以下是所有選項的示意圖: ![image](https://www.casper.tw/images/2017/flex/flex-direction.png) [go back to Flex-Container!](#Flex-Container) #### flex-wrap: 控制超出範圍時是否換行 * nowrap - 預設值,不換行 * 程式碼 ```css= .flex-container { display: flex; flex-wrap: nowrap; background-color: DodgerBlue; } ``` * 結果顯示 <div style="display:flex; flex-wrap:nowrap; background-color: DodgerBlue;"> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">1</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">2</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">3</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">4</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">5</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">6</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">7</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">8</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">9</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">10</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">11</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">12</div> </div> * wrap - 超出範圍就換行,正著排(由上往下) * 程式碼 ```css= .flex-container { display: flex; flex-wrap: wrap; background-color: DodgerBlue; } ``` * 結果預覽 <div style="display:flex; flex-wrap:wrap; background-color: DodgerBlue;"> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">1</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">2</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">3</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">4</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">5</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">6</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">7</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">8</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">9</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">10</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">11</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">12</div> </div> * wrap-reverse - 超出範圍就換行,倒著排(由下往上) * 程式碼 ```css= .flex-container { display: flex; flex-wrap: wrap-reverse; background-color: DodgerBlue; } ``` * 結果預覽 <div style="display:flex; flex-wrap:wrap-reverse; background-color: DodgerBlue;"> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">1</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">2</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">3</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">4</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">5</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">6</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">7</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">8</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">9</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">10</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">11</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">12</div> </div> [go back to Flex-Container!](#Flex-Container) #### flex-flow: 設定顯示方向以及是否換行(為`flex-direction`與`flex-warp`的縮寫) * 程式碼 ```css= .flex-container { display: flex; flex-flow: row wrap; background-color: DodgerBlue; } ``` * 結果顯示 <div style="display: flex; flex-flow: row wrap; background-color: DodgerBlue;"> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">1</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">2</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">3</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">4</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">5</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">6</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">7</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">8</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">9</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">10</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">11</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">12</div> </div> [go back to Flex-Container!](#Flex-Container) #### justify-content: 控制主軸方向的對齊(通常為水平對齊) * center - 置中 * 程式碼 ```css= .flex-container { display: flex; justify-content: center; background-color: DodgerBlue; } ``` * 結果預覽 <div style="display:flex; justify-content:center; background-color:DodgerBlue;"> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">1</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">2</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">3</div> </div> * flex-start - 預設值,讓內元件從 container 的主軸起始位置開始(通常是從左向右) * 程式碼 ```css= .flex-container { display: flex; justify-content: flex-start; background-color: DodgerBlue; } ``` * 結果預覽 <div style="display:flex; justify-content:flex-start; background-color:DodgerBlue;"> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">1</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">2</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">3</div> </div> * flex-end - 讓內元件從 container 的主軸末尾位置開始 * 程式碼 ```css= .flex-container { display: flex; justify-content: flex-end; background-color: DodgerBlue; } ``` * 結果預覽 <div style="display:flex; justify-content:flex-end; background-color:DodgerBlue;"> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">1</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">2</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">3</div> </div> * space-around - 內元件彼此間距相等,且邊緣留有內元件間距的一半 * 程式碼 ```css= .flex-container { display: flex; justify-content: space-around; background-color: DodgerBlue; } ``` * 結果預覽 <div style="display:flex; justify-content:space-around; background-color:DodgerBlue;"> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">1</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">2</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">3</div> </div> * space-between - 內元件彼此間距相等,且兩端內元件貼齊邊緣 * 程式碼 ```css= .flex-container { display: flex; justify-content: space-between; background-color: DodgerBlue; } ``` * 結果預覽 <div style="display:flex; justify-content:space-between; background-color:DodgerBlue;"> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">1</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">2</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">3</div> </div> * space-evenly - 內元件彼此間距相等,且邊緣空間也和間距一樣大 * 程式碼 ```css= .flex-container { display: flex; justify-content: space-evenly; background-color: DodgerBlue; } ``` * 結果預覽 <div style="display:flex; justify-content:space-evenly; background-color:DodgerBlue;"> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">1</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">2</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">3</div> </div> [go back to Flex-Container!](#Flex-Container) #### align-items: 控制交錯軸方向的單行對齊(通常為垂直對齊) * center - 單行置中(高度平均分配) * 程式碼 ```css= .flex-container { display: flex; height: 200px; align-items: center; background-color: DodgerBlue; } ``` * 結果預覽 <div style="display:flex; height:200px; align-items:center; background-color:DodgerBlue;"> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">1</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">2</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">3</div> </div> * flex-start - 從 container 的交錯軸起始位置開始(通常是從上到下) * 程式碼 ```css= .flex-container { display: flex; height: 200px; align-items: flex-start; background-color: DodgerBlue; } ``` * 結果預覽 <div style="display:flex; height:200px; align-items:flex-start; background-color:DodgerBlue;"> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">1</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">2</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">3</div> </div> * flex-end - 從 container 的交錯軸末尾位置開始(通常是從下到上) * 程式碼 ```css= .flex-container { display: flex; height: 200px; align-items: flex-end; background-color: DodgerBlue; } ``` * 結果預覽 <div style="display:flex; height:200px; align-items:flex-end; background-color:DodgerBlue;"> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">1</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">2</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">3</div> </div> * stretch - 預設值(等同於normal),若內元件未設置高度或設為auto,內元件會在交錯軸伸縮以符合 container * 程式碼 ```css= .flex-container { display: flex; height: 200px; align-items: stretch; background-color: DodgerBlue; } ``` * 結果預覽 <div style="display:flex; height:200px; align-items:stretch; background-color:DodgerBlue;"> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">1</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">2</div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;">3</div> </div> * baseline - 內元件依字符底部基準線擺放,用在子元素的字體大小不同時。 * 程式碼 ```css= .flex-container { display: flex; height: 200px; align-items: baseline; background-color: DodgerBlue; } ``` * 結果預覽 <div style="display:flex; height:200px; align-items:center; background-color:DodgerBlue;"> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;"><h1>1</h1></div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;"><h6>2</h6></div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;"><h3>3</h3></div> <div style="background-color:#f1f1f1; width:100px; margin:10px; text-align:center; line-height:75px; font-size:30px;"><small>4</small></div> </div> [go back to Flex-Container!](#Flex-Container) #### align-content: 整體以交錯軸方向對齊 * center - 整體置中於 container * 程式碼 ```css= .flex-container { display: flex; height: 600px; flex-wrap: wrap; align-content: center; overflow: scroll; background-color: DodgerBlue; } ``` * 結果預覽 <div style="display: flex; height: 600px; flex-wrap: wrap; align-content: center; overflow: scroll; background-color: DodgerBlue;"> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">1</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">2</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">3</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">4</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">5</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">6</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">7</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">8</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">9</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">10</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">11</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">12</div> </div> * stretch - 預設值,整體一起伸縮以填滿整個 container * 程式碼 ```css= .flex-container { display: flex; height: 600px; flex-wrap: wrap; align-content: stretch; overflow: scroll; background-color: DodgerBlue; } ``` * 結果預覽 <div style="display: flex; height: 600px; flex-wrap: wrap; align-content: stretch; overflow: scroll; background-color: DodgerBlue;"> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">1</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">2</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">3</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">4</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">5</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">6</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">7</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">8</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">9</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">10</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">11</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">12</div> </div> * flex-start - 整體從 container 的交錯軸起始位置開始(通常為上方) * 程式碼 ```css= .flex-container { display: flex; height: 600px; flex-wrap: wrap; align-content: flex-start; overflow: scroll; background-color: DodgerBlue; } ``` * 結果預覽 <div style="display: flex; height: 600px; flex-wrap: wrap; align-content: flex-start; overflow: scroll; background-color: DodgerBlue;"> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">1</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">2</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">3</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">4</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">5</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">6</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">7</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">8</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">9</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">10</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">11</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">12</div> </div> * flex-end - 整體從 container 的交錯軸末尾位置開始(通常為下方) * 程式碼 ```css= .flex-container { display: flex; height: 600px; flex-wrap: wrap; align-content: flex-end; overflow: scroll; background-color: DodgerBlue; } ``` * 結果預覽 <div style="display: flex; height: 600px; flex-wrap: wrap; align-content: flex-end; overflow: scroll; background-color: DodgerBlue;"> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">1</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">2</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">3</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">4</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">5</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">6</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">7</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">8</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">9</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">10</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">11</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">12</div> </div> * space-between - 整體的行間距相等,邊緣貼齊交錯軸始末兩端 * 程式碼 ```css= .flex-container { display: flex; height: 600px; flex-wrap: wrap; align-content: sapce-between; overflow: scroll; background-color: DodgerBlue; } ``` * 結果預覽 <div style="display: flex; height: 600px; flex-wrap: wrap; align-content: space-between; overflow: scroll; background-color: DodgerBlue;"> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">1</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">2</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">3</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">4</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">5</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">6</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">7</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">8</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">9</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">10</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">11</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">12</div> </div> * space-around - 整體的行間距相等,且邊緣(通常為上下)留有內部間距的一半 * 程式碼 ```css= .flex-container { display: flex; height: 600px; flex-wrap: wrap; align-content: sapce-around; overflow: scroll; background-color: DodgerBlue; } ``` * 結果預覽 <div style="display: flex; height: 600px; flex-wrap: wrap; align-content: space-around; overflow: scroll; background-color: DodgerBlue;"> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">1</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">2</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">3</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">4</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">5</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">6</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">7</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">8</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">9</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">10</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">11</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">12</div> </div> * space-evenly - 整體間距相等,且邊緣空間(通常為上下)也和間距一樣大 * 程式碼 ```css= .flex-container { display: flex; height: 600px; flex-wrap: wrap; align-content: space-evenly; overflow: scroll; background-color: DodgerBlue; } ``` * 結果預覽 <div style="display: flex; height: 600px; flex-wrap: wrap; align-content: space-evenly; overflow: scroll; background-color: DodgerBlue;"> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">1</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">2</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">3</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">4</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">5</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">6</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">7</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">8</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">9</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">10</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">11</div> <div style="background-color: #f1f1f1; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px;">12</div> </div> [go back to Flex-Container!](#Flex-Container) --- ### Flex Items [The order Property](#The-order-Property:) [The flex-grow Property](#flex-grow) [The flex-shrink Property](#The-flex-shrink-Property) [The flex-basis Property](#The-flex-basis-Property) [The flex Property](#The-flex-Property) [The align-self Property](#The-align-self-Property) 在 flex container 中的直接子元素(direct child elements)會自動變成 flex items。 :::info flex items 的CSS的屬性有 : * order * flex * flex-grow * flex-shrink * flex-basis * align-self ::: #### The order Property : * order屬性指定了 flex items 在 flex container 中的順序(由小排到大),==order值必須為整數,預設值為0,可為負值==。 * 程式碼 ```html= <!DOCTYPE html> <html> <head> <style> .flex-container { display: flex; align-items: stretch; background-color: #f1f1f1; } .flex-container > div { background-color: DodgerBlue; color: white; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px; } </style> </head> <body> <div class="flex-container"> <div style="order: 2">1</div> <div style="order: 1">2</div> <div style="order: 3">3</div> <div style="order: -1">4</div> </div> </body> </html> ``` * 結果預覽 <div style="display: flex; align-items: stretch; background-color: #f1f1f1;"> <div style="background-color: DodgerBlue; color: white; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px; order: 2">1</div> <div style="background-color: DodgerBlue; color: white; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px; order: 1">2</div> <div style="background-color: DodgerBlue; color: white; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px; order: 3">3</div> <div style="background-color: DodgerBlue; color: white; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px; order: -1">4</div> </div> #### flex-grow * flex-grow 屬性指定了有剩餘空間時一個 flex items相對於其他 flex items可以在主軸方向上擴展的比例,預設值為0,可為小數不可為負值。 * 程式碼 ```html= <body> <div class="flex-container"> <div style="flex-grow: 0.5">1</div> <div style="flex-grow: 0.5">2</div> <div style="flex-grow: 4">3</div> </div> </body> ``` * 結果預覽 <div style="display: flex; align-items: stretch; width:550px;background-color: #f1f1f1;"> <div style="background-color: DodgerBlue; color: white; margin: 10px; width: 30px; text-align: center; line-height: 75px; font-size: 30px; flex-grow: 0.5">1</div> <div style="background-color: DodgerBlue; color: white; margin: 10px; width: 30px; text-align: center; line-height: 75px; font-size: 30px; flex-grow: 0.5">2</div> <div style="background-color: DodgerBlue; color: white; margin: 10px; width: 30px; text-align: center; line-height: 75px; font-size: 30px; flex-grow: 4">3</div> </div> :::spoiler 如何計算擴展比例? 1. 設總寬為550px,內元件三個各先消耗30px,還有內元件兩側的margin長度各為10px,剩餘空間為400px(550-30\*3-10\*6)。 1. 計算flex-grow比例總和(0.5 : 0.5 : 4)得5,400/5=80px,前兩個元件增寬40px(80\*0.5=40),最後的元件增寬320px(80\*4=320) * 以上算式可參考上方「結果預覽」的詳細尺寸 ::: #### flex-shrink * flex-shrink 屬性指定了當items超出空間時一個 flex items相對於其他 flex items可以被壓縮的比例,==預設值為1,可為小數,不可為負值,不想被壓縮可設為0==。 * 程式碼 ```html= <div class="flex-container"> <div>1</div> <div>2</div> <div style="flex-shrink: 3">3</div> </div> ``` * 結果預覽 <!-- ![image](https://hackmd.io/_uploads/SyfYdLZs1x.png) --> <div style="display: flex; align-items: stretch; width:550px;background-color: #f1f1f1;"> <div style="background-color: DodgerBlue; color: white; margin: 10px; width: 180px; text-align: center; line-height: 75px; font-size: 30px; flex-shrink: 1">1</div> <div style="background-color: DodgerBlue; color: white; margin: 10px; width: 180px; text-align: center; line-height: 75px; font-size: 30px; flex-shrink: 1">2</div> <div style="background-color: DodgerBlue; color: white; margin: 10px; width: 180px; text-align: center; line-height: 75px; font-size: 30px; flex-shrink: 3">3</div> </div> :::spoiler 如何計算壓縮比例? 1. 設總寬為550px,內元件三個寬度各為180px,margin都為10px,則超出空間為50px(180\*3+10\*6-550=50)。 1. 計算壓縮權重(1\*180+1\*180+3\*180=900)為900px,將50px/900px=1/18為壓縮比率,前兩個元件壓縮10px(180/18=10),最後的元件壓縮30px(180/18\*3=30) 1. 前兩個元件的寬度為170px(180-10=170),最後的元件為150px(180-30=150) * 以上算式可參考上方「結果預覽」的詳細尺寸 ::: #### flex-basis * 指定 flex items (子元素)的初始長度,會因為 flex-direction 的不同而改變指定長度的對象(row->width/column->height),預設值為0 ```html= <div class="flex-container"> <div>1</div> <div>2</div> <div style="flex-basis: 200px">3</div> <div>4</div> </div> ``` ![image](https://hackmd.io/_uploads/rJp_cLZjJg.png) #### The flex Property * flex 屬性是一個簡寫屬性,用於 flex-grow、flex-shrink 和 flex-basis 屬性。 * 如果 flex 只填了一個數值,預設是調整「flex-grow」的效果。 * not growable (0), not shrinkable (0), 初始長度為 200 pixels: ```html= <div class="flex-container"> <div>1</div> <div>2</div> <div style="flex: 0 0 200px">3</div> <div>4</div> </div> ``` ![image](https://hackmd.io/_uploads/rk1hkg4j1l.png) #### The align-self Property * align-self 屬性指定 flex items 在flex container 內的對齊方式(只適用於交錯軸)。align-self 屬性會覆蓋容器的 align-items 屬性設置的預設對齊,因此可個別設定items的值。 * 將第三個項目對齊到container中間 ```html= <html> <head> <style> .flex-container { display: flex; height: 200px; background-color: #f1f1f1; } .flex-container > div { background-color: DodgerBlue; color: white; width: 100px; margin: 10px; text-align: center; line-height: 75px; font-size: 30px; } </style> </head> <body> <div class="flex-container"> <div>1</div> <div>2</div> <div style="align-self: center">3</div> <div>4</div> </div> </body> ``` ![image](https://hackmd.io/_uploads/HkY8QDWo1g.png =80%x) * 將第二個items對齊到 container 頂端,第三個items對齊到 container 底端 ```html= <div class="flex-container"> <div>1</div> <div style="align-self: flex-start">2</div> <div style="align-self: flex-end">3</div> <div>4</div> </div> ``` ![image](https://hackmd.io/_uploads/r10QBwWj1g.png =80%x) ---------------------------------------------- #### Responsive Flexbox * 當頁面寬度超過800px時,flex-direction 會由row變成column ```html= .flex-container { display: flex; flex-direction: row; } /* Responsive layout - makes a one column layout instead of a two-column layout */ @media (max-width: 800px) { .flex-container { flex-direction: column; } } ``` * 另外一個方法:更改 flex items 中 flex 的百分比,以產生適合各種螢幕尺寸的佈局,==記得在.flex-container中也要放flex-wrap: wrap== ```html= .flex-container { display: flex; flex-wrap: wrap; } .flex-item-left { flex: 50%; } .flex-item-right { flex: 50%; } /* Responsive layout - makes a one column layout instead of a two-column layout */ @media (max-width: 800px) { .flex-item-right, .flex-item-left { flex: 100%; } } ``` ## Grid 可以幫忙分配版面,將版面切成網格狀 [直接上w3schools教學](https://www.w3schools.com/css/css_rwd_grid.asp) - 有兩種寫法(block、inline) ```css grid-container { display: grid; //display寫grid } grid-container { display: inline-grid; //display寫inline-grid } ``` - column示意 ![image](https://hackmd.io/_uploads/S19QnTLcT.png) - row示意 ![image](https://hackmd.io/_uploads/S1cz3a8q6.png) - column-gap、row-gap示意 ![image](https://hackmd.io/_uploads/BJWW36U96.png) ### Grid Container Container 內 Item 行列的排列方式可由 ``` .grid-container1 { display: grid; grid-template-columns: auto 80px 1fr 30%; /*n個變數代表一行n個Item,這行有4個*/ grid-template-rows: auto auto;/*n個變數代表一列n個Item,這行有2個,假如有第三行(這個例子大於9個item),grid-auto-rows可統一控制*/ } .grid-container2 { display: grid; grid-template: 100px 200px 50px/ 150px 150px ;/*三行兩列*/ } .grid-container3 { display: grid; grid-template: "header header" "sidebar main" "footer footer"; grid-template-columns: 200px 1fr; grid-template-rows: 100px 1fr 50px; } ``` ![螢幕擷取畫面 2025-03-04 223700](https://hackmd.io/_uploads/HkHVgcVj1g.png) :::spoiler ``` <!DOCTYPE html> <html> <head> <style> .grid-container { display: grid; grid-template-columns: auto 80px 1fr 30%; grid-template-rows: auto auto; grid-auto-rows: 50px; gap: 10px; border: 2px solid black; padding: 10px; } .grid-container div { background-color: lightblue; padding: 10px; text-align: center; border: 1px solid darkblue; } .grid-container2 { display: grid; grid-template: 100px 200px 50px / 150px 150px; gap: 10px; border: 2px solid black; padding: 10px; } .grid-container2 div { background-color: lightcoral; padding: 10px; text-align: center; border: 1px solid darkred; } .grid-container3 { display: grid; grid-template: "header header" "sidebar main" "footer footer" ; grid-template-columns: 200px 1fr; grid-template-rows: 100px 1fr 50px; gap: 10px; border: 2px solid black; padding: 10px; } .grid-container3 .header { grid-area: header; background-color: lightgreen; } .grid-container3 .sidebar { grid-area: sidebar; background-color: lightpink; } .grid-container3 .main { grid-area: main; background-color: lightyellow; } .grid-container3 .footer { grid-area: footer; background-color: lightgray; } .grid-container3 div { padding: 10px; text-align: center; border: 1px solid darkgray; } </style> </head> <body> <h2>Grid Container 1</h2> <div class="grid-container"> <div>1</div> <div>2</div> <div>3</div> <div>4</div> <div>5</div> <div>6</div> <div>7</div> <div>8</div> <div>9</div> </div> <h2>Grid Container 2</h2> <div class="grid-container2"> <div>1</div> <div>2</div> <div>3</div> <div>4</div> <div>5</div> <div>6</div> </div> <h2>Grid Container 3</h2> <div class="grid-container3"> <div class="header">Header</div> <div class="sidebar">Sidebar</div> <div class="main">Main Content</div> <div class="footer">Footer</div> </div> </body> </html> ``` ::: * auto:根據內容自適應寬度。 * px:固定單位px。 * % :Container寬度的幾%。 * fr:剩餘的可用空間的幾等分。 minmax(min, max)可設定縮放的最大與最小。 repeat(3, 1fr) 同等於 1fr 1fr 1fr。 以及展示 ``` .grid-container { display: grid; place-content:center;/*上下左右*/ justify-content:center;/*左右*/ align-content:center;/*上下*/ } ``` | 參數種類 |意思 |例圖(justify-content)| | -------- | -------- | -------- | | start | 貼齊上/左 | ![螢幕擷取畫面 2025-03-04 160135](https://hackmd.io/_uploads/Sy2GNVViJx.png)| | end | 貼齊下/右|![螢幕擷取畫面 2025-03-04 160150](https://hackmd.io/_uploads/rJwmN4VoJl.png)| | center | 置中(不填滿上下左右) |![螢幕擷取畫面 2025-03-04 160204](https://hackmd.io/_uploads/S1HrVNEske.png)| |space-between|平分畫面且間隔相等,邊界沒有間隔|![螢幕擷取畫面 2025-03-04 160301](https://hackmd.io/_uploads/SyWLN44iJl.png)| |space-around|平分畫面且間隔相等,邊界間隔只有一半寬|![螢幕擷取畫面 2025-03-04 160334](https://hackmd.io/_uploads/rksLVV4syx.png)| |space-evenly|平分畫面且間隔相等,邊界有同等間隔|![螢幕擷取畫面 2025-03-04 160409](https://hackmd.io/_uploads/H1HwNNNoye.png)| 需注意剩餘空間是否足以安插間隔。 ### Grid properties * `Grid Lines` 可以決定item的大小 - 第一種寫法 : 從row1到row3,下面圖片的第一格 ```css .item1 { grid-column-start: 1; //起始row grid-column-end: 3; //結束row } ``` ![image](https://hackmd.io/_uploads/ByNHCTU9p.png) - 第二種寫法 : 從row1到row5,下面圖片的第一格 ```css .item1 { grid-column: 1 / 5; } ``` ![image](https://hackmd.io/_uploads/S1eGk08cp.png) - 第三種寫法 : 用格子算,從第一格到第三格,下面圖片的第一格 ```css .item1 { grid-column: 1 / span 3; } ``` ![image](https://hackmd.io/_uploads/B1pKk0IcT.png) * 程式碼 ```html= <html> <head> <style> .grid-container { display: grid; grid-template-columns: auto auto auto; gap: 10px; background-color: DodgerBlue; padding: 10px; } .grid-container > div { background-color: #f1f1f1; text-align: center; padding: 10px; font-size: 30px; } .item1 { grid-column-start: 2; grid-column-end: 4; } </style> </head> <body> <div class="grid-container"> <div class="item1">1</div> <div>2</div> <div>3</div> <div>4</div> <div>5</div> <div>6</div> <div>7</div> <div>8</div> </div> </body> </html> ``` * 結果預覽 <div style="display: grid; grid-template-columns: auto auto auto; gap: 10px; background-color: DodgerBlue; padding: 10px;"> <div style="background-color: #f1f1f1; text-align: center; padding: 10px; font-size: 30px; grid-column-start: 2; grid-column-end: 4;">1</div> <div style="background-color: #f1f1f1; text-align: center; padding: 10px; font-size: 30px;">2</div> <div style="background-color: #f1f1f1; text-align: center; padding: 10px; font-size: 30px;">3</div> <div style="background-color: #f1f1f1; text-align: center; padding: 10px; font-size: 30px;">4</div> <div style="background-color: #f1f1f1; text-align: center; padding: 10px; font-size: 30px;">5</div> <div style="background-color: #f1f1f1; text-align: center; padding: 10px; font-size: 30px;">6</div> <div style="background-color: #f1f1f1; text-align: center; padding: 10px; font-size: 30px;">7</div> <div style="background-color: #f1f1f1; text-align: center; padding: 10px; font-size: 30px;">8</div> </div> * 說明 設定 `item1` 元素會從第二列開始,到第四列結束 (佔 2 列),可參照上方 grid line 定義 * grid-column - 為 grid-column-start 和 grid-column-end 的縮寫 * 以上方例子,可改成以下兩種方式 ```css= .item1 { grid-column: 2 / 4; } ``` ```css= .item1 { grid-column: 2 / span 2; } ``` * span 指的是「空的格數」 * grid-row-start / grid-row-end - 定義元素開始與結束列行的位置 * 程式碼 ```css= .item1 { grid-row-start: 1; grid-row-end: 3; } ``` * 結果預覽 <div style="display: grid; grid-template-columns: auto auto auto; gap: 10px; background-color: DodgerBlue; padding: 10px;"> <div style="background-color: #f1f1f1; text-align: center; padding: 10px; font-size: 30px; grid-row-start: 1; grid-row-end: 3;">1</div> <div style="background-color: #f1f1f1; text-align: center; padding: 10px; font-size: 30px;">2</div> <div style="background-color: #f1f1f1; text-align: center; padding: 10px; font-size: 30px;">3</div> <div style="background-color: #f1f1f1; text-align: center; padding: 10px; font-size: 30px;">4</div> <div style="background-color: #f1f1f1; text-align: center; padding: 10px; font-size: 30px;">5</div> <div style="background-color: #f1f1f1; text-align: center; padding: 10px; font-size: 30px;">6</div> <div style="background-color: #f1f1f1; text-align: center; padding: 10px; font-size: 30px;">7</div> <div style="background-color: #f1f1f1; text-align: center; padding: 10px; font-size: 30px;">8</div> </div> * grid-row - 為 grid-row-start 和 grid-row-end 的縮寫 * grid-auto-columns - 指定隱式網格的列的大小 * 程式碼 ```css= .grid-container { display: grid; grid-template-columns: 100px 100px; /*指定義兩個顯式列*/ grid-auto-flow: column; /*讓其他不在顯示列的欄位向右排列*/ grid-auto-columns: 150px; /*未使用顯式定義的其他隱式列皆為150px*/ gap: 10px; background-color: #f1f1f1; padding: 10px; overflow-x: auto; /*超出範圍可滾動*/ } ``` * 結果預覽 <div style="display: grid; grid-template-columns: 100px 100px; grid-auto-flow: column; grid-auto-columns: 150px; gap: 10px; background-color: #f1f1f1; padding: 10px; overflow-x: auto;"> <div style="background-color: DodgerBlue; padding: 20px; text-align: center; font-size: 20px;">1</div> <div style="background-color: DodgerBlue; padding: 20px; text-align: center; font-size: 20px;">2</div> <div style="background-color: DodgerBlue; padding: 20px; text-align: center; font-size: 20px;">3</div> <div style="background-color: DodgerBlue; padding: 20px; text-align: center; font-size: 20px;">4</div> <div style="background-color: DodgerBlue; padding: 20px; text-align: center; font-size: 20px;">5</div> <div style="background-color: DodgerBlue; padding: 20px; text-align: center; font-size: 20px;">6</div> <div style="background-color: DodgerBlue; padding: 20px; text-align: center; font-size: 20px;">7</div> <div style="background-color: DodgerBlue; padding: 20px; text-align: center; font-size: 20px;">8</div> </div> * 說明 若有元素超過顯式定義的列範圍,寬度就設為 150px,顯式定義的 column 只有兩個參數,只定義了 line1 和 line2,所以會是 100px,剩下的 items 就會以 150px 顯示 * grid-auto-rows - 指定隱式網格的行的大小 * 程式碼 ```css= .grid-container { display: grid; grid-template-rows: 100px 100px; grid-template-columns: 100px 100px 100px; grid-auto-flow: row; grid-auto-rows: 150px; gap: 10px; background-color: #f1f1f1; padding: 10px; } ``` * 結果預覽 <div style="display: grid; grid-template-rows: 100px 100px; grid-template-columns: 100px 100px 100px; grid-auto-flow: row; grid-auto-rows: 150px; gap: 10px; background-color: #f1f1f1; padding: 10px;"> <div style="background-color: DodgerBlue; padding: 20px; text-align: center; font-size: 20px;">1</div> <div style="background-color: DodgerBlue; padding: 20px; text-align: center; font-size: 20px;">2</div> <div style="background-color: DodgerBlue; padding: 20px; text-align: center; font-size: 20px;">3</div> <div style="background-color: DodgerBlue; padding: 20px; text-align: center; font-size: 20px;">4</div> <div style="background-color: DodgerBlue; padding: 20px; text-align: center; font-size: 20px;">5</div> <div style="background-color: DodgerBlue; padding: 20px; text-align: center; font-size: 20px;">6</div> <div style="background-color: DodgerBlue; padding: 20px; text-align: center; font-size: 20px;">7</div> <div style="background-color: DodgerBlue; padding: 20px; text-align: center; font-size: 20px;">8</div> </div> * grid-auto-flow - 決定隱式元素擺放位置 * row: 預設值,自動填充 * column: 自動填充 * dense: 允許重新排列元素子填補空隙 :::spoiler 什麼是隱式網格? * 顯式網格(explicit grid): 由開發者設定出來的 grid > 可以透過 grid-template-columns 和 grid-template-rows 來設定形成網格的固定數量和軌道(手動設定) * 隱式網格(implicit grid): 除了顯式網格外,其他不存在的網格,由 grid 自動產生 > 即可透過 grid-auto-columns 和 grid-auto-rows 來定,若有元素超出顯式定義的範圍,就以其值作為極限值 ::: * grid-area - 定義空間名稱或位置,將 grid-row-start、 grid-column-start、 grid-row-end、 grid-column-end 一起表示 * 使用方式 ```css= .item1 { grid-area: 1 / 2 / 3 / 4; } ``` * grid-template-areas - 定義網格區域名稱,搭配 grid-area 使用 * 程式碼 ```css= .container { display: grid; grid-template-areas: "header header" "sidebar main" "footer footer"; } .header { grid-area: header; } .sidebar { grid-area: sidebar; } .main { grid-area: main; } .footer { grid-area: footer; } ``` * 結果預覽 <div style="display: grid; grid-template-areas: 'header header' 'sidebar main' 'footer footer'; grid-template-columns: 200px 1fr; grid-template-rows: 60px 1fr 50px; gap: 10px; background-color: #f1f1f1; padding: 10px;"> <div style="grid-area: header; background-color: DodgerBlue; text-align: center; padding: 20px; font-size: 20px;">Header</div> <div style="grid-area: sidebar; background-color: DodgerBlue; text-align: center; padding: 20px; font-size: 18px;">Sidebar</div> <div style="grid-area: main; background-color: DodgerBlue; text-align: center; padding: 20px; font-size: 18px;">Main Content</div> <div style="grid-area: footer; background-color: DodgerBlue; text-align: center; padding: 20px; font-size: 18px;">Footer</div> </div> * grid-template * grid-template-areas的縮寫。 * grid-template-rows和grid-template-columns同時控制。 * grid-template-rows - 設置內元素的高度。 * grid-template-columns - 設置內元素的寬度。 * 重複設定 `grid-template-columns: 1fr 1fr 1fr 1fr;`,可寫成 `grid-template-columns: repeat(4, 1fr);` * (grid-)row-gap - 水平間隔距離(row跟row的距離)。 * (grid-)column-gap - 垂直間隔距離(column跟column的距離)。 * (grid-)gap - row-gap 和 column-gap同時控制。 ## CSS Responsive * RWD(Responsive Web Design) 網頁可以透過桌機、平板電腦和手機查看,且同一個網站有各種不同的版面呈現,顯示的字級大小也不同,響應式網頁可以讓使用者易於瀏覽,同時也減少在行動裝置上閱讀時的縮放和移動等動作。 ### RWD Viewport * 根據裝置的顯示區域來展示文件 * 放大或縮小文件,來符合或設定中給予裝置的可視區域 * 允許設定或初始化縮放的級別,或是其他規則 * viewport是跟著裝置顯示在運作的,但跟Media Query 不太一樣 @viewport 有絕對優先權,所以它會比 @media 還要早執行 ![image](https://hackmd.io/_uploads/H1-xiy4s1x.png) * device-width 可以理解為我們所看見的裝置的寬度,而當該顯示文本遇到768px這個條件時,顯示結果會依據@media而決定 * @viewport 有兩種 1. initial viewport initial viewport 是指裝置本身的實際展示的尺寸或相關設定 2. actual viewport actual viewport 是指經由 initial viewport 初始化後,內容本文的展示尺寸或相關設定 > 參考資料: https://blog.hinablue.me/viewport-the-css-device-adaptation/ ### RWD Grid View 使用grid進行布局,可用在設計不同視窗大小下改變不同布局。 ### RWD Media Queries 利用@media讓不同視窗大小的布局改變 * @media (max-width:632px) 視窗不超過632px套用。 * @media screen and (min-width:632px) 設備為screen且視窗不超過632px套用。 * @media only screen and (min-width:632px) 同上,only可以篩去過舊的瀏覽器。 * @media only screen and (orientation: portrait) 縱向,寬度大於高度。 * @media only screen and (orientation: landscape) 橫向,寬度小於高度。 可用在grid排版,和改變style ``` @media (max-width: 600px) { div.example { display: none; } } @media only screen and (max-width: 800px) { .grid-container { grid-template-columns: repeat(3, 1fr); /* 3列排版 */ } } @media only screen and (max-width: 500px) { .grid-container { grid-template-columns: 1fr; /* 1列排版 */ } ``` ---------------------------------------------------- ### Animation * `animation: mymove 5s infinite;` 也可以這樣寫: - animation-name: (@keyframes後面的名字); - animation-iteration-count:(放一個值//3就3次,infinite就無限多次) - animation-duration: 5s(s前面放多少就幾秒) ```css @keyframes mymove { 0% {background-color: red;} 25% {background-color: yellow;} 50% {background-color: blue;} 100% {background-color: green;} } ``` - 前面的幾%代表動畫的時間點 ### Transform * transform可以讓html元素(包含內容)被位移、旋轉、縮放和傾斜,分為2D和3D * transform 屬性可為none、一個或多個transform-function ```css div { transform: rotate(20deg); } ``` #### 2D <div style=" background: rgba(30, 144, 255, 0.35); border-radius: 20px; width: 100px; height: 100px; text-align: center; display: flex; align-items: center; justify-content: center; transition: transform 1s; animation: spin 5s infinite linear; ">Rotate</div> ##### Transform-origin 元素的原始位置(參考點) * elememt(x,y) * 位移、旋轉、縮放、傾斜的參考點 * x、y可為尺寸值 或 % (百分比) 或方位關鍵字;% 是以元素本身大小作為計算基準 * 預設值為元素中心點(50%,50%) * 元素左上角座標為原點(0,0) * 方位關鍵字(center,top,right,bottom,left),如忽略第二個值,則自動定為center ##### transform property * translate(x, y) 偏移 * x: 水平移動,可用`translateX()` * y: 垂直移動,可用`translateY()` * 程式碼 ```css div { transform: translate(50px, 20px); } ``` * 結果預覽 <div style="border: 1px solid;"> <div style="background-color: rgba(30, 144, 255, 0.35); text-align: center; height: 100px; transform: translate(50px, 20px);">translate</div> </div> * scale(x, y) 縮放 * x: 縮放寬度 * y: 縮放高度 * 程式碼 ```css div { transform: scale(1.5, 0.8); } ``` * 結果預覽 <div style="border: 1px solid;"> <div style="background-color: rgba(30, 144, 255, 0.35); text-align: center; height: 100px; transform: scale(1.5, 0.8);">scale</div> </div> * rotate(angle) 元素以參考點為中心進行旋轉 * 正值: 順時針旋轉 * 負值: 逆時針旋轉 * 程式碼 ```css div { transform: rotate(25deg); } ``` * 結果預覽 <div style="border: 1px solid;"> <div style="background-color: rgba(30, 144, 255, 0.35); text-align: center; height: 100px; transform: rotate(25deg);">rotate</div> </div> * skew(x-angle, y-angle) 傾斜,元素以參考點為中心進行拉伸變形 * 單位: deg * 只寫一個參數就只有X軸的傾斜 * 程式碼 ```css div { transform: skew(30deg, 10deg); transform-orgin: top left; } ``` * 結果預覽 <div style="border: 1px solid;"> <div style="background-color: rgba(30, 144, 255, 0.35); text-align: center; height: 100px; transform: skew(30deg, 10deg); transform-orgin: top left; ">skew</div> </div> * matrix(a, b, c, d, e, f) 元素以參考點為中心,依變形矩陣的6個參數值產生2D變形。 * a: scaleX() * b: skewY() * c: skewX() * d: scaleY() * e: translateX() * f: translateY() * 程式碼 ```css div { transform: matrix(1, 0, 0, 1, 50, 50); } ``` * 結果預覽 <div style="border: solid;"> <div style="background-color: rgba(30, 144, 255, 0.35); text-align: center; height: 100px; transform: matrix(1, 0, 0, 1, 50, 50);">matrix</div> </div> * 同一元素套用多個變形函數 函數間以半形空格間隔 ```css .box{ transform:translate(120px) rotate(80deg) scale(0.5); } ``` #### 3D :::info 1. 好用的工具-->可以直接找到result測試結果 https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function ::: * transform-orgin: 元素原始位置,表示為element(x, y, z) * transform-style: 定義是3D或是2Dtransform,屬性值分為flat(預設2D)和preserve-3d * perspective: 透視距離,即觀看位置到元素的距離,預設是0 * perspective-origin: 透視原點,perspective-origin:(x,y),x可為長度值、百分比及方向關鍵字: left、center、right,y可為長度值、百分比及方向關鍵字: top、center、bottom,預設值(x,y)都為50% * backface-visibility: 定義元素背面是否可見,屬性值為hidden和visible -------- <div class="rotate3D">3D rotate</div> <style> .rotate3D { background: red; color: #f1f1f1; width: 80px; height: 70px; font-weight: bold; border: solid #000000; text-align: center; display: flex; align-items: center; justify-content: center; /* 讓 3D 效果可見 */ perspective: 500px; transform-origin: center; /* 讓它持續旋轉 */ animation: rotateY 3s infinite linear; } @keyframes rotateY { from { transform: rotateY(0deg); } to { transform: rotateY(360deg); } } </style> ------ <div style=" background: blue; color: white; width: 100px; height: 100px; text-align: center; display: flex; align-items: center; justify-content: center; transition: transform 1s; animation: spin 2s infinite linear; @keyframes spin { from { transform: rotateY(0deg); } to { transform: rotateY(360deg); } } ">Rotating </div> -------- ##### transform property * translate3d(x, y, z) * x: 以參考點為中心,向X軸位移x距離 * y: 以參考點為中心,向Y軸位移y距離 * z: 以參考點為中心,向Z軸位移z距離 * 程式碼 ```css div { transform: translate3d(10px, 50px, 70px); } ``` * 結果預覽 <div style="border: 1px solid;"> <div style="background-color: rgba(30, 144, 255, 0.35); text-align: center; height: 100px; transform: translate3d(10px, 50px, 70px);">translate3d</div> </div> * scale3d(x, y, z) * x: 以X軸做縮放 * y: 以Y軸做縮放 * z: 以Z軸做縮放 * 程式碼 ```css div { transform: scale3d(0.8, 0.8, -0.5); } ``` * 結果預覽 <div style="border: 1px solid;"> <div style="background-color: rgba(30, 144, 255, 0.35); text-align: center; height: 100px; transform: scale3d(0.8, 0.8, -0.5);">scale3d</div> </div> * rotate3d(x, y, x, angle) * x: 以X軸旋轉,正值-->順時針旋轉,負值-->逆時針旋轉 * y: 以Y軸旋轉,正值-->順時針旋轉,負值-->逆時針旋轉 * z: 以Z軸旋轉,正值-->順時針旋轉,負值-->逆時針旋轉 * angle: 以參考點為中心做旋轉 * 程式碼 ```css div{ transform: rotate3d(1, 1, 1, 30deg); } ``` * 結果預覽 <div style="border: 1px solid"> <div style="background-color: rgba(30, 144, 255, 0.35); text-align: center; height: 100px; transform: rotate3d(1, 1, 1, 30deg);">rotate</div> </div> * matrix3d(a1, b1, c1, d1, a2, b2, c2, d2, a3, b3, c3, d3, a4, b4, c4, d4) * 4x4的矩陣,共16個值 $$ \begin{matrix} a1 & a2 & a3 & a4 \\ b1 & b2 & b3 & b4 \\ c1 & c2 & c3 & c4 \\ d1 & d2 & d3 & d4 \end{matrix} $$ * 上方矩陣參數,分別對應的函數,()內的值為預設值 $$ \begin{matrix} scaleX & scaleY & scaleZ & translateX \\ rotateX & rotateY & rotateZ & translateY \\ skewX & skewY & skewZ & translateZ \\ perspective(0) & perspective(0) & perspective(0) & perspective(1) \end{matrix} $$ * 程式碼 ```css div { transform: matrix3d( 0.7, 0.1, 0.7, 0, -0.6, 0.7, 0.2, 0, -0.5, -0.8, 0.7, 0, 10, 10, 0, 1 ) } ``` * 結果預覽 <div style="border: 1px solid;"> <div style="background-color: rgba(30, 144, 255, 0.35); text-align: center; height: 100px; transform: matrix3d(0.7, 0.1, 0.7, 0, -0.6, 0.7, 0.2, 0, -0.5, -0.8, 0.7, 0, 10, 10, 0, 1);">matrix3d</div> </div> * perspective(n) * 定義 3D 變換元素的透視視圖,讓遠離視點的物件縮小 * 程式碼 ```css div { transform: perspective(5cm); } ``` * 結果預覽 <div style="border: 1px solid; display: flex; justify-content: center;"> <div style="transform: perspective(5cm) rotateX(-15deg) rotateY(30deg); background-color: rgba(30, 144, 255, 0.35); text-align: center; width: 100%;">perspective</div> </div> ### Transition 在特定時間段內可以平順的改變設計,例如:滑鼠游標放到字上面可以自動放大字體 #### Transition property: - transition - transition-property: 指定要轉換的CSS屬性 - transition-duration: 轉換需要的時間,預設0,單位為s或ms - transition-delay: 延遲多久轉換,預設0,單位為s或ms - transition-timing-function: 轉換時的速度曲線,預設為ease ---------------------------------------------- ## Text Alignment 用於文字的水平對齊,作用對象是物件內的文字 ```css text-align: left; ``` text-align設定的值已關鍵字為主,可以設定的值有 - left(對齊左側) - right(對齊右側) - center(置中) - justify(左右對齊) - inherit(和父元素相同) - initial