--- tags: JS 直播班 - 2022 秋季班 --- ###### tags: `簡單` # 進階 DOM 操作 ## 本章節我們要學什麼? 延續基礎 DOM 章節,本次將會考驗同學們完成整套具備實際功能、邏輯更為複雜的產品。 :::success 本章節專注在功能的邏輯實作,僅會提供最基礎的樣式與架構。歡迎同學自行延伸功能、樣式與創造有趣的內容! ::: :::warning 本章節考驗同學對方法的靈活運用,以下是助教推薦的文章可一邊溫習一邊練習題目。 * [(上週章節) DOM 操作基礎](https://hackmd.io/BCGMk6yYSbWGQXwFZLqGvQ) * [(Ray) 關於 JavaScript 陣列 20 種操作的方法](https://israynotarray.com/javascript/20190421/1216566123/) * [(卡斯伯) JavaScript 陣列處理方法](https://www.casper.tw/javascript/2017/06/29/es6-native-array/) * [(MDN)Object.prototype.hasOwnProperty()](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty) * [(Javascript.info)Focus/blur 事件](https://zh.javascript.info/focus-blur) * [(MDN)表單數據檢驗](https://developer.mozilla.org/zh-CN/docs/Learn/Forms/Form_validation) ::: ## 題目一:無障礙彈跳視窗 <img loading="lazy" src="https://i.imgur.com/ifTpZUJ.gif"> ### 請達成以下功能: - [ ] **(打開) > 當點擊「彈跳視窗按鈕」,打開彈跳視窗** - [ ] 將焦點 (focus) 放在「OK 按鈕」上,方便鍵盤用戶選取視窗內的選項 - [ ] 避免使用者在打開視窗的狀況下頁面是可滑動的 - [ ] 點擊彈跳視窗以外的區域或點選 OK 來關閉 - [ ] **(關閉) > 當按下「ESC」或點擊「OK 按鈕」,關閉彈跳視窗** - [ ] 將焦點放在「打開彈跳視窗」按鈕上 ### 參考資源 :::spoiler HTML ``` html <div role="dialog" aria-labelledby="dialog_title"> <div> <h2>Dialog Example</h2> <p>Here is some demo text</p> <button>OK</button> </div> </div> <button>打開彈跳視窗</button> ``` ::: :::spoiler CSS ``` CSS *, *::before, *::after { box-sizing: border-box; } img { display: block; } body { background: teal; min-height: 100vh; display: flex; flex-direction: column; justify-content: center; align-items: center; } h1, h2, h3, h4, h5, h6 { margin: 0; } button:focus, button:hover { outline: 2px solid blue; outline-offset: 2px; } .dialog { position: fixed; top: 0; left: 0; display: none; justify-content: center; align-items: center; z-index: 100; width: 100%; height: 100%; } .dialog::after { content: ""; display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: black; opacity: 0.5; z-index: -1; } .dialog--active { display: flex; } .dialog__window { background-color: lightgray; padding: 1rem; } ``` ::: ## 題目二:書籍蒐尋器 <img loading="lazy" src="https://i.imgur.com/BmdPlQl.gif"> ### 請達成以下功能: - [ ] (加載網頁時) > 將預備好的資料注入在網頁上,呈現:「書名 - 介紹」的清單。 - [ ] (用戶輸入時) > 從預備好的資料中搜尋,並過濾所有清單。 ### 參考資料 :::spoiler HTML ``` HTML <form autocomplete="off"> <div> <input type="text" name="searchBook" placeholder="搜尋書籍" required> <ul> </ul> </div> </form> <ul> </ul> ``` ::: ## 題目三:回饋跑馬燈 <img loading="lazy" src="https://i.imgur.com/ZBTpcnW.gif"> ### 請達成以下功能: - [ ] (加載網頁時) > 將預備好的資料注入在網頁上,卡片內容有:圖片、標題、內文。 - [ ] (點擊上一步) > 卡片向前。 - [ ] (點擊下一步) > 卡片向後。 - [ ] (其他) > 當到資料頭、尾便不能再往前、往後 - [ ] (其他) > 請嘗試抽離寫死的邏輯,將「最大卡片數量」與「初始卡片位置」改為可輸入的變數。 ### 參考資料 :::info 圖片使用假圖即可,推薦 [Lorem Picsum](https://picsum.photos/) ::: :::spoiler HTML ```html <div> <div></div> <div> <button>prev</button> <button>next</button> </div> </div> ``` ::: ## 題目四:步驟表單 <img loading="lazy" src="https://i.imgur.com/AUtq91s.gif"> ### 請達成以下功能: - [ ] (加載網頁時) > 將預備好的資料打印在網頁上,呈現:「書名 - 介紹」的清單。 - [ ] (點擊上一步) > 回到上個步驟 - [ ] (點擊下一步) > 驗證後到下個步驟,如是最終步驟,打印提交事件至終端(會以 console.log 呈現在終端機)。 - [ ] (驗證) > 當點擊下一步時驗證當前步驟中的輸入內容是否都和規,如不合規,對焦於不和規的輸入上,並且更改其樣式屬性提醒用戶。 ### 參考資料 :::spoiler HTML ```htmlembedded <h1>步驟表單</h1> <form> <!-- 01 --> <div> <h2>步驟一</h2> <hr> <label> 電子信箱 <input type="email" placeholder="請輸入電子信箱" required> </label> <label> 密碼 <input type="password" placeholder="請輸入密碼" required> </label> <div> <button type="button">下一步</button> </div> </div> <!-- 02 --> <div> <h2>步驟二</h2> <hr> <label> 地址 <input type="text" placeholder="請輸入您的地址" required> </label> <label> 城市 <input type="text" placeholder="請輸入您的城市" required> </label> <div> <button type="button">上一步</button> <button type="button">下一步</button> </div> </div> <!-- 03 --> <div> <h2>步驟三</h2> <hr> <label> 名稱 <input type="text" placeholder="請輸入您的名稱" required> </label> <label> 電話 <input type="phone" placeholder="請輸入您的電話" required> </label> <div> <button type="button" data-prev>上一步</button> <button type="button" data-next>下一步</button> </div> </div> </form> ``` ::: ## 題目五:心理測驗 <img loading="lazy" src="https://i.imgur.com/Kl4rNo4.gif"> ### 請達成以下功能: - [ ] (開始測驗) > 進入測驗,隱藏介紹卡片,從資料中生成問題與選項 - [ ] (生成問題) > 顯示目前問題長度與目前位置 - [ ] (提交完最後一個問題) > 顯示詢問姓名問題 - [ ] (提交完姓名) > 打印出問題蒐集出來的資料 - [ ] (點擊選項或單選框) > 進入下個步驟並記錄此筆資料(種類、分數) ### 參考資料 :::spoiler HTML ```htmlembedded <!-- Intro --> <div> <h1>網頁性格測驗</h1> <p>製作網頁是一個多種領域發揮的舞台,助教製作了一款簡易的網頁性格測驗,來測試看看同學們對網頁不同領域的喜好程度~</p> <button>開始測驗~</button> </div> <!-- Test --> <div></div> <!-- Result --> <div></div> ``` ::: ## 回報流程 1. 將答案貼在 Codepen 並複製 Codepen 連結貼至「回報區」回報 (也可以將答案直接貼至「回報區」) ![](https://i.imgur.com/vftL5i0.png) ## 提醒區 :::warning 本次作業邏輯更為複雜,如有疑問歡迎到 [每日活動-進階 DOM 操作](https://discord.com/channels/801807326054055996/1038981110937440299) 中發問,助教會上去解惑~ 單一作業可以完成就上繳,分為五個 CodePen 來提交,不用塞在同個專案內。 ::: ## 作業提交等級 * LV1:解出 5 題,並提交 CodePen * LV2:設計一個 hackmd,嘗試自己設計 5 題 * LV3:嘗試去做其他學生寫的題目,並 tag 學員回報給他,感謝他的命題,讓自己觀念更好 回報區 --- | Discord | LV | CodePen / 答案 | |:-----------------------:|:---:|:--------------------------------------------------------------------------------:| | Rice#8043 | LV1 | [彈跳視窗](https://codepen.io/riecball/pen/rNKxyBx?editors=0111)/[書籍蒐尋](https://codepen.io/riecball/pen/qBKbrLY?editors=1100)/[回饋跑馬燈](https://codepen.io/riecball/pen/QWxyWEB)/[步驟表單](https://codepen.io/riecball/pen/gOKPVNJ?editors=1011)/[心理測驗](https://codepen.io/riecball/pen/YzvyjqN?editors=1011) | |AuroraC#6539|LV1|[彈跳視窗](https://codepen.io/AuroraC/pen/MWXjLQy)/[書本查詢](https://codepen.io/AuroraC/pen/KKegOGb)/[回饋跑馬燈](https://codepen.io/AuroraC/pen/dyKOJap)/ | |JackC#0411|LV1|[彈跳視窗](https://codepen.io/key0329/pen/YzvGdjZ)/[書籍蒐尋](https://codepen.io/key0329/pen/abKmMGQ)| |hannah#2224|LV1|[彈跳視窗](https://codepen.io/hangineer/pen/yLEarXQ?editors=1111)/| |無名#6427|LV1|[彈跳視窗](https://codepen.io/Nomoney/pen/zYaKJjY)/[書本查詢](https://codepen.io/Nomoney/pen/ExRgdMb)/[回饋跑馬燈](https://codepen.io/Nomoney/pen/jOKMRrx)/[步驟表單](https://codepen.io/Nomoney/pen/qBKaePd)/[心理測驗](https://codepen.io/Nomoney/pen/RwJoNyV)| |KuoMin#4931|LV1|[彈跳視窗](https://codepen.io/KuoMin/pen/vYrXQRB)/[書籍蒐尋](https://codepen.io/KuoMin/pen/dyKOVGW)/[回饋跑馬燈](https://codepen.io/KuoMin/pen/ExRWaeM) |圈圈#4060|LV1|[彈跳視窗](https://codepen.io/wjejfczn-the-bold/pen/dyKOYXQ)/[圖書查詢器](https://codepen.io/wjejfczn-the-bold/pen/zYaKMGp)/[回饋跑馬燈](https://codepen.io/wjejfczn-the-bold/pen/jOKVrwy)/[步驟表單](https://codepen.io/wjejfczn-the-bold/pen/yLEVpej)/[心理測驗](https://codepen.io/wjejfczn-the-bold/pen/yLEVwPM)| |薯餅#3581|LV1|[彈跳視窗](https://codepen.io/ColdingPoTaTo/pen/ExRNwvg)/[書籍搜尋](https://codepen.io/ColdingPoTaTo/pen/JjZbrZy)| |jimmyFang#9575|LV1|[彈跳視窗](https://codepen.io/pohxiqqo/pen/MWXbqvP?editors=0010)/[書籍搜尋](https://codepen.io/pohxiqqo/pen/BaVpdbw?editors=1011)/[回饋跑馬燈](https://codepen.io/pohxiqqo/pen/QWxpwaM)/[步驟表單](https://codepen.io/pohxiqqo/pen/VwdpLzP)/[心理測驗](https://codepen.io/pohxiqqo/pen/bGKqdJO)| |yawun#0042|LV1|[彈跳視窗](https://codepen.io/monicalin/pen/NWzREjR)/[書籍搜尋](https://codepen.io/monicalin/pen/GRGjwLq)/[回饋跑馬燈](https://codepen.io/monicalin/pen/RwJGvWQ)/[步驟表單](https://codepen.io/monicalin/pen/Vwdmwmg)/[心理測驗](https://codepen.io/monicalin/pen/NWzbqJW)| |albee#9121|LV1|[彈跳視窗](https://codepen.io/albee-chang/pen/XWYNGZV?editors=1011)/[書籍搜尋](https://codepen.io/albee-chang/pen/WNyomzx?editors=1011)/[回饋跑馬燈](https://codepen.io/albee-chang/pen/oNyBaXx?editors=0011)/[步驟表單](https://codepen.io/albee-chang/pen/bGKWVKP?editors=1011)/| |suihsilan#9485|LV1|[彈跳視窗](https://codepen.io/suihsilan/pen/YzvpvWx)/| |kevin#6131|LV1|[彈跳視窗](https://codepen.io/xlqjezvc-the-encoder/pen/LYrbdOX?editors=1011)/[書籍蒐尋](https://codepen.io/xlqjezvc-the-encoder/pen/MWXpJPJ?editors=1011)/ [回饋跑馬燈](https://codepen.io/xlqjezvc-the-encoder/pen/MWXpxyY?editors=1111)/[步驟表單](https://codepen.io/xlqjezvc-the-encoder/pen/rNKmweV?editors=1111)| |柔柔#1716|Lv1|[彈跳視窗](https://codepen.io/rouchen/pen/qBKqVML)/[書籍蒐尋](https://codepen.io/rouchen/pen/bGKBarY)/[回饋跑馬燈](https://codepen.io/rouchen/pen/NWzbYEb)/[步驟表單](https://codepen.io/rouchen/pen/OJEbYRE)/[心理測驗](https://codepen.io/rouchen/pen/XWYpMGw)| |charlottelee849#0366|LV1|[彈跳視窗](https://codepen.io/charlotte-lee/pen/BaVQxKW?editors=0010)/[書籍搜尋](https://codepen.io/charlotte-lee/pen/vYrxEbG?editors=0011)/[回饋跑馬燈](https://codepen.io/charlotte-lee/pen/LYrWVmb?editors=0010)/[步驟表單](https://codepen.io/charlotte-lee/pen/xxzqQzX?editors=0011) |xherobruce#6825|LV1|[書本查詢](https://codepen.io/winwinbruce/pen/rNKjqeE)| |Amberhh#2465|LV1|[彈跳視窗](https://codepen.io/Amberhh/pen/YzvGdOV)/[書籍搜尋](https://codepen.io/Amberhh/pen/YzvGBoR?editors=0011)/[回饋跑馬燈](https://codepen.io/Amberhh/pen/JjZbrrN)/[步驟表單](https://codepen.io/Amberhh/pen/zYaNNod)/[心理測驗](https://codepen.io/Amberhh/pen/dyKvyyZ) | |RJRS#9430|LV0|[彈跳視窗](https://codepen.io/RJRS/pen/oNyZvKG)/[書籍搜尋](https://codepen.io/RJRS/pen/WNyparM)| |Sentiments#4883|lv1| [彈跳視窗](https://codepen.io/Sentiments/pen/qBKrmVZ)/[書本查詢](https://codepen.io/Sentiments/pen/MWXpmvR)/[回饋跑馬燈](https://codepen.io/Sentiments/pen/PoapmmO)/[步驟表單](https://codepen.io/Sentiments/pen/ExRWmNY?editors=1111) /[心理測驗](https://codepen.io/Sentiments/pen/wvXJdwr)| | m_m#5493 | Lv1 | [彈跳視窗](https://codepen.io/minnn7716/pen/poKejpy)/[書籍搜尋](https://codepen.io/minnn7716/pen/XWYMyBR)/[回饋跑馬燈](https://codepen.io/minnn7716/pen/VwdpRyx)/[步驟表單](https://codepen.io/minnn7716/pen/NWBqwVj)/[心理測驗](https://codepen.io/minnn7716/pen/yLqYjyP) | |WEI_RIO#9342|Lv1|[彈跳視窗](https://codepen.io/wei_wu/pen/XWYjOaN?editors=1011)/[書籍蒐尋](https://codepen.io/wei_wu/pen/XWYNqWx)/[回饋跑馬燈](https://codepen.io/wei_wu/pen/NWzdRey)/[步驟表單](https://codepen.io/wei_wu/pen/NWzdpbj)/[心理測驗](https://codepen.io/wei_wu/pen/xxzqrqr)| |RyanTsai#8906|Lv1|[彈跳視窗](https://codepen.io/linlaose/pen/OJEpYEQ) / [書籍搜尋器](https://codepen.io/linlaose/pen/MWXmVmW) |mandylai#4055|LV1|[彈跳視窗](https://codepen.io/mandy-lai-2/pen/oNyzQZm)/[書籍蒐尋器](https://codepen.io/mandy-lai-2/pen/wvXzZdp)/[回饋跑馬燈](https://codepen.io/mandy-lai-2/pen/GRGNGVz)/[步驟表單](https://codepen.io/mandy-lai-2/pen/poKRwpN)/[心理測驗](https://codepen.io/mandy-lai-2/pen/bGKqReJ)| |FiReBrO#0557|LV1|[彈跳視窗](https://codepen.io/firebro42/details/xxzdXyG)/[書籍蒐尋器](https://codepen.io/firebro42/pen/NWzjJWL)| |Chloe#5422|LV1|[彈跳視窗](https://codepen.io/Ironchloe/pen/XWYRwMo)| |kenki100#0068|LV1|[彈跳視窗](https://codepen.io/ken100/pen/gOKLOVw)/[書籍蒐尋器](https://codepen.io/ken100/pen/QWxGmGN)/[回饋跑馬燈](https://codepen.io/ken100/pen/vYryOWj)/[步驟表單](https://codepen.io/ken100/pen/YzvpRrg)/[心理測驗](https://codepen.io/ken100/pen/NWzpNmo)| |yen#5757|LV1|[彈跳視窗](https://codepen.io/TZU-HUANG-YEN/pen/ZERyWgZ?editors=0010)/[書籍蒐尋器](https://codepen.io/TZU-HUANG-YEN/pen/XWYaewO)/[回饋跑馬燈](https://codepen.io/TZU-HUANG-YEN/pen/zYaWaGO?editors=0010)/[步驟表單]/[心理測驗]| |Paul#7426|LV1|[彈跳視窗](https://codepen.io/paul-1997/pen/NWzMZvZ?editors=1011)/[書籍搜尋器](https://codepen.io/paul-1997/pen/qBKYzeK?editors=1111)/[回饋跑馬燈](https://codepen.io/paul-1997/pen/oNydKeV?editors=1010)/[步驟表單](https://codepen.io/paul-1997/pen/poKKvxd?editors=1011)/[心理測驗](https://codepen.io/paul-1997/pen/JjZBYRK?editors=1011)| | LHchien33#6232 |LV1|[彈跳視窗](https://codepen.io/lin_chien/pen/ExREKVj)| |軟綿綿 (๑•ᴗ•๑) ♡#3627|LV1|[彈跳視窗](https://codepen.io/Connie-Chien/pen/QWxvYWM)/[書籍搜尋器](https://codepen.io/Connie-Chien/pen/ZERKZKK)/[回饋跑馬燈](https://codepen.io/Connie-Chien/pen/RwJEbWB)/[步驟表單](https://codepen.io/Connie-Chien/pen/GRGPBbj)/[心理測驗](https://codepen.io/Connie-Chien/pen/xxzMrQm)| |Kimi #9563 |LV1|[第六週刷題1-5](https://codepen.io/kimihu91/pen/wvXJOGR)| |蓁心 #6229 |LV1|[彈跳視窗](https://codepen.io/tlorfrnl-the-typescripter/pen/ExpyjQB?editors=1010)/[書籍蒐尋器](https://codepen.io/tlorfrnl-the-typescripter/pen/mdjEebM?editors=0011)/[回饋跑馬燈](https://codepen.io/tlorfrnl-the-typescripter/pen/gOjMWpP)|