# CSS 基礎
###### tags: `CSS`
## CSS的三種寫法:
1. 直接加<style = ''>
```htmlmixed=
<html>
<head>
<meta charset= "utf-8"/>
<title>I am title</title>
</head>
<body>
<div stytle="background: red;">
hello
</div>
</body>
</html>
```
> 背景變紅色,但不常用,因為難維護。
2. 在 `<head>` 裡面加上 style 標籤
```htmlmixed=
<html>
<head>
<meta charset= "utf-8"/>
<title>I am title</title>
<style>
div {
background: blue;
}
</style>
</head>
<body>
<div>
hello
</div>
</body>
</html>
```
> 背景變藍色
3. 最好的方法為新增到另外一個檔案去。
```
a. 新增 style.css 檔案
b. 貼上 div {background: green;}
c. 加一列 <link rel= "stylesheet" href="./style.css">
//因為存在同一個資料夾底下,可以用 ./
//用法很像 .a 一樣
```
```htmlmixed=
<html>
<head>
<meta charset= "utf-8"/>
<title>I am titled</title>
<link rel="stylesheet" herf="./style.css">
</head>
<body>
<div>
hello
</div>
</body>
</html>
```
> 背景變綠色
前面兩種用法較不常用,因為不好維護。
第三種用法最常用是因為兩個檔案獨立不干擾!
## CSS selector: Universal Selectors
在 style.css 資料夾內
```htmlmixed=
* {
color: blue;
}
```
用星號可以選到所有的東西!
## 標籤 selectors
在 style.css 檔案內
```htmlmixed=
div{
background: black;
}
body{
background: green;
}
```
## id 與 class Selector
這兩個最常用的。
1. #YYY
2. .XXX
在一個 `<div>`內,可以設多個 class
```htmlmixed=
<div class="bg-yellow text-white">
hello world!
</div>
```
```htmlmixed=
.bg-yellow{
background: yellow;
}
.text-white{
background: red;
}
```
*兩者之間差別: **id 只能有一個,但是 class 可以有很多個!**
## 同時符合條件
```htmlmixed=
div.bg-yellow{
}
又是 div 又是 bg-yellow
```
## 底下的元素
檔案: index.html
```htmlmixed=
<html>
<head>
<meta charset= "utf-8"/>
<title>I am title</title>
<link rel="stylesheet" herf="./style.css">
</head>
<body>
<div class="Lv1">Lv1
<div>Lv2
<div>L3</div>
</div>
</div>
</body>
</html>
```
* .Lv1
選到全部的 div
```htmlmixed=
<div class="Lv1">Lv1
<div>Lv2
<div>L3</div>
</div>
</div>
```
* .Lv1 > div
選到 Lv1 下一層的 div => 選到 Lv2
```htmlmixed=
<div>Lv2
<div>L3</div>
</div>
```
* .Lv1 > div > div
選到 Lv3
```htmlmixed=
<div>L3</div>
```
* .Lv1 div
==中間空格 = 選 Lv1 底下所有的 div==
```htmlmixed=
<body>
<div class="Lv1">Lv1
<div>Lv2
<div class="bg-red">L3</div>
</div>
<div class="bg-red">
hello
</div>
</div>
</body>
```
* .Lv1 .bg-red
<mark>注意中間有空格</mark>,和選下面所有的 .bg-red
選到的是 level one 底下所有的 class="bg-red"
```htmlmixed=
<div class="bg-red">L3</div>
<div class="bg-red">hello</div>
```
* .Lv1 > .bg-red
Lv1 底下那一層的 .bg-red
選到的是 hello
```htmlmixed=
<div class="bg-red">hello</div>
```
## 旁邊的元素:+ (旁邊) 與 ~(右邊所有的)
>如何定義為"旁邊"?
雖然程式碼看起來是由上到下,但是真正呈現的時候,
為由左到右~另外『+,~』需要在『同一層』才會有效果
大綱:
```htmlmixed=
<body>
<div class="bg-red">div1</div>
<div>div2</div>
<div class="bg-red">div3</div>
<div class="bg-red">div4</div>
<div>123</div>
<span>456</span>
<span>789</span>
</body>
```
例一
```htmlmixed=
.bg-red + .bg-red{
background: red;
}
```
選 class="bg-red" 旁邊的東西 => div4背景為紅色。
例二
```htmlmixed=
div + span {
background: blue;
}
```
選 div 旁邊的 span => 456背景為藍色
然後因為 `<span>789</span>` 不是在 `<div>`旁邊所以不會被選到
例三
```htmlmixed=
div ~ span {
background: blue;
}
```
選到 456 and 789
例四
```htmlmixed=
bg-red ~ .bg-red{
background: red;
}
```
選到 div3 and div4
例五
```htmlmixed=
bg-red + .bg-red{
background: red;
}
```
選 class="bg-red" 旁邊的東西 (.bg-red) => div4 背景為紅色。
> 影片 5:06 處,講解 ~ 時常遇到的狀況:
當要設定邊距時,每個元素中間是有距離的
```htmlmixed=
.bg-red ~ .bg-red {
background-color: red;
margin-left: 20px;
}
```
## Pseudo-classes:某個狀態底下的樣子
* hover
Pseudo-classe想成假的class
:hover 滑鼠移上後變成的模樣
```css
.mouse:hover{
background: red;
}
```
如何得知 debug hover有沒有設定好?
go to devtool
=> styles
=> force element state
=> 打勾 :hover 會維持著 hover 的狀態
- nth-child
```htmlmixed=
<body>
<div class="wrapper">
<div>row1</div>
<div>row2</div>
<div>row3</div>
<div>row4</div>
<div>row5</div>
</div>
</body>
```
* `.wrapper div {background: red;}`
全選背景變紅色
* `.wrapper div:first-child{}`
選到 row1
* `.wrapper div:last-child{}`
選到 row5
* `.wrapper div:nth-child(3){}`
選到 row3
* `.wrapper div:nth-child(even){}`
選到偶數; odd則是奇數
`nth-child()`用法需要注意:
他是先看排序為第幾個,才會再回頭看你所想要選的元素,例子如下
```htmlmixed=
<body>
<div class="wrapper">
<div class="bg-red">row1</div>
<div>row2</div>
<div class="bg-red">row3</div>
<div>row4</div>
<div>row5</div>
</div>
</body>
```
```htmlmixed=
wrapper div:nth-child(2) {
background: red;
}
```
沒選到東西,因為 nth-child(2) => 從第二個 div 回頭看,並沒有 bg-red 可選。
nth-child是從後面往前看,並且要選擇正確的標籤才會顯示
* .wrapper div:nth-child(3n){}
選到三的倍數
* .wrapper div:nth-child(2n+1){}
選到 row2 row4
(n從0開始, 這樣子的用法真的很特別!!)
## pseudo-elements 偽元素
與 pseudo-classes 差別是,它可選到一些那個元素裡面的某部分。
就是說我開F12後我可以選到標籤,但是我在html裡面是沒有的
等於說我做在css裡面了.
```htmlmixed=
<body>
<div class="price">
1000
</div>
</body>
```
<mark>注意</mark>: 他是要兩個冒號
```css
.price::before {
content: "$";
color: yellow;
}
```
通常用於標價格時!
```css
.price::after {
content: "$";
color: yellow;
}
```
變成 $ 標在後面
content 裡面可以放一個 attr()
* attr() 設定屬性新名稱,它會自己去抓這個屬性的內容,然後放到 content 內。
* 自己設定的屬性,在前面加 data,與原生的屬性做個區別。
```
<body>
<div class="price" data-id="moneybaby">
1000
</div>
</body>
```
```
.price::after{
content: attr(data-id)
}
```
顯示出 1000 moneybaby
> 影片 5:30 講解 attr() + ::after 特出用法的好處
其實沒有很難拉,就是content後可以放attr,attr裡面在放入自己設定的屬性.
PS : content 裡面一定要設東西,才會有元素出現!
## CSS Selector 的權重計算方式
```htmlmixed=
<body>
<div class="wrapper">
<div class="list">
<div id="pickme" class="item">
pick me
</div>
</div>
</div>
</body>
```
```css
.wrapper {
color: red;
}
```
會繼承原則
```css
.item {
color: blue;
}
```
變成藍色,把之前紅色蓋掉了
當兩個是一樣的東西,會以後面的為優先!
```css
.item {
color: blue;
}
.item {
color: green;
}
```
變成綠色
```css
#pickme {
color: pink;
}
```
變粉色
> 大原則:
id > class > 標籤
越詳細的贏!
> 影片 4:24 講怎麼計算?
| id | class/pseduo class/attribute | tag |
| -------- | -------- | -------- |
| 0 | 0 | 0 |
* 按照順序比下來
```
// id=0, class=3 , tag=3
div.wrapper > div.list > div.item {
color: yellow;
}
// id=1, class=0, tag=0
#pickme {
color: pink;
}
=> 所以粉色蓋過黃色
````
**但如果優先順序一樣的話,以後面的為準。**
But,人生就是有個 BUT,上面的說法都抵不過 inline- style => 權重變成 1, 0 , 0, 0
```
<body>
<div class="wrapper">
<div class="list">
<div id="pickme" class="item" style="color: orange;">
pick me
</div>
</div>
</div>
</body>
```
* 奧義: !important
=> 權重:1, 0, 1, 0, 0
```
div.wrapper > div.list > div.item {
color: yellow !important;
=> 顏色就是黃色,無人能敵!
```
> 小結:
!important > inline-style > id > class > tag
如果權重一樣,則程式碼在下面的優先。
## 基本裝飾 background
> 在之前做week7 HW2時,為了要把上面的背景和下面分開.
當時container下面就直接接內容.因此特別在用一個class包住form,最後透過絕對定位往上提. 這部分也一開始沒想到,一看到別人這麼做就知道了.
`background: red;`
`background: rgb(244, 4,10);`
`background: rgba(244,40,100,0.2) => a:是透明色,0~1,淺到深。`
`background: url("./bg.jpg")`
這邊要特別注意,在同一層資料夾裡面要加上'./'
`background: url(網址) no-repeat 圖片只會顯示一張,不重複。`
`background: url(網址) no-repeat X Y X可以寫成 center/ top/ buttom Y可寫成 center/ right/ left`
自己試過是不行拉
最好還是寫成 background-position:center,這樣比較保險.
```
#box1 {
height: 300px;
weight: 2000px;
background: url("/.bg.jpg") no-repeat center center;
//no repeat 照片不會重複,只會有一張
//圖片放置位置:center: X 與 Y 軸置中
// 若要 X Y 顯示上下 / 左右 : buttom/top right/left
background-size: 100px //圖片大小:px , 50%
}
```
`background-size用法:`
* 100px 100px 壓縮圖片
* 50% 50% 壓縮圖片
* content 不改變圖片比例,壓縮圖片到可以放入框框中。
* cover 將圖片填滿背景,隨著視窗大小縮放。
## 邊框 border and outline
**border 邊匡**
border 重點他是往元素裡面長,所以會改變原本的位置:+1:
border-style: dashed(虛線)/dotted(點點線)
```
#box1 {
border: 2px solid green;
// border: 粗度 類型 顏色
border-radius: 5px //弧度
}
```
border-radius: 50px or 50% 都是變圓形。
**outline 外匡線**
往元素外面長,加或不加,都不會影響原本元素的寬高。
>小結:
outline: 不影響元素,不會移動
border: 會影響元素,和移動位置
如何用 CSS 畫三角形?
1. 點 [codepen](https://codepen.io/norriswu/pen/BeZMMY) 看得更清楚!
2. [三角形產生器](http://apps.eky.hk/css-triangle-generator/zh-hant)
其實很多圖形都是用 border 畫的,實際開發不會用到 outline。
## 邊距 :margin 外距 與 padding 內距
padding 內距:
1. 距離是從內容裡面長出來的
2. 會影響寬高
margin 外距:
1. 距離是從內容往外面長的
2. 離其他的東西有多遠,不會影響寬高。
> 網頁上點“檢查”去看,移到 body 上面,有間距(瀏覽器預設)幫忙預留的空間。
解決方法?如下:
```
html, body{
margin: 0px;
//這樣會把瀏覽器預設的寬高設定不見
}
```
如果不想要整個盒子的寬度受 padding 和 border 影響,想要設定 width 和 height 時就是整個盒子包含 border 的大小,就多放這行程式碼box-sizing: border-box;。
## CSS 文字相關屬性
- color: 文字的顏色
- fornt-family: 字體
- font-size: 字體大小
- font-weight: 字體粗細
- normal
- bold
- 700/500/300
- line-height: 行高
- em (對應到字體的大小,X倍的行高)=> `之前沒有掌握到的觀念`
- letter-spacing: 字距
px(單位)
- text-align: 水平對齊
- left
- center
- right
### 如何讓文字垂直置中在盒子正中間?
1. 一行字的話,可以將 line-height 設成和原本的height 一樣
2. 多行字的話,用 padding 撐開,但是整個內容高度會變成多少要自己算.
- word-break:(斷行用法,又區分成兩種功能)
- break-all 會造成一個單字從中間截斷
- break-word 依照單字來截斷(這好像是vscode預設的)
- white-space
- nowrap : 字永遠在同一行(強制不換行)=>`這是第一次知道,也很想要用用看`
- pre: 保留完整樣式,前有空格也會留著
- pre-line: 保留換行(這也是vscode預設的)
---
## overflow 與 text-overflow
與超出寬度要怎麼處理有關
* overflow
- hidden 超出後,把東西藏起來
- scroll 滾動(就算沒超出區域,也可滾動)
- auto 超出的話,有滾軸可以用
* text-overflow: 只針對文字才能用
- ellipsis: ... 效果
> 想要有 abc...效果,必須先設定
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
## transition 漸變效果
可以看範例,點[這裡](https://codepen.io/norriswu/pen/WBERKW)!
>注意事項,初學者容易將 transition 放在 #box1:hover 裡面,這樣會造成滑鼠移入時有漸變效過,但移出時沒有!
:100:一開始我也不懂這是什麼概念,簡單來講漸變效果應該是要滑鼠移進去和移出來都要有相同效果,但是如果你放錯地方,只有移進去會有效果而已
## transform 變形轉換
### 讓網頁元素做出旋轉、縮放、移動等效果
* transform:
- scale(數字) 放大
- rotate(180deg) 旋轉
- translate(X,Y) 位移(10右,-10上) 按照原本位置做偏移
> 如何利用 transform 垂直又水平置中?
position:absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
:+1:
其實就是一開始設定為position:absolute;
是因為要和網頁的body做定位,所以會在網頁的中間
但是這個中間又是以左上角的那個點為中心,所以還要把自己在往左上角拉.
重點就是y軸剛好和一般認知是相反的

# CSS 基礎 Part3:盒模型(box model)
## box model 盒模型
在 HTML 內,每個元素可以看成是一個小盒子,然後你可以用 CSS 來調整他們。基本組合由內而外有:內容(寬高)+內距+邊匡+外距。
padding and border 是從內容往外面長得!
> 如何固定寬度?
box-sizing: border-box 好處是不用自己算寬高
box-sizing 種類:
- content-box 預設
- border-box 自己調整內容的寬高
這張圖很重要!

### Display的形式
1. block: (為預設值)
代表有: div、h1、 p
調什麼都可以
特性為佔滿一整行
---
2. inline
代表有:span、 a
調寬高沒用,調上下邊距也沒用,因為寬高會根據內容顯示。
調margin只會有左右的邊距會改變,上下不變(通常在一整段文字會被 span 括起來)
調padding,左右會變,上下不會影響元素的位置,但還是會撐開元素的高度(只有在有背景或是有border的情況下)
這個知識我本來就了解的,但是我不知道margin只會影響左右,而padding都會影響的這件事.
---
3. inline-block
等於 inline 和 block 的優點結合起來
代表有:button、 input、 select...
對外像 inline 可並排
對內像 block 可以調整各種屬性
[小陷阱:Inline-Block元素多出來的間隙](https://blog.darkthread.net/blog/inline-block-redundant-space/)
4. none 不顯示
## CSS 基礎 Part4:定位(position)
position:
基本:上下左右
<mark>下距增加會往上跑
左距增加會往右跑</mark>
> 這短短兩句話,讓我記得當年11月小弟我還在剛學css的時候搞了一個小時
還天真的以為自己會這些東西是不是能夠轉職了...
* static:
網頁預設定位方式。
按照瀏覽器的預設自動排列,無法調整偏移(不受上下左右值的影響)。
* relative 相對定位。
相對於原本參考點做定位,可以調整上下左右讓其偏移,但不會影響到其他元素所在的位置,只會改變自己的。
* absolute 絕對定位
針對某個參考點(往上找第一個不是stastic的元素)進行定位。如果前面無設定,會以 body 為主要參考點!
> 注意 5:25 分處 講遞補上來的概念!
因為絕對定位後,會脫離正常的排版流程走,有點像是被抽出去,所以下面一個元素會遞補上來被抽走的位置。
這個觀念,其實想想自己平常排版的時候有遇到,就是下面的東西會被叫上來..但是今天有人講我才知道..
* fixed: 固定定位
簡單版 - 相對於瀏覽器的窗口做定位
困難版 - 相對於viewport做定位
捲動時,視窗固定會出現在同個位置。
## z-index 決定圖層順序
決定哪個元素的順序。
**順序越大就在越前面~**
<style>
.box:nth-child(2) {
background: red;
top: 40px;
z-index: 10;
}
</style>
## position: sticky 較新的屬性
當他離 top: 20px 的時候,就會固定在那
像是導覽列會固定在上方,不會隨著文章移動,而看不見。
參考可看[這裡!](https://codepen.io/zuppachu/pen/ReNZdN)
<style>
.box:nth-child(2) {
background: red;
top: 40px;
position: sticky; //當盒子滾到離top 40px 的時候,就會黏住不動
z-index: 10;
}
</style>
---
## CSS技巧整理
### element整體往上移動
#### 方法1:
設定 top & left 來改變位置
```css
div{
position:relative
top:-40px;
}
```
#### *產生問題*:
會保留他原本應該存在的空間,導致下面留空
### 方法2:+1:
這個方法可以讓element裡面的元素也跟著移動,==需最外面的div才可使用==
```css
div{
margin-top:-40px;
}
```
## **置中方法**
### 文字類型
==width:100%==
```css
div{
width:100%;
text-align:center;
}
```
### 區塊類型
實務應用
1. css要下在要改變的那一個class(text1),不是下在height
2. margin-left的做法要下在section2,不是下在height
```html
<div class="section2">
<div class="height">
<input type="text" value="請輸入身高" class="text1">
</div>
<div class="weight">
<input type="text" value="請輸入體重" class="text2">
</div>
</div>
```
```css
text1{
left:50%;
transform:translateX(-50%);
}
```
```css
.section2{
margin-top:-220px;
}
```
### container置中方式
```css
div{
margin: 0 auto;
height:auto;
display:block;
}
```
### div 置中的方法,這一個需要在想一想 我先提供初步試驗的結果
```htmlmixed=
<div class="outter">
<div class="inner">
<div class="title">
化繁為簡
</div>
</div>
</div>
```
```css
.outter{
margin: 0 auto;
width: 1200px;
border: 1px solid;
}
.inner{
margin: 0 auto;
width: 800px;
border: 1px solid;
}
.title{
padding: 10px 0;
display: flex;
justify-content: center;
align-items: center;
}
```
注意要對置中的那個東西下css條件,並且千萬不要設定高度
### 圖型裡面的置中方法
1. text-align:center
2. line-height:xxx(設定和圓圈直徑一樣)
> codepen
> https://codepen.io/norriswu/pen/XGdKMj
### clearfix
這件事情其實很常見,簡單來說就是在子元素下面新增float屬性
例如我要做一個三欄式的版型,而造成父元素高度不見了
依據我學習的最好的方法,是在父元素加入cleafix屬性
屬性設定
```css
.clearfix:after {
content: '';
display: block;
clear: both;
}
```
舉例如下:
在父元素加上的原因是因為after,而after放在最後透過屬性,可以清除浮動
```htmlmixed=
<div class="container clearfix">
<div class="col-3"></div>
<div class="col-3"></div>
<div class="col-3"></div>
</div>
```

> [延伸閱讀](https://blog.chibc.net/learning/uibeginner-daily/890)
## SASS安裝
怕自己忘記, 所以直接把連結附在這邊, 不是很難拉, 忘記再回來看就好
還是稍微記錄下好了
- 直接新增scss檔
- vscode有安裝好live scss, 他會自動幫你compile.
- 底下是watch sass就可以了
[Link](https://www.youtube.com/watch?v=lGUNWBP2p8U)
反正忘記了看下就好了, 不是什麼特別重要的.