---
# System prepended metadata

title: 第二周直播課程 學習筆記
tags: [六角學院, 學習筆記]

---

# 第二周直播課程 學習筆記
###### tags: `學習筆記` `六角學院`
這周是學如何使用flex排版，和margin及padding類似。但不同的是，需要強制設定數值的margin及padding在需要自適應的網頁上非常受侷限，而flex只要掌握網頁相關定位就能隨畫面大小移動；而過去在排版上需要寫很多的程式碼，在使用flex後，也濃縮至一兩行，因此在現在的網頁開發上，使用flex更具有優勢。

## 學 Flex 前要先知道的事


###  Flex要下在Container外容器
而在學習flex之前，首先需要了解的是，flex的屬性是針對容器內的內容影響的。因此假設A區塊容器中的文字段落需要水平垂直置中的話，flex的屬性應該要下在包容著文字段落的A容器，而非文字段落本身。

### Flex中的Flex中的Flex
HTML標籤的特性就是，身為container的標籤同時也能是內元件，所以flex屬性並不只限定於使用一次。

而從父層繼承而來的CSS屬性並不會作用於自身內部的子元件。舉繼承財產來說，爺爺死後的財產，若是爸爸還在的話，你是分不到一毛錢的。所以如果作為父層內的子元件想對自己內部的元件使用flex的話，就必須在自己身上加上flex的屬性。

### Flex的世界沒有X軸與Y軸存在
受flex影響的物件可以垂直，或是水平的改變位置，但這樣的改變卻和X、Y軸無關。在flex的概念中，垂直以及水平的線為「主軸 main axis」與「交錯軸 cross axis」，而物體即是在這兩條軸線上移動。

而之所以使用「主軸 main axis」與「交錯軸 cross axis」而非X軸與Y軸的概念，是因為在flex中，兩者是能夠透過`flex-direction`的屬性來改變方向，因此使用flex在調整物體位置時，並不能單純使用X軸與Y軸的概念來思考。

