# HTML CSS Notes ## Contents [TOC] ## Hot Key in codepen * Ctrl+D 可選取同一個字詞 (先用滑鼠選) * Ctrl+/ comment * Ctrl+L whole line select * Tab indent * Shift+Tab cancel indent * Shift + ↑↓ 可往下選取 * TOC為HackMD目錄 ### VScode * alt+選取整合 ↑↓可快速搬運到想要位置 * 多行改內容 選取後ctrl+D * alt + shift + f 快速整理縮排 * 尋找變數之定義 alt + f12 shift + f12,跳出的參考頁中,會把所有使用到的變數位置列出並可以直接移到該位置! ## HTML(Hyper Text Markup Language) ### 行內元素 inline * tag a, img, span 無法做外距(margin) 的上下設定 ### 區塊元素 block * tag 大部分都是 h1~h6, p, list, form, table, div, hr 等等 可做外距(margin)內距(padding)設定 #### Inline-block 又是區塊又是行內 * tag 代表 buttom, input, select 可以併排 ### head內元素 * head 區塊包含 meta, title, link * HTML 與 CSS 連接需加入 <link rel="stylesheet" href="test.css"> 位在head內的title下面 ### body內元素 * 可用 class 或是 id 設定 CSS #### 大區塊(語意化標籤) * header 網頁標頭,經常包含 logo、標題、導航列 * main 主要內容 * footer 網頁結尾,經常包含版權資訊、聯絡方式 * article 主要文章 * section 段落 * nav 導航列 * aside 跟主要內文沒有太直接關係的側欄 #### 內容元素 div & 清單 * div 用來分組用 * tag **ul** unorder list * tag **ol** order list * tag **li** list * dl:definition list,裡面有 dt:definition term、dd:definition description,可以做出縮排的效果 ![](https://i.imgur.com/oiA6Ik5.png =200x150) #### 圖片相關 * img 圖片 src 圖片網址 title 鼠標停留在圖片上的提示文字 alt 圖片連結失效的替代文字 * figcaption 圖片說明文字 #### 文字相關 * h1~h6 網頁標題 * p 為段落內文 假文產生字 Lorerm ipsum * tag **span** 當你想呈現一個段落內的文字有不同變化又不想換行,可使用span 操作 CSS 的 class 去作字體變化 * strong 粗體 em 斜體 * tag **a** target="_blank" 跳出新分頁 ="_self" 從這個網頁連結 * a href="#p3" 可以在文章內部快速導向至id="p3"的點 * tag **pre** 可保留原始格式的文字(空格與換行皆會顯示) * code 放程式碼 * time 日期與時間 * tag **hr** 水平線 * tag **br** 換行 * escape 跳脫符號 ```htmlmixed= & → &amp; < → &lt; <!-- lt 是縮寫 --> > → &gt; <!-- gt 是縮寫 --> ``` #### 崁入內容 * tag **iframe** 可崁入網頁 iframe src="網址" width="100%" height="500px" * embed 嵌入一個外部資源,可以是影片、圖片、程序 * video 一段影片檔 * audio 一段聲音檔 * source 可填入不同的 video or audio 類型,讓瀏覽器選擇支援度高的媒體播放。 * canvas 通過 JavaScript 實現繪圖功能,甚至是動畫、遊戲 * svg 繪製一個向量圖 #### table 表格 * 階層順序如下 tr(列), th(標題), td (內容) td 內容一列必須包在tr內 #### Form 表單 * form action = "送出表單後去哪" method="GET or POST" =>傳給後端 ,class="" 搭配CSS id="c-form" =>與button 連動 * form 常搭配 label & input 使用 ul li ![](https://i.imgur.com/IIiK6Lw.png) * form 下可以搭配 div table tr td 做應用 用div css內設定 display: table, table-row, table-cell 去做編排 ![](https://i.imgur.com/1PfmVHq.png) ##### 表單tag的一些屬性 1. value:預設內容,實體文字,通常用 placeholder 代替。 2. name:告訴後台這個 value 是什麼東西 3. placeholder:預設值,不是實體文字 4. checked 預設選項,適用於 radio & checkbox 5. selected 預設選項,適用於 option 6. require:必填 7. maxlength:最大長度,就字數限制啦 8. autocomplete:讓你不用記密碼 9. autofocus:一點進去就 focus 10. from:設定這個 input 所屬的 form,如果 input 不在 form 裡面的話會用到 11. list:把 datalist 引進 form 裡面 12. max/min:設定最大值或最小值 13. multiple:可以提交一堆 value 14. pattern:可以用 regular expression 檢查輸入的 value 15. step:間隔 ##### input * input type(文字輸入)= text(文字),password(密碼),submit(只能送出),search(搜尋),hidden(修改時隱藏),image,button,email(電子郵件) * input type(選擇框)=date(日期),color,checkbox(複選) ,radio(單選),file(上傳檔案),number(上下選擇數字),range(範圍) ###### input細節 * input type="text" name="user-name" id="user-name" => id 與label的for作連動 或予以css設定 * input type="radio || checkbox" name="要設定相同名字" value="male" id="gender" checked 預設案label就點選male選取 例如name="sex" value="male" 才可以知道使用者選擇sex 內的 male ```htmlmixed= <div> 興趣: <input type="checkbox" name="interest" id="sport"> <label for="sport">運動</label> <input type="checkbox" name="interest" id="reading"> <label for="reading">閱讀</label> </div> ``` ##### label * label for = "與input作連動" 顯示姓名,性別,etc * value = "放入後端值" =>例如:作為修改頁面 value ="male" 可使開發者知道使用者選擇哪個選項 * name應用 ex:作為search name="q" value="request.GET.q" 其後端query = request.GET.get('q') 可拿取使用者輸入資訊 或是在開發者F12內看到其name="male" 選擇了 value="female" 選項 ##### button * button 無動作按鈕,按下去不會發生任何事,但當你要使用 JavaScript 來操作時非常好用。 * button type="submit" form="c-form" => 與form 連動尋找其id 提交按鈕,按下會送出 form 裡所有的資訊 * type="reset" 作用是清除表單上的文字(重置表單內容), value="清除重填" ```htmlmixed= <form> <input type="button" value="按了沒用"> <input type="submit" value="按了會傳送表單"> <input type="reset" value="按了會重置表單"> <form> ``` ##### select * select name id 搭配 option 使用 下拉選單 * option 單個選項內容 可加上 selected 屬性,表示為預設選項。 * optgroup 分組選項內容,但本身並不可選label 標籤是強制的,會顯示在選項中 ```htmlmixed= <form> <select id="myAddress" name="myAddress"> <option>台北市</option> <option>新北市</option> <optgroup label="彰化縣"> <option selected>彰化市</option> <option>花壇鄉</option> <option>鹿港鎮</option> <option>員林鎮</option> </optgroup> </select> </form> ``` #### textarea * textarea 是用來填寫段落文字,cols="30" 這是指寬,rows="5" 是高,而寬跟高都可以用 css 來設定。 ### emmet 縮寫模組應用 * cheat sheet https://docs.emmet.io/cheat-sheet/ * .title => div class = title * **>** contain **{}** contain word * ul>li*5 *$* 照序列排 * img[src="" width=""] a[herf=""] Emmet 縮寫 ![Emmet縮寫](https://i.imgur.com/I3RlFsK.png) Emmet結果 ![Emmet結果](https://i.imgur.com/mlrrcUr.png) ### jade(pug) 樣板語言簡化HTML * 需選擇jade語言 * (放屬性) 空格後,寫內文 * **|** =>接續文字 jade樣板語言示範 ![Jade示範](https://i.imgur.com/1xAriRq.png) ### emmet & jade(pug) 結合使用 * 建議主要使用Jade + 輔助使用 emmet ![](https://i.imgur.com/9VX8nOe.png) * 如果階層下面包很多 (去裝) .box3有p.content&hr ### google地圖 * google地圖利用分享或崁入地圖 => copy code ## CSS * [寫樣式前CSS Reset](http://www.flycan.com/article/css/reset-css-562.html) ### 引入方式 1. Inline styling:就加一個 style attribute 進去 2. Internal:用 style 寫在 head 裡面 3. External ,先另外開一個檔案寫 CSS,再用 link 引入:<br><link rel="stylesheet" href="test.css"> 位在head內的title下面 ### CSS (Cascading style sheets)重要的概念 * CSS 就是 Selector + declarations * box-sizing: border-box;(將padding&border包含在內,邊框到邊框距離為width) 因此包含border,padding+content = width 一般預設為content-box, Selector 又分為: 1. Element Selector:Element {} 2. 最單純的 Selector,一次選所有的 Element 3. Class Selector:.Class {}一次選一群 Class,可能是最常用的 4. ID Selector:#ID {}一次只選一個,畢竟 ID 只能用一次,所以 HTML 盡量用 Class 5. Attribute Selector:Element [ Attribute = ( Value )] {}選有這個 Attribute 的 Element,有各種奇奇怪怪的語法,頗好用,自己查 6. Universal Selector:*{}選所有的 Element ,不是繼承,可以用來 **Reset CSS** ```css *{ padding:0; margin:0; box-sizing: border-box; } ``` 8. Selector特殊規則 ```css= .one .two{} 底下的元素 /*兩個 class 中有空格*/ 必須要是在 one 裡面的 two,才會被選擇到 .one > .two{} one底下的下一層元素 /* 以">"區分*/ 必須是one裡面的下一層class有two才會被選到 .one.two{} 同時符合 /*兩個 class中沒有空格*/ 某個區塊必須同時具有 one 和 two 的 class 時,才能被 CSS 所選擇到 .one, .two{} 都會被選到 /*兩個 class 中出現逗號*/ class 中有 one 或 two,都會被編輯器所選擇到 .bg + .bg{} 要相鄰且 class="bg"後面的class="bg"都會被選到(同一層) 除了第一個.bg外,後面的.bg都會被選到 .bg ~ .bg{} 第一個class="bg" 旁邊的bg都會被選到(同一層) 如果第一個div是bg不會被選到,其附近的bg都會被選到 ``` 8. nth-child 為某階層下第幾個元素(會先看 nth-child(3) 才看前面的選擇器 因此如果.dad .div:nth-child(1) 第一個為span也不會選 ```css /*第三個*/ .dad .bg:nth-child(3) { background-color: green; } /*偶數*/ .dad .bg:nth-child(even){ background-color: green; } /*奇數*/ .dad .bg:nth-child(odd){ background-color: green; } /* 1,4,7 */ .dad .bg:nth-child(3n+1) { background-color: green; } ``` 9. before & after (可搭配hover使用) before是在前面加,after在後面加,也可在tag內自設變數利用attr去取變數內的值放前或後 ```css= .dad .bg::before{ content: "$"; } .dad .bg::after{ content: attr(country); } ``` 10. !important 可以略過一切重要權重第一 * *CSS接近性* 優先採納樣式順序為 行內設定 > 內部CSS >外部CSS 內部CSS是style寫在html內 * *CSS精確性* ex1: div p {} 把div內的p都改 * *CSS覆蓋性* 後面的CSS會蓋住前面的 id > class ex2: div.class名稱(red) p 找div的class為red其內p改樣式 ex3: div p#black{} 找div內p有id為black改樣式 ex: **.env-img img{}** =>只針對env-img內的img做設定,其他不受影響 * <strong>物件所佔據空間(看不到的尺寸) = width(content width) +margin(外距) + padding(內距) + border(邊框),看的到的尺寸:width+border+padding</strong> ### 單位 1. px:最單純的單位 2. em:相對單位,每個子元素透過「倍數」乘以父元素的 px 值。 例如 parent 是 12 px,2 em 就是 2*12= 24 px 4. %:跟 em 一樣,例如 parent 是 12 px,50% 就是 12*0.5= 6 px 5. rem:每個元素透過「倍數」乘以根元素的 px 值。 也就是 html 的 font-size,預設是 16 px,16*1.2=19.2 ### sass (CSS簡寫語法) * 不用+; 以及 color: red 要空一格 * 可以有明確階層概念,也可使用變數 * $代表變數便於管理色彩、尺寸 **&** => 代表下一層 使用範例 ![sass](https://i.imgur.com/uol9Qfo.png) ### color * rgba(紅,綠,藍,透明) ex:rgba(255, 0, 0, 0.6) → 不透明度 60% 紅色 * 可以把 # 色票號內的 rgb 記起來 利用透明度去做效果 ### body * box-sizing: border-box(將padding & border包含在內) 因此包含border,padding+content = width 一般預設為content-box, * overflow:hidden 把多餘的不顯示 scroll 用滾輪去滑 ### 動畫 動態CSS * transition: all 3s easy-in; (放在物件內不放在hover) 第一個是要針對哪個部分 第二個是多久 第三個是漸變的動畫效果 * 要改變的狀態才寫在hover * transform: scale(倍數) 寫在hover 滑鼠hover時變幾倍大 : rotate(XXXdeg) 旋轉幾度 : translate(xxpx,xxpx) 位移動畫 左右 右+ , 上下 下+ ### display * display:inline-block 可設定top,bottom,etc. 也有width & height(block) 可以與其他tag排在一列(Inline) * display:inline 非block,無法自成一行 不能設定外邊距(margin)的上下,只能調左右margin&padding上下左右(但inline很少調整padding),**沒有 width&height** * display:block 自己成一區 其他東西下一行 ### border * box-sizing: border-box; (代表邊框到邊框距離為width) 因此包含border,padding+content = width 一般預設為content-box, * border(邊界): style width color solid 1px black; 外邊借用黑色實線包覆 * 畫三角形 利用border-top/right/bottom/left ```css #box1 { background: transparent; height:0px; width:0px; border-top: 170px solid transparent; border-bottom: 170px solid pink; border-left: 170px solid transparent; border-right: 170px solid transparent; } ``` * border-radius: 5px; 邊角圓潤化 (畫圓形) * box-shadow(陰影): x偏移量(右) | y偏移量(底) | 陰影模糊半徑 | 陰影擴散半徑 | 陰影顏色 */ box-shadow: 2px 2px 2px 1px rgba(0, 0, 0, 0.2); * border-top border-bottom 可在底下或上方做實線 ex:border-bottom: solid 10px #d1eecc; ### CSS選擇器 * ."class style 名稱" {可在裡面宣告此物件的表示型態} * #"id style 名稱" 只能使用一次,只是使用於html用id="" ### Position 定位 * 定位模式簡單分成 top,bottom,right,left * position:static (預設) 不能更改 * position:relative (相對位置) 意義為用原先的定位點作偏移 **通常用於作為absolute的定位點** <br> ex:.relative{position:relative;top:50px;left:30px;}它會從原本的位置(相對地)被定位,例如 top: 50 px 代表從原本的位置上方空出 50 px。 * position:absolute (絕對上層位置) **通常會有參考點,參考點的設置就是以設置 absolute 的位置往上找不是 static 的元素,做為參考點,通常以relative作為定位點**,如無上層定位點則以body作為定位點 可放置於relative & absolute & fixed中 使用absolute才可用 top left 使用 % 作定位 * position:fixed (怎麼滑都不會動) 適合放在導覽列 width:100%(平板手機皆可變動) * postion:stricky 也放在導覽列 跨越某特定值前為relative ,跨越後為固定定位(fixed) * 圖層順序:後面元素會蓋掉前面元素 **z-index:1;** => 表示永遠在圖層最上方(數字越大越前面) ### 虛擬(偽類)選擇器─超連結 * 偽類選擇器(超連結) a:link,visited,hover,active link(預設一般情形超連結顏色) visited(already visited) hover(mouse point) active(click) * .namecard:hover .circle 表示滑鼠點到namecard物件時其會改變circle物件什麼東西 {border-radius:0px;} 圓角潤化 變成正方形 * 滑鼠有指標 ```css= .dad :nth-child(3):hover{ cursor: pointer; } ``` ### layout排版 padding & margin float ![](https://i.imgur.com/RQEBkGc.png) * margin(外距) 這個區塊(div)與其他區塊(div)的距離 margin: top right bottom left /*四值语法 上 右 下 左*/ 举例: margin: 2px 1em 0 auto; /*三值语法 上 左右 下*/ /*兩值语法 上下 左右*/ * padding(內距) 這個區塊(div)與內部元件(element)的距離,正確來說是Border 與 Content 之間的距離 * margin & padding 一行輸入順序為 上 右 下 左 * text-align 圖片或是物件去做靠右靠左置中 #### float * float:left and right 可以將div區塊從垂直變成**水平排列** 可作文繞圖 * 當div container 包了 3個 col 其下方區塊footer被其影響,可在footer{clear:both}去取消其影響,使footer避開所有浮動物件 #### 水平置中 1. align: center:不過這招只能用在文字,如果要用在元素的話要用 margin 解決 2. margin: 0 auto:可能是最單純的方法(只能使區塊div置中) margin: 0 auto(需搭配width才可使用) => 0指上下 auto左右置中 3. Flexbox: justify-content: center (水平置中) 文字用 align,元素用 Margin 4. padding 也可達到水平置中 ```css padding: 30px 0px; /* 上下 30 左右 0 */ ``` #### 垂直水平置中 1. div test前一個div dad需要為relative為定位點,可使用top & left (寫在子層) 可使test 移到中心點 50% 50% ,但因為為左上角對齊,因此用translate(-50%,-50%) 對齊中心點,並將line-height=height ```css= .dad .test{ width: 100px; height:80px; position: absolute; /*父層一定要是relative*/ overflow: hidden; top:50%; left:50%; /*整個div移到中間*/ transform: translate(-50%,-50%); /*物件中心點對齊div中心點*/ border: solid 1px black; line-height: 80px; /*文字垂直置中*/ text-align: center; /*文字水平置中*/ } .dad{ width: 500px; height:150px; background-color: palegreen; position: relative; } ``` 2. flex (寫在父層) <a href="https://cythilya.github.io/2017/04/04/flexbox-basics/" target="_blank">如何用flex如何垂直水平置中</a> 利用 justify-content(水平置中)、align-items(垂直置中),display: flex,即可達到置中,但line-height=height ```css= .dad .test{ width: 100px; height:80px; border: solid 1px black; line-height: 80px; } .dad{ width: 500px; height:150px; background-color: palegreen; position: relative; padding:0; margin:0; box-sizing: border-box; } .dad{ display: flex; /* 預設flex-direction: row */ justify-content: center; /*水平置中*/ justify-content: flex-start; /*靠左*/ justify-content: flex-end; /*靠右*/ align-items: center; /*垂直置中*/ align-items: flex-start /*靠上*/ align-items: flex-end /*靠下*/ } ``` * 父層用flex 內層垂直置中用padding & display inline-block 去做 ### Font 字體 文字 * font-size 大小 * font-weight 字體粗細 * letter-spacing 字元間距 * line-height 行距 * word-break: break-all 的特點是,換行的時候,不會管字單字的完整性,所以會出現單字被切掉的情況。 break-word 根據單字來換行,這就如同平常我們文章的顯示方式。 * white-space: nowrap (不換行,一直同一行) white-space:pre (保留空白換行) white-space:pre-wrap (保留空白但換行) * text-overflow: ellipsis; 超過字以省略符號代替 ### float 浮動編排 * 其display 須為 : inline-block 可設定 float * float: right or left 可做排版呈現 * 如果其下面 div or footer 不想受其影響 ,可使用 clear:both 去動作 ### table 表格 * 階層順序如下 tr(列), th(標題), td (內容) td 內容一列必須包在tr內 * border-collapse:separate; //預設值,邊框彼此間分開 border-collapse:collapse; //邊框合併為單一邊框 border-collapse:inherit; //繼承自父層的 border-collapse 屬性值 * tr:nth-child(odd or even) {} 對奇偶數做特別設定 * 但div比table標籤有更好的SEO * 用div css內設定 display: table, table-row, table-cell 去做編排 ### background 等應用 * 跟img差別為讓使用者下載圖片麻煩且可以使文字覆蓋於圖片上 * background-color: #色票號碼 * background-img:url('路徑') * background-size: 寬 高 =>可以auto 絕對 或 百分比 cover(隨使用者縮放), contain(永遠維持整張圖); * background-repeat: no-repeat, repeat-x, repeat-y * background-position: bottom(Y軸上t中c下b) left(X軸左l中c右r) ## SEO一些概念與meta 1. meta name="description" content="..." 寫作文方式不能只寫關鍵字 * 查資料說摘要的內容並沒有直接影響到排名,但 description 還是相當重要,請盡量把重點放在越前面的地方越好,但也不要亂塞關鍵字,還是要讓語句保持通順。 * 好的 description 可以讓使用者更快速了解、此網頁內容是不是他需要的,找到「 更精準 」的 TA ,提高點擊率、降低跳出率,才是讓你的排名提高的關鍵。 * (如果網頁內容裡的關鍵字很多,不知道該怎麼下,其實也可以「 不要下 」,讓搜尋引擎去爬你的文章,如果有出現使用者的關鍵字,就會把那段標出來,出現在 description 上 ) 2. meta og 社群相關 tag og 全名為: Open Graph Protocol * 其實就是給社群媒體分享的 meta ,跟上面的內容很像,一樣是有 title, description,比較特別且重要的是 image 屬性,也可以直接設定分享圖的寬高等等。 * 如果想知道分享到社群的預覽樣貌,可以利用 Facebook debugger 進行偵錯,把網址貼上去,他就會說明 Facebook 抓取到的內容有哪些,呈現出來的分享結果會是怎樣。 ```htmlmixed= <head> <meta property="og:type" content="type" /> <meta property="og:title" content="site_title" /> <meta property="og:description" content="site_description" /> <meta property="og:image" content="site_image" /> <meta property="og:url" content="site_url" /> <meta property="og:site_name" content="site_name" /> </head> ``` 3. JSON - LD 全名為 JSON for Linking Data * 跟 meta 有點像,目的是用一個固定格式呈現網頁內容,讓機器更快速且精準的判讀內容。 在搜尋列表中出現更多的資訊,進而吸引使用者點擊 4. 註解加入關鍵字 img alt加上圖片說明 5. 圖片壓縮小一點網頁較好讀取 ## HTML5 新式標籤 ![](https://i.imgur.com/ofQDpil.png) ## 小技巧 1. 如果div內的 tag a標籤中間有空白,則在前面div設定font-size :0; 使其空白為0px,這樣可以消除空白 ###### tags: `HTML` `CSS`