> 如果有記憶吐司就好了... # CSS 學習筆記 --- ## float與clear:both float可以設定的值: * left:靠左浮動 * right:靠右浮動 * none:預設值,也就是不浮動 * inherit:繼承自父層的屬性 clear可以設定的值: * left:消除左邊的浮動 * right:消除右邊的浮動 * both:消除左右兩邊的浮動 * none:預設值,不消除任何一邊的浮動 * inherit:繼承浮動,IE未支持此屬性值 ```htmlembedded= <div class="wrap"> <div class="col"></div> <div class="col"></div> <div class="col"></div> </div> ``` ```css= .wrap { width: 600px; background: #d07; margin: auto; } .col { border: 1px solid #000; width: 200px; height: 100px; background: #eee; } ``` 呈現如下: ![](https://i.imgur.com/CRDc6S7.jpg) 若要將三個灰色區塊變成橫向並排,通常會使用到float的屬性,需注意的是若父層(wrap)寬度為600px,那麼子層(col)的區塊的寬度需自行運算,margin+padding+border+col總寬度若超過wrap,則超出的區塊會自動斷行。 另一個須注意的地方就是,原本的父層(wrap)的寬度有設定,高度是由子層(col)撐開的,但由於float的特性是浮動,當子層(col)設定float之後,父層的高度就會跑掉,如下圖: ![](https://i.imgur.com/ATxcmlf.jpg) 此時的wrap因為沒有高度以及寬度跟子層的寬度一樣,所以會看不見,當我再將wrap設定高度50px以及寬度再加上10px之後,就可以看到超出來的wrap了,如下圖: ![](https://i.imgur.com/ZkfHXsS.jpg) 現在的狀態是,wrap寬610px高50px是存在的,子層的總寬度是600px高100px是蓋在wrap上方,所以能看到wrap的部分只能看到多出來的寬10px高50px的區塊。 若要避免因為子層下float導致跑版,可以新增一個區塊在子層的最後面,用clear:both去將前面col的浮動特性清除,進而撐開高度。 ```htmlembedded= <div class="wrap"> <div class="col"></div> <div class="col"></div> <div class="col"></div> <div class="clearFix"></div> </div> ``` ```css= .wrap { width: 600px; background: #d07; } .col { border: 1px solid #000; margin: 10px; width: 178px; height: 100px; background: #eee; float: left; } .clearFix { clear: both; } ``` 呈現如下: ![](https://i.imgur.com/MOR8pMq.jpg) --- ## inline與block及他們的孩子inline-block ### inline - 行內元素 特性: * 傳說中的日本人,很整齊的排排站 * 不能設定寬跟高 * 長度是靠內容撐開的 ### block - 區塊元素 特性: * 傳說中的佔位哥,自成一行 * 可以設定寬跟高 ### inline-block 特性: * 可以排排站 * 可以設定寬跟高 inline-block常用在導覽列,以下示範一個範例: ```htmlembedded= <nav class="menu"> <a href="#">新聞</a> <a href="#">新聞</a> <a href="#">新聞</a> <a href="#">新聞</a> <a href="#">新聞</a> <a href="#">新聞</a> </nav> ``` ```css= .menu { background: #fa0; text-align: center; } .menu a { display: inline-block; text-decoration: none; padding: 10px 30px; background: #aaa; } .menu a:hover{ background: #000; } ``` 呈現如下: ![](https://i.imgur.com/QVVSaVJ.jpg) 此時由於a與a之間有約4-5px(視字型而定)的空白該如何去除呢? 我們可以將menu的font-size設為0,再將文字大小設定在menu內的a標籤內即可解決這個問題。 ```css= .menu { background: #fa0; text-align: center; font-size: 0; } .menu a { display: inline-block; text-decoration: none; padding: 10px 30px; background: #aaa; font-size: 16px; } .menu a:hover{ background: #000; } ``` 呈現如下: ![](https://i.imgur.com/TvSa23y.jpg) --- ## box-sizing 以往在排版時,都須計算像是padding+margin+border+寬度,需算好才不會跑版,現在有了box-sizing就可以省掉計算的時間。 ### box-sizing: content-box 此為預設的狀態,寬度是以內容寬度為主,所以若外層設定寬為960px,要分成三欄,那總寬度(內容寬度+padding+margin+border)不能超過960px,否則會跑版。 ### box-sizing: border-box 寬度是以border的寬度為主,若若外層設定寬為960px,要分成三欄,但由於margin是在border外面,所以須注意內容寬度+margin寬度不超過960px即可。 --- ## 滿版式Banner設計 要設計滿版的Banner先決條件是需要一張很大的圖,寬度最好1920px以上喔。 關鍵語法: 1. height: calc(100vh - 67px) * 100vh=100% * calc是計算 * 扣掉67px是header的高度 3. background-size: cover * 調整背景圖像的大小以覆蓋整個容器,即使它必須拉伸圖像或從邊緣剪掉一點。 ```htmlembedded= <div class="header"> <div class="container"> <a href="#" class="logo"> 旅遊吧 </a> </div> </div> <div class="banner d-flex align-items-center justify-content-center"> <h1 class="text-white">開始實現你的夢想旅程</h1> </div> ``` ```css= a{ text-decoration: none; } .header{ background: #F0F0F0; padding: 20px 0; } .logo{ font-size: 24px; font-weight: bold; line-height: 24px; color: #28DAA5; } .banner{ height: calc(100vh - 67px); background-image: url(https://images.unsplash.com/photo-1573126617899-41f1dffb196c?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1170&q=80 ); background-size: cover; background-repeat: no-repeat; background-position: center; } ``` 呈現如下: ![](https://i.imgur.com/QBEw62Q.jpg) 若沒有計算好,網頁會有y軸,若將 height: calc(100vh - 67px)改為height: calc(100vh - 10px) 呈現如下: ![](https://i.imgur.com/ts5oTjR.gif) --- ## 排版神器flex ### flex 外容器屬性: #### display display 是我們熟知的 CSS 屬性,對於 Flexbox 來說,多了有兩種方式可以設定,預設為「flex」,其布局方式與 block 幾乎類似,都會強迫換行,但設定display:flex的子元素卻具備了更多彈性的設定,此外另外一種方式則是「inline-flex」,和 inline-block 也是幾乎雷同,意義上都是一個display:flex的元素外面包覆display:inline的屬性,在後方的元素不會換行。 #### flex-flow (flex-direction 與 flex-wrap 的縮寫) 簡單說就是合併了兩種屬性,用一個屬性就可以設定主軸的方向以及要不要換行。 * <‘flex-direction’> || <‘flex-wrap’> #### flex-direction 設定主軸的方向。 * row 主軸由左至右 次軸由上至下 * row-reverse 與row相反 * column 主軸由上至下 次軸由左至右 * column-reverse 與column相反 #### flex-wrap 這個屬性負責的是讓內容的元素換行,因為當我們把父元素的 display 設定為 flex 或 inline-flex 的時候,子元素就是以單行的方式,彈性撐滿父元素,所以就要利用 flex-wrap 來換行,共有三個設定值。 * nowrap 預設值,單行。 * wrap 元素自動換成多行。 * wrap-reverse 元素自動換成逆序的多行。 #### justify-content justify-content 決定了內容元素與整個 Flexbox 的「水平對齊」位置,回想一下最上面講的 Flexbox 盒子模型,具有 main start 與 main end 左右兩個端點,justify-content 就是按照這個方式做設定,而其中的設定值總共有下列五個。 * flex-start 靠主軸的起點 * center 置中 * flex-end 靠主軸的終點 * space-around 每行平均分配間距 * space-between 每行平均分配間距,左右元素將會與主軸的起點與終點貼齊 * space-evenly #### align-items align-items 剛好和 justify-content 相反,align-items 決定了內容元素與整個 Flexbox 的「垂直對齊」位置,再回想一下最上面講的 Flexbox 盒子模型,具有 cross start 與 cross end 左右兩個端點,align-items 與 align-self 就是按照這個方式做設定,設定值總共有下列五個。 * flex-start 靠次軸的起點 * flex-end 靠次軸的終點 * center 置中 * baseline 以所有內容元素的基線作為對齊標準 * stretch 預設值,內容元素全部撐開 #### align-content 遇到多行的元素,就要使用 align-content 這個屬性,這個屬性總共有六個設定值。 * flex-start 靠次軸的起點 * flex-end 靠次軸的終點 * center 置中 * space-between 將第一行與最後一行分別對齊最上方與最下方 * space-around 每行平均分配間距 * stretch 預設值,內容元素全部撐開 ### flex 內元件屬性: #### flex 由三個屬性組合而成,依照先後順序分別是「flex-grow」、「flex-shrink」和「flex-basis」,如果 flex 只填了一個數值 ( 無單位 ),那麼預設就是以 flex-grow 的方式呈現,三個屬性可以分開設定,也可以合在一起用一個 flex 統一設定,下面的例子展現出同一個 Flexbox,在不同的寬度,子元素會有不同大小的呈現。 * none * [ <‘flex-grow’> <‘flex-shrink’>? || <‘flex-basis’> ] #### flex-grow (伸展) 數字,無單位,當子元素的 flex-basis 長度「小」於它自己在父元素分配到的長度,按照數字做相對應的「伸展」比例分配,預設值為 0,不會進行彈性變化,不可為負值,設為 1 則會進行彈性變化。 * number 剩下的空間依照比例做伸展 #### flex-shrink (收縮比) 數字,無單位,當子元素的 flex-basis 長度「大」於它自己在父元素分配到的長度,按照數字做相對應的「壓縮」比例分配,預設值為 1,設為 0 的話不會進行彈性變化,不可為負值。 * number 預設為1 總比值-各子項目的寬度*收縮值,並加總所有子項目計算結果 超出值 扣除值 (子項目寬*收縮比/總比值)*超出值 = 扣除值 #### flex-basis 子元素的基本大小,作為父元素的大小比較基準,預設值為 0,也因為預設值為 0,所以沒有設定此屬性的時候,會以直接採用 flex-grow 屬性,flex-basis 也可以設為 auto,如果設為 auto,就表示子元素以自己的基本大小為單位。 * XXXpx 控制物件的主軸長度 #### order 可以直接指定一個數字,預設為0,設定為1就往右,設定為-1就往左,由小到大的排列順序。 * nember #### align-self align-self 的設定與 align-items 相同,但目的不同,align-self 的作用在於覆寫已經套用 align-items 的屬性,如果照我們以前所寫,因為 align-items 是針對子元素,所以必須要用 align-self 來進行覆寫。 * auto * flex-start * flex-end * center * baseline * stretch --- ## Position 定位 ### static 啟用方式 position:static; 「static 靜態定位」此定位是將其他定位特性取消,回到最原始的狀態,一般來說除非有特殊狀況,不然不會用到,多數的網頁物件預設也都屬於此種定位。 ### relative 啟用方式 position:relative; 「relative 相對定位」的效果是將設定的物件,將其參考空間參考自身原始的資料流位置,且此種定位值並不會將物件獨立一層,搭配其它 CSS 屬性,如 top 、 right 、 bottom 、 left 可做到「顯示位置的偏移」。 若使用偏移後蓋住了另一個品項,若希望品項不要被蓋住,此時可以用z-index去設定由誰覆蓋住誰。 ### absolute 啟用方式 position:absolute; 「absolute 絕對定位」的效果是將設定的物件,將其參考空間設定為「階層離自身最近且具備定位設定的父層空間」,倘若沒有任何一個父層空間俱備定位設定,最終該物件將採用視窗空間座位參考空間,而父層空間只要俱備了以下四種定位類型,就可被絕對定位物件做為參考空間,此外當物件設定了 absolute 之後,將會自己獨立一層,不會與其它物件有任何關連,所以可以利用 absolute 來做到物件堆疊的視覺效果。 * relative * absolute * fixed * sticky ### fixed 啟用方式 position:fixed; 「fixed 固定定位」的效果是將設定的物件,將其參考空間設定為「視窗」,也就是說當我對一個物件設定了 position: fixed; 之後,該物件的參考空間就直接對視窗的範圍了,需要特別注意的是 fixed 定位與 absolute ,一樣都會自己獨立一層,在實務應用上,常見的「蓋版廣告」或者是「光箱效果/light box」,又或者是 Bootstrap 中的「modal組件」,以及常見的網頁導覽列要固定在視窗上方的效果,再不然就是經常出現在視窗右下角的那一個「回到頁面頂端」的區塊,都是普遍會使用到 fixed 定位的 **fixed與absolute的差異** fixed 除了將參考空間設定為視窗與自己獨立一層外,也由於定位的空間是定在視窗內,所以不管你如何捲動你的視窗卷軸,這個物件就是怎樣都不會換位置,但 absolute 若定位在視窗的話則會被捲走,這也是兩者之間非常明顯的差異點。 ### sticky 啟用方式 position:sticky; 「sticky 黏貼定位」是所有定位中最年輕也最新的一個定位了,這個值非常的棒,它同時結合了 relative 與 fixed 兩大特性,這個定位的特色是 * 預設定位在父層空間 * 當視窗捲動到該物件位置時,會依據對該物件所設定的 top 值來讓該物件呈現 fixed 在視窗的效果 * 當物件呈現 fixed 效果時,其所能 fixed 的空間是該物件的父層空間 * 當視窗往下捲到超過 sticky 物件的父層空間時, sticky 物件則不會再呈現 fixed 的效果,而是會被捲離視窗範圍。 ## transition 動畫 啟用方式: transition: 屬性 轉換時間 延遲執行時間 速度; 若要設定兩個屬性或以上,可使用逗號隔開。 ```htmlembedded= <a href="#" class="btn">送出</a> ``` ```css= .btn { background-color: #000; color: #fff; display: inline-block; padding: 10px 20px; text-decoration: none; transition:all 0.5s; //屬性 轉換時間 } .btn:hover { background-color: #fa0; } ``` 呈現如下: ![](https://i.imgur.com/xQDBQXJ.gif) --- ## animation 動畫 啟用方式: animation: 動畫名稱 播放時間 延遲執行時間 速度 次數 方向 填充模式 播放狀態; ```htmlembedded= <div class="wrap"> <div class="box"></div> <div class="box1"></div> </div> ``` ```css= .wrap{ display: flex; padding: 30px 30px; } .box { background-color: #f00; width: 100px; height: 100px; border-radius: 50%; margin-right: 10px; } /* animation 下box1 */ .box1 { background-color: #f00; width: 100px; height: 100px; border-radius: 50%; animation: circle 2s infinite alternate; /* circle = 動畫名抽 * 2s = 播放2秒 * infinite = 無限播放次數 * alternate = 來回播放 */ } @keyframes circle { 0%{border-radius: 50%} 100%{border-radius: 0%} } ``` 呈現如下: ![](https://i.imgur.com/8jkngi6.gif) --- ## CSS reset小技巧 1. 防止圖片破版,可以在css reset處加上下面的程式碼 `max-width: 100%` 寬度最大為圖片本身的寬度,若比圖片寬度小則會自適應調整比例,而寬度若比圖片大則會定格在本身圖片最大的寬度 ```css= img { max-width: 100%; height: auto; } ``` 2.讓你可以不用去計算padding、margin、border `box-sizing: border-box` 將box尺寸的計算直接從border去算,假設設定寬100px,那麼包含border、padding總寬就是100px(margin不含喔) ```css= *,*::before,*::after{ box-sizing: border-box } ``` --- ## 如何指定區塊直接到最下方 會自動補滿距離父層的上方的margin ```css= margin-top: auto; ``` --- ## 輕鬆讓內層有自適應技巧 若外層已有一個寬度,內層可用%的方式輕鬆達到自適應 ```htmlembedded= <div class="outside"> <div class="inside"></div> </div> ``` ```css= .outside{ max-width: 1000px; } .inside{ width: 70%; } ``` --- ## RWD 媒體查詢 ```css= /* 手機版常見尺寸 */ @media(max-width:375px) { ... } @media(max-width:414px) { ... } --- /* 平板常見尺寸 */ @media(max-width:768px) { ... } --- /* pc版常見尺寸 */ @media(max-width:1140px) { ... } @media(max-width:1200px) { ... } ``` ## 藉由darken、lighten調出想要的顏色 ```css= /* 比括弧設定的顏色再深40% */ box{ background: darken(顏色,40%) } /* 比括弧設定的顏色再淡40% */ box{ background: lighten(顏色,40%) } ``` --- ## 圖片取代文字的技巧 ### 為什麼要使用圖片取代文字的方式來寫LOGO? 因為 google 機器人無法搜尋到圖片,只會認文字內容,所以為了讓搜尋引擎能夠找到網站重要內容,建議用圖片取代文字的方法。 * logo 背景圖位置寫在 a 連結,才能點擊的到。 * a 連結為行內元素,記得寫 display:block 變區塊元素logo圖才會正確顯示 * 重點css 屬性: ```css= text-indent:101%; /*首行縮排*/ overflow:hidden; /*自動隱藏超出的文字或圖片*/ white-space:nowrap; /*希望元素在第一排上面,沒有斷行*/ ``` 範例1: ```htmlembedded= <body> <h1 class="logo"> <a href="#">公司logo</a> </h1> </body> ``` ```css= .logo a{ display:block; background: url(../.png) no-repeat; width: 170px; height: 36px; text-indent: 101%; overflow: hidden; white-space: nowrap; } ``` 範例2: 使用float ```htmlembedded= <div class="wrap"> <div class="header clearfix"> <h1 class="logo"><a href="#">六角學院</a></h1> <ul class="nav clearfix"> <li><a href="#">Home</a></li> <li><a href="#">About</a></li> <li><a href="#">Shop</a></li> </ul> </div> </div> ``` ```css= .wrap{ width: 960px; margin: 0 auto; } .clearfix:after{ content:''; display:table; clear:both; } .header{ background: #a1bad0; padding:10px; } .logo a{ display:block; background: url(../.png) no-repeat; width: 170px; height: 36px; float:left; text-indent:101%; overflow:hidden; white-space:nowrap; } .nav{ float:right; } .nav li{ float:left; } .nav a{ display:block; padding:10px 15px 10px 10px; text-decoration:none; color:#fff; font-size:18px; font-weight:600; } ``` --- ## 位元素水平調整及垂直置中 垂直置中 父層flex+align-items:center 水平置中 justify-content: center 水平可用margin、padding調整