---
###### tags: `web111a` `程式筆記` `RWD`
---
# RWD
* 時間:2022/5/5
* 老師:麥睿恩
## 環境建置
### Sublime
* 需先安裝 Package Control 才可以安裝套件
* ctrl + shift + P :arrow_right:輸入package control: install packages,特別留意每一次安裝都要執行這一步
* 推薦套件參考老師講義(以下節錄)
* ChineseLocalization: 選單中文介面,有日語、簡中、繁中三種語言。
* ConvertToUTF8:頁面內容編碼。
* Emmet: 可以用代碼方式快速建立頁面語法結構。
* jQuery: 針對 jQuery 程式碼提供較佳的高亮度函式顯示與程式片段。
* SublimeCodeIntel: 智慧型語法、函式自動完成的套件,支援多種語言。
* JsFormat: 格式化 Javascript/JSON 程式碼的套件。
* SublimeLinter: 檢查程式的基礎套件,主要用來檢查程式碼的語法問題。
* ColorPicker :調色盤,按 ctrl+shift+c 就可以叫出色盤自由選色囉!
* AutoFileName:輸入路徑或 url 時,自動抓取檔案路徑
* SideBarEnhancements: 加強側邊列(檔案與資料夾)功能的套件。
* BracketHighlighter: 把各種括號符號、標記特別高亮度顯示出來。
* Color Highlighter: 有顏色代碼的地方用顏色標示出來。
* CSS3:可以支援相關新屬性的加入,讓建立更有效率。
* Auto-Save:可以設定頁面自動儲存。
* HTML5:可以支援相關新屬性的加入,讓建立標籤更有效率。
* 額外再加裝套件
* Bootstrap 4x Auto complete
* Bootstrap 4x Snippets
* 確認安裝
* 工具:arrow_right:指令面板:arrow_right:package control: list packages
* 設定快捷鍵
* 設定:arrow_right:快速鍵設定
* 左方預設、右方自訂
* 找到 F12 改成 open_in_browser
* 自動備份
* 設定:arrow_right:package settings:arrow_right:auto-save>settings-user
* 先到 settings-default 複製指令再貼到 settings-user
* auto_save_on_modified 改成 true
* auto_save_delay_in_seconds 改 3
* 設定排版、增加多層
* 設定:arrow_right:快速鍵設定
* 將老師提供的設定檔貼上,特別留意要貼在 `[]` 中,指令中間記得 `,`
```json=
[
{ "keys": ["ctrl+shift+f"], "command": "reindent" , "args": {"single_line": false}},
{ "keys": ["ctrl+shift+g"], "command": "emmet_wrap_with_abbreviation" }
]
```
* 快速鍵衝突
* ColorPicker 以及 ConvertTo UTF8
* 設定:arrow_right:瀏覽資源包:arrow_right:找到convertTo UTF8:arrow_right:編輯 Default(Windows).sublime-keymap
* ctrl + shift + c 改成 ctrl + shift + alt + c 或是你自己習慣的快捷鍵
* 確認是否解決衝突問題
* 輸入 ctrl + shift + c 看看 color picker 是否有叫出來
### 測試
1. 新增檔案
1. 右下角確認語言為 html
1. 快捷鍵 ctrl + shift + P 輸入 syntax:HTML
1. emmet
1. `!` + `tab`
1. 第一次需先手動儲存,之後會自動備份(儲存)
## HTML 5
HTML 是一種標籤語言,逐行解釋如下
```htmlembedded=
<!DOCTYPE html> 頁面文件類型宣告,讓瀏覽器辨別該使用版本的HTML標籤定義來呈現,HTML5 就是用這一行,可以找比較舊的網站看看原始碼 HTML4 以前會長得不太一樣
<html lang="en"> 頁面文件語言
<head> 頁面文件頁頭區域,很重要,讓瀏覽器判讀網頁內容,內含標題、檢視、樣式、描述、互動變化等
<meta charset="UTF-8"> 網頁編碼
<meta http-equiv="X-UA-Compatible" content="IE=edge"> IE 支援設定
<meta name="viewport" content="width=device-width, initial-scale=1.0"> 響應式網頁一定要這一行
<title>Document</title> 網頁標題
</head>
<body>
<!-- 網頁內容顯示的地方 所有瀏覽者看到的內容都是放在這兒 -->
</body>
</html>
```
## 前端三要件
* HTMl 骨架、內容
* CSS 美化
* JS 網頁互動、判斷、運算等
* JQuery 是 JS 函式庫
Bootstrap 是上述組合,幫助快速完成版面建置與功能安排。其他框架如 Vue.js、react.js、Angular.js 等
## emmet 快捷鍵
* 包覆 tag
* 選取字串後 ctrl + shift + g 輸入 h1
:::info
VS Code 需要額外安裝 Emmet Keybindings 套件,快捷鍵也有所不同
![vs code emmet shortcut](https://i.imgur.com/9i0PBjO.png)
:::
範例演示如下(VS code 畫面)
![example](https://i.imgur.com/RoSvAqs.png)
## 假文假圖
* 假文產生器:lorem
* 假圖:
* 利用 [pexels 圖庫](https://www.pexels.com/zh-tw/),提供創用 CC 授權的文片
* fakeimg.pl
## 練習1
```css=
width 寬度
margin 間距
color 文字顏色
letter-spacing 字距
line-height 行高
text-align: justify 左右對齊
text-indent 首行縮排
```
### 兩欄式排版
其中一種寫法
```css=
img {
float: left;
}
p {
float: right;
}
```
## [bootstrap](https://getbootstrap.com/)
:::info
最新版本 `v5.1.3`,目前市占率 `v4.6`,本課以 `v4.6` 教學
:::
### 使用方式
* :heavy_check_mark:本課程使用:Download 選擇包含 CSS 及 JS 的,要放在你網頁的根目錄
* [CDN](https://getbootstrap.com/docs/4.6/getting-started/download/#jsdelivr)
* VS code 可以用 cdnjs 幫你抓
* 使用[文件範本](https://getbootstrap.com/docs/4.6/getting-started/introduction/#starter-template),其實也是 CDN 只是他幫你寫好在 HTML 裡
如果你是 Download 的話,需要自己在 HTML 引入,放在 `<head></head>` 裡
```htmlembedded=
<link rel="stylesheet" href="bootstrap-4.6.1-dist/css/bootstrap.min.css">
<script src="bootstrap-4.6.1-dist/js/bootstrap.min.js"></script>
```
#### 使用文件範本自訂程式碼片段
Sublime install package: mysnippets
工具:arrow_right:外掛程式開發:arrow_right:新增程式碼片段,結構如下:
```htmlembedded=
<snippet>
<content><![CDATA[
Hello, ${1:this} is a ${2:snippet}.
]]></content>
<!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
<!-- <tabTrigger>hello</tabTrigger> -->
<!-- Optional: Set a scope to limit where the snippet will trigger -->
<!-- <scope>source.python</scope> -->
</snippet>
```
將[ Bootstrap Starter template ](https://getbootstrap.com/docs/4.6/getting-started/introduction/#starter-template)放在`<content>` 的`[]`中,就是第3行
其中 `<tabTrigger>` 中代表快速鍵,以下代表打 `bs4` + `tab` 就會出現你貼上的程式碼片段
```htmlembedded=
<tabTrigger>bs4</tabTrigger>
```
:::info
記得存檔、記得存檔、記得存檔
存在預設路徑`...\Packages\User`
建議在此建立一個與外掛同名的資料夾(例:Mysnippets),儲存的檔案名稱要與`<tabTrigger>`內的自訂名稱相同喔!!
:::
## CSS 排版
* float
* display
* position
* flexbox
* grid
### bootstrap 排版
* bootstrap 貼心的幫你整合了 flexbox 和 grid
* 預設為 12 grid
![960 grid](https://i.imgur.com/NNib2o8.png)
圖源:[960 Grid Demo](https://960.gs/demo.html)
基本架構最外層 container 底層 row 底層 col(注意:要先有row才能有col)
```htmlembedded=
<div class="container">
<div class="row">
<div class="col">One of three columns</div>
<div class="col">One of three columns</div>
<div class="col">One of three columns</div>
</div>
</div>
```
:::info
補充說明 `class`、`id` 是什麼?
> id 屬性是讓你為元素命名的,整個頁面中的元素名稱也不應有重複
>
> class 屬性則可將元素歸為某特定類別,通常也會有很多元素屬於同一種類別 (意即 class 屬性值相同。)
>
> * 如果你想指定某特定單一元素的樣式,則應使用 id。
> * 若有很多個元素皆有相同樣式,則可使用 class。
>
> —— from [CSS FAQ](https://developer.mozilla.org/zh-TW/docs/Learn/CSS/Howto/CSS_FAQ)
:::
根據設備解析度的不同斷點
| class name | width | 支援 |
| ---------- | ---------- | ----------- |
| col | all device | all version |
| col-sm | >= 576px | all version |
| col-md | >= 768px | all version |
| col-lg | >= 992px | all version |
| col-xl | >= 1200px | all version |
| col-xxl | >=1400px | v5 以後 |
白話的說以下設定原先佔據滿版(12 格)的寬度,但是當螢幕大於 992px 時,該區塊會佔據 8 格(12 格中的 8 格)
```htmlembedded=
...
<div class="col-12 col-lg-8">
</div>
...
```
### 測試 RWD
Windows:`F12` 或右鍵 :arrow_right: 檢查
![測試 RWD](https://i.imgur.com/M0WYV7S.png)
### 預設樣式 class
```css=
.display-4
.text-justify
.text-primary
等等
```
### 圖片重點整理
rounded:加上圓角效果
rounded-circle:加上橢圓形輪廓
img-fluid:響應式影像
img-thumbnail:縮圖而且是響應式影像效果
![rwd image](https://i.imgur.com/M564mDa.jpg)
---
* 時間:2022/5/19
## media query
[我懶得寫,放上之前筆記](/E00jU6IDQ0G4F0hm5B_CwA#Media-Queries)
## 切版練習:gogoro
![gogoro 2020](https://i.imgur.com/yAhV1i3.jpg)
大致架構如下:
```htmlembedded=
<div class="container-fluid">
<div class="row">
<div class="col">
<img src="" alt="" class="img-fluid">
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="col">
<h1>welcome</h1>
</div>
</div>
</div>
<div class="container-fluid">
<div class="row">
<div class="col bg-info jumbotron"></div>
</div>
</div>
```
> 可以透過 `jumbotron` 幫你把版面先撐起來,注意 Bootstrap 4 以前才有
:::spoiler bootstrap 5 jumbotron 替代寫法
```htmlembedded=
<div class="mt-4 p-5 bg-primary text-white rounded">
<h1>Jumbotron Example</h1>
<p>Lorem ipsum...</p>
</div>
```
:::
container 跟 container-fluid 的差別
> .container-fluid, which is width: 100% at all breakpoints
![container 跟 container-fluid 的差別](https://i.imgur.com/lSF62UD.png)
### bootstrap 預設間距怎麼清除?
用 `m-0`、`p-0`,但首先你要先搞懂是誰產生的內距、外距
```htmlembedded=
<div class="container-fluid">
<div class="row">
<div class="col p-0">
<img src="http://fakeimg.pl/2500x300" alt="banner image" class="img-fluid">
</div>
</div>
</div>
...
```
### 中間區塊排版
```htmlembedded=
<div class="container my-3 text-center">
<div class="row">
<div class="col">
...
</div>
</div>
</div>
```
> `my-3` y 軸 margin 3 個單位,不是 `px` 喔,關於單位請參考下圖
> ![rem](https://i.imgur.com/uotEHZC.png)
## 切版練習:profolio
![profolio](https://i.imgur.com/0zKep26.jpg)
大腸包小腸,row 裡面還有 row
```htmlembedded=
<div class="container">
<div class="row">
<div class="col">
...
</div>
<div class="col">
<div class="row">
<div class="col-3">...</div>
<div class="col-3">...</div>
<div class="col-3">...</div>
<div class="col-3">...</div>
</div>
<div class="row">
<div class="col-3">...</div>
<div class="col-3">...</div>
<div class="col-3">...</div>
<div class="col-3">...</div>
</div>
<div class="row">
<div class="col-3">...</div>
<div class="col-3">...</div>
<div class="col-3">...</div>
<div class="col-3">...</div>
</div>
<div class="row">
<div class="col-3">...</div>
<div class="col-3">...</div>
<div class="col-3">...</div>
<div class="col-3">...</div>
</div>
</div>
</div>
</div>
```
:::info
提問:為什麼不是 col 裡面再寫一組 container? 特殊排版才會這樣用,本例的版面單純,row>row 就可以符合要求
:::
### 加上 RWD
| desktop | tablet | phone |
| -------- | -------- | -------- |
| ![desktop](https://i.imgur.com/lW1d514.jpg) | ![tablet](https://i.imgur.com/1elxmK7.jpg) | ![phone](https://i.imgur.com/K84dCvv.png) |
注意 bootstrap 是 mobile first,結構如下
```htmlembedded=
<div class="container">
<div class="row m-2">
<div class="col-lg-4 col-md-12">
...
</div>
<div class="col-lg-8 col-md-12">
<div class="row m-lg-2">
<div class="col-lg-3 col-md-6 my-2">...</div>
<div class="col-lg-3 col-md-6 my-2">...</div>
<div class="col-lg-3 col-md-6 my-2">...</div>
<div class="col-lg-3 col-md-6 my-2">...</div>
</div>
<div class="row m-lg-2">
<div class="col-lg-3 col-md-6 my-2">...</div>
<div class="col-lg-3 col-md-6 my-2">...</div>
<div class="col-lg-3 col-md-6 my-2">...</div>
<div class="col-lg-3 col-md-6 my-2">...</div>
</div>
<div class="row m-lg-2">
<div class="col-lg-3 col-md-6 my-2">...</div>
<div class="col-lg-3 col-md-6 my-2">...</div>
<div class="col-lg-3 col-md-6 my-2">...</div>
<div class="col-lg-3 col-md-6 my-2">...</div>
</div>
<div class="row m-lg-2">
<div class="col-lg-3 col-md-6 my-2">...</div>
<div class="col-lg-3 col-md-6 my-2">...</div>
<div class="col-lg-3 col-md-6 my-2">...</div>
<div class="col-lg-3 col-md-6 my-2">...</div>
</div>
</div>
</div>
</div>
```
### 加上 lightbox 效果
* 引入相關檔案
* jquery.js
* lightbox.js
* lightboxshow.css
* 加入 a tag,連結與圖片相同
* 運用 html5 中的 `data-` 屬性,a tag 上加入 `data-lightbox=""`
* 同一組的 `data-lightbox` 要一樣,才能抓到上下頁
```htmlembedded=
...
<a href="./img1.png" data-lightbox="image">
<img src="/.img1.png"/>
</a>
...
```
* 加上 prev, next, close icon
* 將照片加到 /images 中,取名如下圖
* lightbox2 是用 `background-image`,沒辦法使用 fontawesome 取代,除非改寫他的 CSS
prev
![prev](https://i.imgur.com/Pzvskpz.png)
next
![next](https://i.imgur.com/E1Vjv9o.png)
### 最終呈現
[RWD 課堂練習 - portfolio](https://codepen.io/mitour/pen/wvydPmY)
## deploy
[Netify](https://www.netlify.com/)
## table responsive
table 的斷點是往下兼容
* `table-responsive` 全
* `table-responsive-sm` sm 以下
* `table-responsive-md` md 以下
* `table-responsive-xl` xl 以下
* `table-responsive-xxl` xxl 以下
## embad-responsive
Bootstrap 有針對 [embed 內容](https://getbootstrap.com/docs/5.2/helpers/ratio/#example)作響應式
:::info
此例為 Bootstrap 5 可能與 Bootstrap 4 寫法有所不同
:::
```htmlembedded=
<div class="ratio ratio-16x9">
<iframe src="https://www.youtube.com/embed/zpOULjyy-n8?rel=0" title="YouTube video" allowfullscreen></iframe>
</div>
```
### 自動播放?
在 iframe 網址後面加上 `?&autoplay=1` 如果被瀏覽器檔,可以試試多加 `&mute=1`
參考:[Youtube Support](https://support.google.com/youtube/answer/171780?hl=zh-Hant#zippy=)
### 補充:[假影片](https://vimeo.com/?vcid=33587&utm_medium=cpc&utm_source=google&gclid=CjwKCAjwy_aUBhACEiwA2IHHQIuRElE-YKsljrQcUJRPtg7eEhfjqJiWvpuSohukjOYhpx878turexoCDX4QAvD_BwE&gclsrc=aw.ds)
## `@keyframs` 關鍵影格
至少需要兩格(起點、終點)才會動,有兩種方式呈現
* from...to
* 0...100%
```css=
.animation {
animation: animate_width 3s;
width: 100%;
}
@keyframes animate_width {
from {
width: 0;
}
to {
width: 100%;
}
}
```
搭配 javascript 讓文字也跟著動態顯示
```javascript=
let i = 0;
let label = document.getElementById("label");
let loop;
function ct() {
if (i >= 100) {
clearTimeout(loop);
} else {
i++;
}
label.innerHTML = `${i}%`;
loop = setTimeout(ct, 20);
}
ct();
```
完整程式碼:[codepen](https://codepen.io/mitour/pen/eYVPGBv)
![progress bar animation](https://i.imgur.com/YPSnfxE.gif)
:::warning
這是簡約版的,其實文字跟實際進度不太相符
:::