Web I by 101 === :::danger 請愛惜共筆,勿進行惡意刪減 ::: :::info 課程講義:https://slides.com/x10101/deck-3d136b/fullscreen ::: ## Web? - **W**orld **W**ide **W**eb - 全球資訊網 - 一個系統,以網際網路為連結核心,將所有的「網頁」與「網站」連結在一起 ### 如何看到網頁 - 長甚麼樣子 - HTML - 在哪裡 - URL - 如何拿 - HTTP ### URL **U**niform **R**esource **L**ocator - 統一資料定位符 - 通稱網址 - 標示網頁所在位址 - 格式 - 協定類型~protocol~://伺服器位址~IP\ addr~:埠號~port~/檔案路徑~path~/檔名?查詢~query~#片段ID~fragment~ - 範例: `https://nisra.net:433/tmp/test.php?q=1#1` ### HTTP - **H**yper**T**ext **T**ransfer **P**rotocol - 超文本傳輸協定 - 一種用來傳輸超媒體文件(像是HTML文件)的應用層協定 - 規範了客戶端請求與伺服器回應的標準 - 明文傳遞訊息 ### HTTPS - https = http + SSL / TLS - 通訊過程使用 SSL/TLS 進行加密 - 在 HTTP 之上定義相對安全的資料傳輸方法 ### 資料請求方式 | 方式 | 說明 | | ------ | ------------------ | | GET | 取得目標資源 | | POST | 提交指定資源的實體 | | HEAD | 取得標頭 | | PUT | 替換目標資源 | | DELETE | 刪除目標資源 | | CONNECT | 和指定資源標明的伺服器之間,建立隧道 | | OPPTIONS | 取得資源通訊方式 | | TRACE | 用於測試或診斷 | #### GET - 向伺服器請求資料 - 請求資料附在 URL 上 - 格式: 網址?參數名稱1=參數內容1&參數名稱2=參數內容2 #### POST - 詳細資料傳輸存放在網頁的**封包**當中 - 封包**攔截**仍然能查詢到相關資訊 - 相較GET已經無法直接用URL取得資料 #### HTTP狀態碼 | 狀態碼 | 說明 | | ------ | ---------- | | 1xx | 訊息提示 | | 2xx | 請求成功 | | 3xx | 重新導向 | | 4xx | 用戶端錯誤 | | 5xx | 伺服器錯誤 | - [HTTP Status Code](https://http.cat/) #### cookies - 記錄使用者狀態資料 - e.g., 用戶是否已登入 - 儲存在用戶端 - 用於解決 HTTP 協定的網路互動問題 > HTTP為無狀態協定 > 明文 -> 攔截+偽造 ### 前端 & 後端 ![](https://hackmd.io/_uploads/S1D68C962.png) #### 前端 - 介面 - HTML - 骨架 - CSS - 皮膚、衣服 - JS - 肌肉 #### 後端 - 後臺管理、資料庫 - PHP、Python ## HTML - HyperTextMarkup Language - 超文本標記語言 > **不是程式語言** - 描述並定義網頁內容 ### 元素 - 標籤 + 內容 ### 結構 ```xml= <!DOCTYPE html> <html> <head> <title>標籤</title> </head> <body> <p>阿巴巴巴</p> </body> </html> ``` ### \<head> 常用標籤 | 標籤 | 功能 | | ---------- |:--------------------------:| | `<title>` | 標題 | | `<meta>` | 描述屬性,e.g., 搜索關鍵字 | | `<script>` | JavaScript | | `<style>` | CSS | ### \<body> 常用標籤 ```xml= <h1>h1標題</h1> <h6>h6標題</h6> <img src = "圖片路徑" alt = "替代文字" width = "圖片寬度" height = "圖片高度"> <a href = "連結位址" target = "開啟方式" title = "提示文字">有超連結功能的文字或圖片</a> <!-- 我是註釋 --> <p> 一般文字 <br> <b>文字加粗</b> <br> <em>定義重點文字</em> <br> <i>斜體</i> <br> <strong>定義加重語氣</strong> <br> <small>定義小號文字</small> <br> 定義<sub>下標字</sub> <br> 定義<sup>上標字</sup> <br> <ins>定義插入字</ins> <br> <del>定義刪除字</del> </p> ``` - 清單 ```xml= <ol> <li>有序清單1</li> <li>有序清單2</li> <li>有序清單3</li> </ol> <ul> <li>無序清單1</li> <li>無序清單2</li> <li>無序清單3</li> </ul> ``` - 表格 ```xml= <table> <th>MON</th> <th>TUE</th> <th>WED</th> <th>THU</th> <th>FRI</th> <th>SAT</th> <th>SUN</th> <tr> <td>1</td> <td>2</td> <td>3</td> <td>4</td> <td>5</td> <td>6</td> <td>7</td> </tr> <tr> <td>8</td> <td>9</td> <td>10</td> <td>11</td> <td>12</td> <td>13</td> <td>14</td> </tr> </table> ``` - 表單 - 通常用來和後端互動 ```xml= <form action="送出目的地" method="資料傳送方式"> <!--表單內容--> <input type="表單功能" name="資料名稱" value="預設值" placeholder="提示訊息"> </form> ``` - 區塊 `<div></div>` - 行內元素:`<span></span>` ### Lab 0x0 製作名片網站 - 姓名 - 頭像 - 自我介紹 - 問你是誰的輸入框 - 寫Hi的按鈕 :::spoiler 範例 ```xml= <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>101</title> </head> <body> <h1>101</h1> <img src="https://i.pinimg.com/originals/99/bb/33/99bb33d0439bc0cf3808fb41b61fdc8a.png" height="150px"> <p>輔大資工大二</p> <h2>Interest</h2> <ul> <li>畫畫</li> <li>看漫畫</li> <li>看小說</li> <li>手作</li> </ul> <h2>Who are u?</h2> <input id = "Name" type = "text" placeholder = "Name"> <input type = "submit" value = "Hi!"> </body> </html> ``` ::: ## CSS - Cascading StyleSheets - 階層樣式表 - 風格頁面語言,讓你妳的 HTML 元素套上不同樣式 ### 引入方式 - inline style 內聯樣式 ``` xml= <h1 style="color: blue"></h1> ``` - internal style 內部樣式表 ``` xml = <head> <style> /* CSS內容 */ </style> </head> ``` - external style 外部樣式表 ```xml! <link rel="stylesheet" type="text/css" href="檔案位置"> ``` - 優先順序:inline > internal > external - e.g., 同樣都是設定 `<h1>` 的顏色,最後網頁顯示的會是 inline 設定的顏色 ### Selector 選擇器 #### id 選擇器 - 將標有特定 id 的 HTML 元素指定特定的樣式 - 寫法為 `#選擇器名稱`,在html中以"id"表示 - 可以隨便取,但避免數字開頭 ```css= #size{ font-size: 25px; } ``` #### class 選擇器 - 定義一組的元素樣式,可以在多個元素中使用 - 在 HTML 中以 "class" 表示,CSS 文檔中以 "." 小數點表示 ```css= .title{ color: red; } ``` ### 常用屬性 #### 背景 - 背景顏色 - `background-color: black;` - 背景圖片 - `background-image: url("圖片位址");` #### 文本 - 顏色 - `color: white;` - 字體 - `font-family : sans-serif;` - 字體大小 - `font-size: 20px;` - 對齊方式 - `text-align: right;` [更多CSS屬性可以看這邊](https://hackmd.io/@x10/Skv_K4Xks) #### 好玩的特效 ```css= #pic{ width: 150px; height: 150px; border-radius: 100px; position: absolute; /*絕對定位*/ left: 25%; animation-name: MovePic; /*動畫名稱*/ animation-duration: 3s; /*動畫時間*/ animation-delay: 0s; /*動畫延遲時間*/ animation-iteration-count: infinite; /*動畫重複次數,infinite 無限重複*/ } @keyframes MovePic{ /*@keyframe 自訂動畫名稱、屬性變化*/ from{ transform:rotate(0deg); /*transfom讓元素可以被平移、旋轉、縮放和傾斜*/ /*rotate() 旋轉*/ /*deg 旋轉角度*/ } to{ transform:rotate(360deg); } } ``` ### Lab 0x1 幫網頁穿衣服 - 可以更改背景、文字顏色等 :::spoiler 範例 html ```xml= <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <link rel="stylesheet" href = "main_0x1.css"> <title>101</title> </head> <body> <div class = "card"> <h1>101</h1> <div style = "height: 150px;"> <img id = "pic" src="https://i.pinimg.com/originals/99/bb/33/99bb33d0439bc0cf3808fb41b61fdc8a.png"> </div> <p>輔大資工大二</p> <h2>Interest</h2> <ul> <li>畫畫</li> <li>看漫畫</li> <li>看小說</li> <li>手作</li> </ul> <h2>Who are u?</h2> <input id = "Name" type = "text" placeholder = "Name"> <input type = "submit" value = "Hi!"> </div> </body> </html> ``` css ```css= .card { background-color: rgb(235, 225, 211); height: 500px; width: 300px; margin: auto; position: relative; text-align: center; } .card ul { margin: 0 25%; } .card li { text-align: left; } #pic{ width: 150px; height: 150px; border-radius: 100px; position: absolute; /*絕對定位*/ left: 25%; animation-name: MovePic; /*動畫名稱*/ animation-duration: 3s; /*動畫時間*/ animation-delay: 0s; /*動畫延遲時間*/ animation-iteration-count: infinite; /*動畫重複次數,infinite 無限重複*/ } @keyframes MovePic{ /*@keyframe 自訂動畫名稱、屬性變化*/ from{ transform:rotate(0deg); /*transfom讓元素可以被平移、旋轉、縮放和傾斜*/ /*rotate() 旋轉*/ /*deg 旋轉角度*/ } to{ transform:rotate(360deg); } } ``` ::: ## JavaScript - 直譯程式語言 - 可以直接嵌入HTML中 - 讓網頁與使用者互動 - 動態型別 ### 寫在哪 - 寫在HTML裡 ``` xml= <html> <head> <script> // 你的JScode </script> </head> <body> </body> </html> ``` - 外部檔案引入 ```javascript= <head> <script src="檔案位置"></script> </head> ``` ### 文法 - 輸出 ```javascript= alert("Hello JS!") console.log("hello js!") ``` - 宣告變數 ``` javascript= var num = 123 // 數字 var str ="888"// or '666', 字串 var arr = [123,"apple"] // 陣列 var bool = true // or false, 布林 ``` - 運算子 - 四則運算:+,-,*,/ - 取餘數:% - 次方:** - 比較:> , < , >= , <= , != - 嚴格比較: === , !=== - 邏輯:&& , || - 註解 ```javascript= // 單行註解 /* 多行註解 */ ``` - 函式 ```javascript= function add(x,y){ return x+y; } ``` #### on 事件 - onclick - 當滑鼠點擊時 - onerorr - 當出現error時(載入失敗) - onload - 當載入成功時 ### DOM - Document Object Model 文檔物件模型 - 一種讓文件以樹狀結構表示的模型 - 瀏覽器會將 HTML 解析為 DOM 樣式 ```javascript= document.getElementById("id-name"); document.getElementByClassName("class-name"); document.getElementByTagName("tag-name"); var test = document.getElementById("id-name"); // 用 test 去接物件 test.innerText = "I've been changed" // 最常使用,獲取或設置元素內的文字 test.innerHTML // 獲取或設置元素包含的 HTML 標籤 ``` ### Lab 0x2 讓名片打招呼 - 輸入名字 - 按下Hi的按鈕 - 跳出Hi!XXX :::spoiler 範例 html ```xml= <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href = "main_0x2.css"> <script src = "hello_0x2.js"></script> <title>101</title> </head> <body> <div class = "card"> <h1>101</h1> <div style = "height: 150px;"> <img id = "pic" src="https://i.pinimg.com/originals/99/bb/33/99bb33d0439bc0cf3808fb41b61fdc8a.png"> </div> <p>輔大資工大二</p> <h2>Interest</h2> <ul> <li>畫畫</li> <li>看漫畫</li> <li>看小說</li> <li>手作</li> </ul> <h2>Who are u?</h2> <input id = "Name" type = "text" placeholder = "Name"> <input type = "submit" value = "Hi!" onclick = "showHello()"> </div> <div id = "hello" style = "visibility: hidden;"> <p>Hello, <span id = "unknow"></span>.</p> </div> </body> </html> ``` css ```css= .card { background-color: rgb(235, 225, 211); height: 500px; width: 300px; margin: auto; position: relative; text-align: center; } .card ul { margin: 0 25%; } .card li { text-align: left; } #hello { width: 300px; height: 50px; position: relative; border-radius: 10px; margin: 10px auto 30px auto; background-color: rgb(70, 70, 70); color: white; font-family: "comic sans ms"; } #hello p { text-align: center; line-height: 50px; } #pic{ width: 150px; height: 150px; border-radius: 100px; position: absolute; /*絕對定位*/ left: 25%; animation-name: MovePic; /*動畫名稱*/ animation-duration: 3s; /*動畫時間*/ animation-delay: 0s; /*動畫延遲時間*/ animation-iteration-count: infinite; /*動畫重複次數,infinite 無限重複*/ } @keyframes MovePic{ /*@keyframe 自訂動畫名稱、屬性變化*/ from{ transform:rotate(0deg); /*transfom讓元素可以被平移、旋轉、縮放和傾斜*/ /*rotate() 旋轉*/ /*deg 旋轉角度*/ } to{ transform:rotate(360deg); } } ``` js ```javascript= function showHello () { var name = document.getElementById ("Name"); document.getElementById("hello").style.visibility = "visible"; document.getElementById("unknow").innerText = name.value; } ``` :::