格選項卡組件實戰(zhàn)指南:基于 wired-elements 的 Tabs 使用與實現(xiàn)原理)
UI組件前端【免費下載鏈接】wired-elementsCollection of custom elements that appear hand drawn. Great for wireframes or a fun look.項目地址https://gitcode.com/gh_mirrors/wi/wired-elements點擊查看免費下載是 wired-elements 組件庫中一款帶手繪hand-drawn涂鴉風(fēng)格的選項卡TabsWeb Component常用于線框圖wireframe、原型草稿或追求趣味視覺的頁面中。本文以 docs/wired-tabs.md 為骨架結(jié)合倉庫源碼 src/wired-tabs.ts、 src/wired-tab.ts 等展開讀者將掌握其安裝方式、HTML/JavaScript 用法、屬性與自定義 CSS 變量以及標(biāo)簽頁切換、鍵盤導(dǎo)航等底層實現(xiàn)原理并能獨立在項目中落地使用。一、wired-tabs 是什么wired-elements 是一套看起來像手繪的基礎(chǔ) UI 組件集合倉庫描述為 Collection of custom elements that appear hand drawn適用于線框圖、原型或追求手繪趣味視覺的場景。wired-tabs是其中的選項卡容器組件與其配套的wired-tab頁面組件共同工作wired-tabs外層容器負(fù)責(zé)渲染一排手繪樣式的標(biāo)簽按鈕并控制當(dāng)前展示哪個面板wired-tab每個標(biāo)簽頁面板承載具體內(nèi)容其外層帶有手繪矩形邊框。組件基于Lit構(gòu)建、使用RoughJS生成涂鴉 SVG 路徑見 package.json 中的dependencies標(biāo)簽按鈕實際由wired-item渲染src/wired-tabs.ts 中引入并使用wired-item其實現(xiàn)見 src/wired-item.ts。完整組件清單可從 src/wired-elements.ts 的導(dǎo)出列表查看tabs 相關(guān)組件均在其中導(dǎo)出。二、安裝與引入1. npm 安裝將 wired-elements 添加到你的 JavaScript 項目npm i wired-elements2. 在模塊代碼中導(dǎo)入兩種方式等價推薦按需導(dǎo)入以減小打包體積// 從主入口導(dǎo)入 import { WiredTabs, WiredTab } from wired-elements; // 或按文件導(dǎo)入跳過未使用的組件 import { WiredTabs, WiredTab } from wired-elements/lib/wired-tabs.js;注意WiredTab與WiredTabs是兩個獨立的自定義元素定義wired-tabs.js文件同時導(dǎo)出了兩者見 src/wired-tabs.ts 與 src/wired-elements.tswired-tab內(nèi)部還會依賴wired-item.jssrc/wired-tab.ts引入時無需手動加載 item。3. 直接通過 CDN 加載不需要構(gòu)建工具時可直接在 HTML 中用 ES Module 方式加載script typemodule srchttps://unpkg.com/wired-elements/lib/wired-tabs.js?module/script倉庫自帶的示例 examples/tabs.html 演示了本地構(gòu)建產(chǎn)物的引入方式script typemodule src../lib/wired-tab.js/script script typemodule src../lib/wired-tabs.js/script三、基本用法一個完整示例把wired-tab作為wired-tabs的子元素每個 tab 通過name屬性作為唯一標(biāo)識內(nèi)容直接寫在標(biāo)簽內(nèi)即可wired-tabs selectedTwo wired-tab nameOne h4Card 1/h4 p Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. /p /wired-tab wired-tab nameTwo h4Card 2/h4 p Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. /p /wired-tab wired-tab nameThree h4Card 3/h4 p Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. /p /wired-tab /wired-tabsselectedTwo表示初始激活nameTwo的標(biāo)簽頁。示例文件 examples/tabs.html 中演示了selectedThree的寫法并把wired-tabs容器限制在max-width: 600px內(nèi)居中顯示。運行時動態(tài)切換selected是一個可綁定的 String 屬性src/wired-tabs.ts 中聲明為property({ type: String }) selected?。點擊標(biāo)簽按鈕時源碼通過this.selected p.name更新屬性src/wired-tabs.ts因此你也可以用 JavaScript 動態(tài)切換const tabs document.querySelector(wired-tabs); tabs.selected Three; // 切換到 nameThree 的標(biāo)簽頁四、屬性說明WiredTabs 屬性屬性類型說明selectedstring當(dāng)前選中標(biāo)簽頁的名稱即對應(yīng)wired-tab的name值行為細(xì)節(jié)依據(jù)源碼默認(rèn)選中第一個當(dāng)selected未設(shè)置時mapPages()會把第一個wired-tab的name賦給selectedsrc/wired-tabs.ts容錯回退如果selected對應(yīng)的 name 找不到getElement()會回退到第一個標(biāo)簽頁src/wired-tabs.ts支持空格分隔多名稱pageMap會把name按空格拆分成多個段分別注冊即一個 tab 可對應(yīng)多個可匹配名稱src/wired-tabs.ts。WiredTab 屬性屬性類型說明namestring該標(biāo)簽頁的唯一標(biāo)識用于選中匹配labelstring標(biāo)簽按鈕上顯示的文本默認(rèn)回退為name的值label的默認(rèn)行為在渲染邏輯中體現(xiàn)${p.label || p.name}src/wired-tabs.ts即未顯式設(shè)置label時按鈕文字等于name。wired-tabs wired-tab namesettings label設(shè)置…/wired-tab wired-tab nameabout label關(guān)于…/wired-tab /wired-tabs五、自定義 CSS 變量組件暴露兩個 CSS 自定義變量用于定制選中態(tài)樣式均由 src/wired-item.ts 中的按鈕樣式消費變量作用默認(rèn)值--wired-item-selected-bg選中標(biāo)簽的涂鴉邊框顏色#000--wired-item-selected-color選中標(biāo)簽的文字顏色#fff使用示例wired-tabs { --wired-item-selected-bg: #4caf50; --wired-item-selected-color: #fff; }源碼依據(jù)button.selected { color: var(--wired-item-selected-color, #fff); }以及svg path { stroke: var(--wired-item-selected-bg, #000); … }src/wired-item.ts。這兩個變量作用于wired-item即標(biāo)簽按鈕因此既可寫在wired-tabs上繼承給子元素也可直接寫在wired-item選擇器上。六、原理與實現(xiàn)細(xì)節(jié)1. 標(biāo)簽頁的注冊與映射wired-tabs內(nèi)部通過slot接收子元素slotchange事件觸發(fā)mapPages()src/wired-tabs.ts。該方法只收集tagName wired-tab的元素節(jié)點src/wired-tabs.ts把它們存入pages數(shù)組同時把name支持空格拆分的多段寫入pageMap從而建立名稱 → 頁面元素的映射。2. 選中狀態(tài)的切換與面板顯隱updated()中根據(jù)getElement()的結(jié)果為每個wired-tab添加或移除hidden類src/wired-tabs.ts。隱藏邏輯由 CSS 完成::slotted(.hidden) { display: none !important; }src/wired-tabs.ts。切換后還會通過雙層requestAnimationFrame調(diào)用當(dāng)前面板的wiredRender()確保手繪邊框在內(nèi)容尺寸變化后重繪。3. 手繪邊框的繪制wired-tab繼承自WiredBasesrc/wired-base.ts其draw()調(diào)用rectangle()在 overlay 的 SVG 中畫出手繪矩形邊框src/wired-tab.tsrectangle()基于 RoughJS 的roughRectangle生成抖動路徑src/wired-lib.ts每個實例在構(gòu)造時生成隨機(jī)seedsrc/wired-base.ts所以每次繪制的手繪線條都不完全一樣呈現(xiàn)出隨手涂鴉的觀感標(biāo)簽按鈕wired-item的選中背景則用hachureFill()繪制斜線陰影填充src/wired-item.ts實現(xiàn)見 src/wired-lib.ts。4. 尺寸自適應(yīng)wired-tab構(gòu)造時會創(chuàng)建ResizeObserver監(jiān)聽自身尺寸變化以重繪 SVG在不支持ResizeObserver的環(huán)境下回退為監(jiān)聽window.resize事件src/wired-tab.ts并在元素卸載時通過disconnectedCallback釋放監(jiān)聽。5. 鍵盤導(dǎo)航wired-tabs在firstUpdated()中注冊keydown監(jiān)聽src/wired-tabs.ts按左/上方向鍵37/38→selectPrevious()按右/下方向鍵39/40→selectNext()。兩個方法都會阻止默認(rèn)行為并在標(biāo)簽頁之間循環(huán)切換首尾相接從而支持鍵盤無障礙操作。七、注意事項selected匹配的是wired-tab的name值而不是label同一時刻只顯示一個面板其余面板通過hidden類隱藏而非移除 DOM切換面板后手繪邊框需要重繪源碼采用雙層requestAnimationFrame等待布局穩(wěn)定后再繪制因此內(nèi)容較多或含圖片時首次渲染可能有極短暫的先顯示后描邊過程屬正?,F(xiàn)象若name為空則該 tab 無法被selected匹配mapPages僅注冊非空 name但仍可作為首個標(biāo)簽被默認(rèn)選中。八、許可證wired-tabs 隨 wired-elements 一起以 MIT License 發(fā)布作者為 Preet Shihn。倉庫根目錄的 LICENSE 文件為完整許可文本。贊分享UI組件前端【免費下載鏈接】wired-elementsCollection of custom elements that appear hand drawn. Great for wireframes or a fun look.項目地址https://gitcode.com/gh_mirrors/wi/wired-elements點擊查看免費下載相關(guān)推薦wired-card 實戰(zhàn)指南用 wired-elements 打造手繪風(fēng)格卡片容器wired card 實戰(zhàn)指南用 wired elements 打造手繪風(fēng)格卡片容器 wired card 是 wired elements 組件庫中的容器型UI組件前端wired-elements 之 wired-radio-group手繪風(fēng)格單選組組件完整使用與源碼解析wired elements 之 wired radio group手繪風(fēng)格單選組組件完整使用與源碼解析 導(dǎo)讀 wired radio group 是 wirUI組件前端Wired-Elements項目中的手繪風(fēng)格列表組件wired-listbox詳解Wired Elements項目中的手繪風(fēng)格列表組件wired listbox詳解 組件概述 wired listbox是Wired Elements項目提供的UI組件前端創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考