# 衝刺班 - HTML、CSS、JavaScript ## HTML/CSS ### 什麼是 DOCTYPE?[若] :::spoiler answer * <!DOCTYPE> 聲明位於 HTML 文檔的第一行,<html> 標籤之前。 * <!DOCTYPE> 告訴了瀏覽器應使用哪種 文件格式定義 來解析這個文檔。 * 有了<!DOCTYPE>,瀏覽器就會以標準模式(standard mode)對文檔進行解析,否則會以兼容模式(quirks mode)來解析文檔。 * 在 HTML 5 出現之後,不再需要指定 文件格式定義(DTD)。 **補充:標準模式和兼容模式** 在 HTML5 之前,有許多不同的渲染模式,但是在 HTML5 的時代,就剩下標準模式和兼容模式。 :bookmark:標準模式 (standard mode):有寫<!DOCTYPE html>的情況下,瀏覽器就知道要用 HTML5 的 標準模式來處理這份文件。 :bookmark:兼容模式 (quirks mode):兼容模式的存在基本上是為了維持瀏覽器「向後相容」的能力,因為當初有些瀏覽器是在 HTML 與 CSS 的標準被定義出來之前,就已開發上市,因此渲染方式會與後來遵循「標準模式」的瀏覽器有些差異。 **補充:DTD 文件格式定義 ( Document Type Definition )** DTD有主要兩個任務: 1.它幫助我們編寫合乎格式的代碼 2.它讓瀏覽器正確地顯示代碼。 因為有不同的標記語言,所以會有不同的DTD。 (可參考下圖 過去宣告doctype的各種寫法) ![](https://i.imgur.com/v05X99W.png) ::: --- ### 設計一個 RWD 網頁,你會注意哪些關鍵的螢幕解析度?[宜] :::spoiler - 手機:360 x 640 - 平板:786 x 1024 - 電腦:1366 x 768(HDMI)、1920×1080(HDTV 1080i) ![](https://i.imgur.com/JaM6uNX.png) 1. 根據上面畫出來的圖來分別在 ***600/900/1200/1800*** 設置斷點,這樣就會符合世上大部份人的裝置。 2. 根據bootstrap中的響應點來設置 ***320/480/768/1024**,*若你的網站是要用 bootstrap來建置。 ::: --- ### display:inline 和 display:block 的差異?[月] :::spoiler **回答** - 每個 HTML 元素都有一個預設的 display 值,不同的元素屬性會有不同的預設值。 - 若該元素的 display 屬性被標示為 block 就被稱為「區塊元素」,若被標示為 inline 就稱為「行內元素」。 | display: | block | inline | inline-block | | -------- | -------- | -------- | -------- | | 預設寬度 | 100% | Fit | Fit | | 設定寬高 | O | X | O | | margin| O | X | O | | padding | O | ! | O | | Tags | h1~h6、p、ol、li | span、em、strong、img | X [ ! ] 可以使用 `padding-top` 以及 `padding-bottom`,但其不會推擠周圍的 inline elements,反而會覆蓋其他的 inline elements。 ![](https://i.imgur.com/yL6LoIH.png) ::: --- ### display:none 和 visibility:hidden 的差異?[東] :::spoiler answer 兩者都是使用 CSS 做 element 的隱藏 - 當使用 `display:none` 時 element 會被隱藏,並且連 element 原本所佔有的整個寬高都會消失 - 當使用 `visibility:hidden` 時 element 會被隱藏,但 element 所佔有的空間仍會存在,只是不可見 <img src="https://i.imgur.com/6wlMUB0.png" width="500px"> ::: --- ### box-sizing 的作用? :::spoiler * **用途是更改CSS box model(元素視為Box)中計算元素(element)寬度和高度標準的預設值。** * **元素範圍空間** * 四層矩形構成 * 由內而外:「content-box(藍色)、padding-box(綠色)、border-box(橙黃)、margin-box(橙色)」 * ![](https://i.imgur.com/L8ykmPt.png) * **目的是解決/模擬不支援CSS box model規範的瀏覽器行為。** * **box-sizing屬性有兩種主要的值:** **1.content-box(預設值):** * 寬度與高度為元素本身 * 寬度與高度不包含邊框(border)、內邊距(padding)、外邊距(margin) * 尺寸計算公式: * .box {width: 350px}; 而且 {border: 10px solid black;} **2.border-box:** * 包括內容(content),內邊距(padding)和邊框(border) * 但不包括外邊距(margin) * Quirks 模式時 Internet Explorer 所使用的盒模型 * 尺寸計算方式: * .box {width: 350px; border: 10px solid black;} ![](https://i.imgur.com/2Hsdujl.png) * **box-sizing屬性程式範例:** ``` /* Keyword values */ box-sizing: content-box; box-sizing: border-box; /* Global values */ box-sizing: inherit; box-sizing: initial; box-sizing: unset; ``` ## 參考依據: > https://developer.mozilla.org/zh-TW/docs/Web/CSS/box-sizing > https://ithelp.ithome.com.tw/articles/10252827 ::: --- ### 什麼是 margin collapsing? [Raiy] * 對於兩個區塊元素(使用 inline-block 的行內元素不算),若 margin 的「上下」有重疊到數值,那麼會取最大值,而不會加總,這種情況就是邊界重疊。 * 注意: 1. 設定為float、position:absolute 的元素不會產生邊界重疊 2. 只有 top、bottom 會有這狀況,left、right 不會 * 根據 MDN 提出,有**三種狀況**會發生邊界重疊 :::spoiler 第一種:同一層相鄰元素 → 兩個 p 段落最後只會相隔 10 px ``` <style> p:nth-child(1){ margin-bottom: 10px; } p:nth-child(2){ margin-top: 10px; } </style> <p>下邊界範圍會...</p> <p>...跟這個元素的上邊界範圍重疊。</p> ``` ![](https://i.imgur.com/vXTq3cH.png) ::: :::spoiler 第二種:父層與最上面(第一個)子元素、最下面(最後一個)子元素貼在一起,重疊的話也只取最大值 <font color="#dd0000">**注意:若父元素有設定border、padding、內容設定成inline、clear-fix之類的,就會影響collapsing,使其作用不了**</font> ``` <div> <p id="p1">一個 p </p> <p id="p2">一個 p </p> </div> div,p{ margin-top: 10px; margin-bottom: 10px; } ``` ![](https://i.imgur.com/qxFJ7ZK.png) ::: :::spoiler 第三種:空元素 當同一個元素上邊界範圍可以直接貼到下邊界範圍(大概是該元素不具高度的意思),上下的元素也會發生邊界重疊。這種情況會發生在一個元素完全沒有設定邊框 ( border ) 、 內距 ( padding )、高度 ( height ) 、最小高度 ( min-height ) 、最大高度 ( max-height ) 、內容設定為 inline 或是加上 clear-fix 的時候。 ``` <p>Some example text.</p> <div></div> // 這個元素沒有任何高度 <p>Some example text.</p> div { margin: 0; padding: 0; } p { margin: 10px 0; } ``` ![](https://i.imgur.com/LNAhw7G.png) ::: ### 使用語意標籤的好處是什麼?[若] :::spoiler Answer HTML5 新增了語意化標籤(Semantic Elements),像是 header標籤、main標籤、footer標籤 …等。不同於以往只能用 div標籤來劃分區塊,語意化標籤的出現,使得網頁中每個區塊的設計目的可以更清楚的表現。 **SEO 優化** 因為結構明確的關係,所以搜尋引擎在搜尋網站的同時,可以更精準。同時也因為架構明確,會被搜尋引擎判斷是個架構完整網頁,也會提升網站的排名。 **維護方便** 在找看標籤的同時,大概可以知道哪些部分是標題或是選單,網站管理員的維護工作會更簡單與容易。 ::: --- ### `<div>` 和 `<span>` 的差異? [宜] :::spoiler # `<div>`和`<span>`最主要的區別在於 - `<div>`是一個**塊級元素**,它包含的元素會自動換行。 - `<span>`是**行內元素**,在它的前後不會換行。 `<span>`沒有結構上的意義,只是單純的應用樣式,其他元素不適合時,就可以使用`<span>`元素。 `<span>`可以作為`<div>`的子元素,但`<div>`不能是`<span>`的子元素。 ::: --- ### 請分享一個瀏覽器相容性的問題解決案例?[月] :::spoiler Answer - 寫 CSS3 的時候常常會遇到還沒有被標準化的屬性,就會需要使用到瀏覽器私有屬性的前綴字。有很多外掛可以處理這件事情,使用 Sass 的時候他會自動處理,而 Webpack 可以安裝 PostCSS 、 autoprefixer 與 Normalization 的套件。 - 寫 TIMECELL 的時候,因為有使用到 JSX 和 ES6 的語法,有使用 Webpack 的 @babel/polyfill 套件做相容性的處理。 前綴字補充: >**`moz`** 代表firefox瀏覽器私有屬性 **`ms`** 代表IE瀏覽器私有屬性 **`webkit`** 代表chrome、safari私有屬性 **`o`** 代表opera私有屬性 ::: --- ### 如何優化網頁的載入速度?有哪些可能的做法和考量?[若] :::spoiler Answer 1. **資源優化** - 靜態圖片資源進行無損壓縮,減少傳輸的資料量。 3. **利用瀏覽器快取** - 在 HTTP Header 中設定暫存資源與使用期限,使用者可從自己的磁碟載入先前下載過的資源,,減少等待載入的時間。 4. **延遲載入** - 在頁面讀取的時候,將相對不重要的資源延後載入,藉以讓使用者能更快看到重要內容。 5. **程式拆分** * 按照路由切分在特定頁面只載入相關的腳本與樣式檔。 * 常用的第三方套件被放在某個公用的 js 檔案中,這樣瀏覽器就能夠進行快取,即使要看到新版的應用,也不一定要重新下載這個部分。 * CSS-in-JS 的方案讓樣式檔可以跟著元件一起載入。 [更多補充](https://linyencheng.github.io/2021/03/09/experience-sharing-web-page-loading-performance/) ::: --- ### 什麼是 HTML DOM?[巧] ::: spoiler 文件物件模型DOM (Document Object Model) ![](https://i.imgur.com/KLMtguH.png) 定義: * **網頁規則:** 讓各大瀏覽器可按照規則設計瀏覽器,DOM 就是規則的一個定義 * **結構化的物件組成:** HTML 文件內的各個標籤,包括文字、圖片等等都定義成物件,物件最終會形成一個樹狀結構 * **文件擁有屬性與函式的節點:** 節點也可以附加事件處理程序,一旦觸發事件就會執行處理程序。 **【DOM 節點組成:】** * **Document:** Document 就是指這份文件,也就是這份 HTML 檔的開端,所有的一切都會從 Document 開始往下進行。 * **Element:** 文件內的各個標籤,因此像是各種 HTML Tag 都是被歸類在 Element 裡面。 ``` <div>、<p> ``` * **Text:** 被各個標籤包起來的文字,Hello World 被 Element 包起來,因此 Hello World 就是此 Element 的 Text ``` <h1>Hello World</h1> ``` * **Attribute:** 各個標籤內的相關屬性 **【DOM 遍歷:】** 1. **父子關係(Parent and Child):** 簡單來說就是上下層節點,上層為 Parent Node ,下層為 Child Node 。 1. **兄弟關係(Siblings):** 同一層節點,彼此間只有 Previous 以及 Next 兩種 ::: --- ### 你會用什麼方式做 CSS Normalization? [Raiy] :::spoiler Answer (!) 這題請根據自身習慣做調整~ ANS :針對專案情況判斷 - 手刻、時程夠、樣式比較繽紛複雜的,我會選擇 Reset,因為彈性最大 - 有用到其他 CSS 框架的,那就照該框架官方建議的模式,像 Bootstrap 就導入 Normalize.css,而Material UI 提供 CssBaseline 以及 ScopedCsseline 的組件 、 Tailwind 提供 Preflight 都是為了解決瀏覽器相容性的問題 - 小專案或者時程較趕的就會考慮 Normalize.css - 也要視團隊需求而定 ::: --- <br > ## JavaScript ### 什麼是 Pure Function? [SOL] :::spoiler answer ### Pure function(純粹函式) ==意指相同的輸入,永遠會得到相同的輸出,而且沒有任何顯著的副作用。== * 給定相同的輸入(傳入值),一定會回傳相同輸出值結果(回傳值) * 不會產生副作用(Side Effects) * 不依賴任何外部的狀態 ```javascript= const sum = function(value1, value2) { return value1 + value2 } ``` ### impure function 它需要依賴外部的變數值 ```javascript= let count = 1 let increaseAge = function(value) { return count += value } ``` ### 追求「Pure」的理由: - 具可快取性(cachable),可建立快取方法加速運算。 - 具有移植性(portable),由於純函式具有一致性,因此函式可輕鬆移到別的程式中。 - 引用具有透明性(referntial transparency),引用資料從何而來一清二楚, - 函式本身即為文件(self-documenting),不必再另外撰寫一份說明文件,相對容易理解好維護。 - 具可測試性(testable) ::: --- ### 請說明 Unit Test 想解決的問題是什麼,可以分享你寫的 Unit Test 案例嗎? [SOL] :::spoiler answer ### 在開發的時候常常遇到一些問題: * 找 BUG 找不到在哪裡 * 每次修改都要從頭重新(手動)測試(若出先問題要再找問題在哪XD) * 改好新功能但舊功能就壞掉.. * 越晚發現 BUG,修Bug的時間成本越高,若能越早找到問題點,越能降低成本 * 要到真實環境(瀏覽器)才能測試程式無誤 * 平行開發時,要等待其他人開發完成才能測試(瓶頸...) ### Unit test是什麼?可以幫我們解決什麼? 以程式中最小的邏輯單元為對象(通常是 Function or Class),撰寫測試程式,來驗證邏輯正確與否,以達到保護系統邏輯不會在持續開發或維護的過程中被破壞,並確保 Code 的品質,這就是 UT 的定位。單元測試是程式開發的一種方法論,所以觀念上適用所有的程式語言。 - 避免修改程式碼後的錯誤:修改程式的過程中可能會發生蝴蝶效應,A 處修改的原始碼卻使看似毫無關聯的 B 處錯誤。 - 不需要每次修改都重新人工測試 - 等等解決以上那些問題 ==程式是照你寫的跑而不是照你想的跑,Unit Test 能確保並驗證程式寫的和你想的一樣== #### JavaScript 單元測試框架: ![](https://i.imgur.com/HvkiaaB.png) Integration test,E2E Testing [使用Jest寫單元測試](https://wcc723.github.io/development/2020/02/02/jest-intro/) ::: ---