![](https://i.imgur.com/8So9bmY.jpg)
（圖片來源：[浅谈Flex布局的属性及使用](https://juejin.im/post/6844903614209605646)）

## 改變Flexbox中物體的位置
Flexbox就是帶有display:flex的外容器

而說到了「主軸 main axis」與「交錯軸 cross axis」的概念，而物體在flexbox中改變位置也是依靠這兩條軸線移動。

要熟悉這兩條線可以透過小遊戲的方式來了解：
[Flexbox Froggy](https://flexboxfroggy.com/#zh-tw)
[Flex Pirate](https://hexschool.github.io/flexbox-pirate/index.html#/)
或是透過[Flexbox Playground](https://codepen.io/peiqun/full/WYzzYX)來熟悉主軸以及交錯軸的概念


### 改變Flexbox中物體的位置 1: 用 flex-direction 改變主軸方向
在默認情況下，flex的主軸是水平的（row），但透過flex-direction可以將flex的主軸水平翻轉（row-reverse），也可以將其垂直（column）或是垂直後翻轉（column-reverse）。

#### flex-direction: row　（預設屬性）
主軸：水平
交錯軸：垂直
物品：沿著主軸由左至右排序
![](https://i.imgur.com/voAHiLm.png)

#### flex-direction: row-reverse
主軸：水平
交錯軸：垂直
物品：沿著主軸由右至左排序
![](https://i.imgur.com/8dCwkzI.png)

#### felx-direction: column
主軸：垂直
交錯軸：水平
物品：沿著主軸由上至下排序

很像div一般的排法，常用於RWD響應式網站
![](https://i.imgur.com/pLVhVsD.png)

#### flex-direction: column-reverse
主軸：垂直
交錯軸：水平
物品：沿著主軸由下至上排序
![](https://i.imgur.com/ZtcM5Ae.png)

### 改變Flexbox中物體的位置 2: 用 justify-content 物品在主軸上的位置
在了解flex-direction對於主軸方向的改變之後，接著就是處理物體在主軸上的位置分布，而justify-content就是針對物體在主軸上的位置分布的屬性。

以下圖例以flex-direction:row為主軸方向
主軸：水平
起始點：左
#### justify-content: flex-start （預設屬性）
![](https://i.imgur.com/BUKGZnZ.png)

#### justify-content: center
![](https://i.imgur.com/EQxHH2M.png)

#### justify-content: flex-end
![](https://i.imgur.com/3TJHGPd.png)

以上三種方式都是物體連在一起，在主軸上移動，若沒有使用margin刻意隔開的話，物體都會是連在一起的狀態。
接下來space-between, space-around, space-evenly都是將物體在flexbox內區隔開。

#### justify-content: space-between
物體會自動與flexbox的頭尾相連，且物體間會保持相等距離。
![](https://i.imgur.com/lv1l3yf.png)

#### justify-content: space-around
以物體為中心，向左右擴展相同的距離，不會和flexbox的頭尾邊界相連。
![](https://i.imgur.com/5XVKlzJ.png)

#### justify-content: space-evenly
以flexbox的寬度減掉物體的距離後，算出來的平均數值，所以間隔數值相同，不會和flexbox的頭尾邊界相連。
![](https://i.imgur.com/6vTltyY.png)


### 改變Flexbox中物體的位置 3: 用 flex-wrap 解決過多物品擠在主軸上的狀況

有時候一個flexbox中會需要10個甚至更多的物件，而flex的本性使然，flexbox中的物體會依照比例來改變自己的寬度以適應flexbox中的大小，而過多的物體會讓物體自身小於要求的寬度。

因此，為了避免出現主同一主軸上有過多的物件，我們可以使用flex-wrap，讓物體在超過範圍時能夠自行換行。

以下圖例以flex-direction:row為主軸方向
主軸：水平
起始點：左
紅色flexbox: width:300px
黑色box: width: 50px

#### flex-wrap:nowrap　（預設屬性）
![](https://i.imgur.com/aC7kRJJ.png)

#### flex-wrap: wrap
![](https://i.imgur.com/cHzZxWl.png)

#### flex-wrap: wrap-reverse
也可以將換行的方向上下顛倒
![](https://i.imgur.com/8ukDD1h.png)

#### 補充：父容器的 33.3%
老師在直播課程中提到，若有設定wrap自動換行的話，flexbox中的物件是在自身超過flexbox範圍後，會自動換行。
而在RWD自適應網站中，我們可以透過改變子元件的寬度，以百分比的方式計算來控制子元件在不同設備上的位置變換。

### 改變Flexbox中物體的位置 4: 用 align-items 來改變物體在「交錯軸」上的位置
我們利用主軸改變物體的位置以及排列方向之後，若想改變物體在交錯軸上的位置，就需要使用align-items來改變。

以下圖例以flex-direction:row為主軸方向
主軸：水平
起始點：左
justify-content: center
紅色flexbox: width: 350px; height: 280px;
黑色box: width: 50px

#### align-items: flex-start
![](https://i.imgur.com/zNLz1sP.jpg)


#### align-items: center
![](https://i.imgur.com/IhssYnF.jpg)


#### align-items: flex-end
![](https://i.imgur.com/FR5t393.jpg)


#### align-items: stretch
![](https://i.imgur.com/IsotKXZ.jpg)


#### align-items: baseline
看起來跟flex-start一樣，但其實是和文字的baseline對齊。
![](https://i.imgur.com/JQDYACQ.jpg)


### align-items 跟 align-content 傻傻分不清楚
在製作第二周任務的時候，不知道為什麼在調整交錯軸上物體的位置時，一直將align-items打成align-content，這兩者的功能有點類似，但總是常被人搞混。

在查詢資料之後才了解，兩者的功能確實都一樣是將物體垂直置中，只是不同的地方在於，align-items是適用於物體在單一主軸線上，也就是畫面呈現上只有一行的的狀況；而align-content則是適用於物體在多條主軸線上，也就是畫面呈現物體排列成兩行以上的狀況。

**也就是說，若父層中所包含的物件需要用到flex-wrap的話，才需要用到align-content！**

##### align-items 
![](https://i.imgur.com/JHdW0HP.jpg)
圖片來源：[《深入解析CSS Flexbox》-OOXX.STUDIO](https://www.oxxostudio.tw/articles/201501/css-flexbox.html)

##### align-content
![](https://i.imgur.com/ZH0hY10.jpg)
圖片來源：[《深入解析CSS Flexbox》-OOXX.STUDIO](https://www.oxxostudio.tw/articles/201501/css-flexbox.html)


## 完成第二周任務學到的額外技巧（一）： background-image

[img vs background-image](https://codepen.io/jiayusally97816/pen/LYZJZdV): 上方為img，下方為background-image

在設計網頁時常常會遇到滿版banner的情形，一開始都會覺得，將img的寬度弄成100%（採頁面寬度）即可，但是使用img有個問題是，img在縮放時的長寬比是固定的，這就有可能造成畫面的比例失衡，而且若是在編寫相同版型的多頁網站的話，在使用img時就必須先經過Photoshop等將多張圖片後製成相同大小或是長寬比的繁複程序。

為解決以上的問題，background-image就成了RWD網頁中滿版banner的常用技巧。

使用background-image的好處：
1. 不用事先將圖片素材都處理成同樣大小或是長寬比
2. 高度可以固定，保住網頁所有物件的位置比例
3. 可以製作[Parallax視差卷軸](https://codepen.io/jiayusally97816/pen/eYzLdZY)（請欣賞我做的ITZY網頁(●｀ 艸 ´)）

那麼，使用background-image的話，需要注意甚麼呢？
1. **要設寬高！**：background-image和img不一樣，它無法單獨成為一個元素，所以background-image和background-color一樣，必須依賴一個元素生存，而他們生效的條件就是—該元素具有存在感（有寬高）。
2. **知道原圖的大小**：若是用大圖的話還好，但若是使用小於你設想寬高的圖片的話，你就會看到重複出現的圖片！！！（background-image預設圖片repeat），若是你強制使用background-size將圖片放大，你就會看到超級！模糊！的圖片！
3. **知道你是用照片的哪個部分**：backgruond-image可以用固定的寬高顯示圖片，但是如果background-position沒有設定好的話，你就看不到你設想的效果。原因是background-image是用你設定的寬高在你給的圖片上框出一個範圍顯示，而background-position的預設值為center，試想一下，你找了一張圖，但圖片的重心是在右上方，但你忘了設定background-position，因此你看到的，只能是一個無法形容的畫面。


## 完成第二周任務學到的額外技巧（二）： 偽元素


## 參考學習資源：
* [圖解：CSS Flex 屬性一點也不難](https://wcc723.github.io/css/2017/07/21/css-flex/)
* [CSS Flexbox Layout 學習心得筆記](https://sweeteason.pixnet.net/blog/post/42781628#a1) 
* [浅谈Flex布局的属性及使用](https://juejin.im/post/6844903614209605646)
* [深入解析 CSS Flexbox](https://www.oxxostudio.tw/articles/201501/css-flexbox.html)
* [flex布局中align-items 和align-content的区别](https://blog.csdn.net/sinat_27088253/article/details/51532992)
* [align-items和align-content的区别](https://juejin.im/entry/6844903911690600456)




























