[Tailwind CSS] 把我的樣式還來

更新於 2023/12/24閱讀時間約 5 分鐘

情境

前陣子使用 Tailwind CSS 開發的正舒服時,遇到一個常見的需求。

為了營運方便,網頁常常會留一個區域給客戶使用,客戶可以編輯 HTML 來達到想要的效果

這樣的好處是,客戶可以馬上應對業務需要,IT也不用重新佈署程式

壞處是要考量資安,不過都是內部來源,出、入口增加檢核,好好把關就能把風險降到最低

示意圖

示意圖


問題

Tailwind CSS 預設是會把 HTML 元素原生樣式移除,使所有元素都在相同基礎上設計,避免在各瀏覽器有不一樣的顯示。

以上面情境來看,客戶編輯的 HTML 內容就會不如預期,例如: <ul>、<li>、<h1>

如圖

比較

比較


native vs tailwind

Tailwind Preflight

官方稱此為 Preflight ( 很不容易想到的關鍵字… ),而 @tailwind base; 就是使 Preflight 作用的地方

這段Code有使用 Tailwind 應該都不陌生~

@tailwind base; /* Preflight will be injected here */
@tailwind components;
@tailwind utilities;

解決方法

  • 移除 @tailwind base; ⇒ 整個網頁排版會爆炸
  • 透過 Global/Scoped CSS 修改 ⇒ 有太多元素要考慮到,你不知道客戶會用到那些元素
  • Shadow DOM ⇒ 這次的解決方式

Shadow DOM 簡單介紹,可以想像 HTML 是一張紙,而 Shadow DOM 則是在藏於其後的另一張紙,而畫面渲染時會像是兩張紙疊起來顯示

這次則是利用DOM、Shadow DOM之間互不干擾的特性!


Shadow DOM

Shadow DOM


Vue 實作

先看結果

Demo

Demo

透過 vue directive 方便使用

Setup

import { DirectiveBinding, ref } from 'vue'

const htmlStr = ref(`
<h4>Top 3 Frontend Framewors</h6>
<ul>
<li>Vue</li>
<li>React</li>
<li>Angular</li>
</ul>`)

const vShadowHtml = {
mounted: (el: HTMLElement, binding: DirectiveBinding) => {
let shadow: ShadowRoot | null = el.shadowRoot
if (shadow == null) {
shadow = el.attachShadow({ mode: "open" });
}
shadow.innerHTML = binding.value
},
updated: (el: HTMLElement, binding: DirectiveBinding) => {
let shadow: ShadowRoot | null = el.shadowRoot
if (shadow == null) {
shadow = el.attachShadow({ mode: "open" });
}
shadow.innerHTML = binding.value
}
}

Template

<div class="p-5">
<div class=" text-red-300">Without Shadow DOM</div>
<div v-html="htmlStr"></div>
<br />
<div class=" text-red-300">Using Shadow DOM</div>
<div v-shadow-html="htmlStr"></div>
</div>

結論

使用 Tailwind CSS 可以方便管理樣式與提高開發效率,但遇到不同的業務情境時,還是要額外處理。

幾年前研究過 Shadow DOM,沒想倒在此時派上用場,救了我一把,因為這個問題發生是在專案 UAT 階段

另外,對於要不要使用框架,我自己的想法是八二法則~ 若框架能解決8成以上的問題,我就會考慮使用,而剩下的特殊狀況額外處理即可

參考

Tailwind CSS Preflight

avatar-img
1會員
4內容數
紀錄閱讀Vue3框架思維、設計實戰的過程
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Andy Tsou的沙龍 的其他內容
CAN I USE 解決方法 加入 SCSS 或是 CSS 在 SCSS 檔案中加入以下這段 Code $max:20; @for $i from 1 through $max { body.below-safari14 { .flex-row { &.flex-n
前言 近期用 Nuxt3 開發內嵌於 iOS、Android App 的網頁,並且要支援到 iOS13 版本。 測試時發現 Nuxt3 在 iOS13 功能會無法正常執行,因此順手記錄這個踩坑過程…XD 第一坑 Nuxt3 Announcing Nuxt 3 officially suppo
CAN I USE 解決方法 加入 SCSS 或是 CSS 在 SCSS 檔案中加入以下這段 Code $max:20; @for $i from 1 through $max { body.below-safari14 { .flex-row { &.flex-n
前言 近期用 Nuxt3 開發內嵌於 iOS、Android App 的網頁,並且要支援到 iOS13 版本。 測試時發現 Nuxt3 在 iOS13 功能會無法正常執行,因此順手記錄這個踩坑過程…XD 第一坑 Nuxt3 Announcing Nuxt 3 officially suppo
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
本篇是Tailwind CSS系列文章的第一篇,就用輕鬆的閒聊方式來認識一下Tailwind CSS,讓你知道它的魅力所在。Tailwind CSS是一種「Utility-First」的CSS設計模式,提供非常多預先定義好的class給開發者使用,直接加在HTML上就能直接使用,協助開發者更快的開發
Thumbnail
今天在練習寫網頁時,剛好要來有做到Dark Mode 的功能,那順便來記錄一下做法~ 首先要先知道Dark Mode的運作原理。是如何知道你現在是Light Mode還是Dark Mode呢? 😀就是這邊拉~當你按下按鈕時,javascript 的toggle()去為<html>增加dark標
Thumbnail
當然指令不是背的,所以第一步就是要打開Tailwind CSS的官網。 Installation - Tailwind CSS 主要的方式有CLI跟CDN,這裡使用的方式前者。 Install Tailwind CSS npm install -D tailwindcss npx tai
Thumbnail
動態導覽列為增加使用者經驗UX,要如何在Tailwind CSS上實現呢?這次JayLin來帶大家做一個動態導覽列(Animation Navigation)
Thumbnail
TaiwlildCSS已成為主流技術在2023年https://roadmap.sh/frontend 擁有良好的設計系統(Design System)以及CSS-In-JS增加讀取速度 和不需要創建CSS檔案即可以用class去做Styling
Thumbnail
Todo App是一個很好學習程式語言的專案開始,JayLin來帶大家手把手用TypeScript | React | TailwildCSS 來做一個小專案
Thumbnail
想要知道如何用最新技術來製作一個App嗎? 跟著JayLin用React | Redux Tool Kit | TypeScript | TailwildCSS 來製作一個Drawing App
最近在把 Tailwind CSS 加入我的技能樹中,其實像這種 Bootstrap, Tailwind CSS 都是很基本前端需要掌握的 CSS 相關工具 但是我其實對美工比較沒那麼大的興趣,我對功能、效能、安全比較感興趣,所以後端、架站、DevOps、一些安全防護玩了一圈,現在來加強我的排版功力
Thumbnail
這次的專案為六角學院在 2021 年疫情期間舉辦的「程式體驗營」最終作業,其中使用了最近接觸的 Vite 作為專案開發和打包的工具,以及因為對 Utility-First CSS 頗感興趣,將 Tailwind 納入專案並初次使用它做開發...
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
本篇是Tailwind CSS系列文章的第一篇,就用輕鬆的閒聊方式來認識一下Tailwind CSS,讓你知道它的魅力所在。Tailwind CSS是一種「Utility-First」的CSS設計模式,提供非常多預先定義好的class給開發者使用,直接加在HTML上就能直接使用,協助開發者更快的開發
Thumbnail
今天在練習寫網頁時,剛好要來有做到Dark Mode 的功能,那順便來記錄一下做法~ 首先要先知道Dark Mode的運作原理。是如何知道你現在是Light Mode還是Dark Mode呢? 😀就是這邊拉~當你按下按鈕時,javascript 的toggle()去為<html>增加dark標
Thumbnail
當然指令不是背的,所以第一步就是要打開Tailwind CSS的官網。 Installation - Tailwind CSS 主要的方式有CLI跟CDN,這裡使用的方式前者。 Install Tailwind CSS npm install -D tailwindcss npx tai
Thumbnail
動態導覽列為增加使用者經驗UX,要如何在Tailwind CSS上實現呢?這次JayLin來帶大家做一個動態導覽列(Animation Navigation)
Thumbnail
TaiwlildCSS已成為主流技術在2023年https://roadmap.sh/frontend 擁有良好的設計系統(Design System)以及CSS-In-JS增加讀取速度 和不需要創建CSS檔案即可以用class去做Styling
Thumbnail
Todo App是一個很好學習程式語言的專案開始,JayLin來帶大家手把手用TypeScript | React | TailwildCSS 來做一個小專案
Thumbnail
想要知道如何用最新技術來製作一個App嗎? 跟著JayLin用React | Redux Tool Kit | TypeScript | TailwildCSS 來製作一個Drawing App
最近在把 Tailwind CSS 加入我的技能樹中,其實像這種 Bootstrap, Tailwind CSS 都是很基本前端需要掌握的 CSS 相關工具 但是我其實對美工比較沒那麼大的興趣,我對功能、效能、安全比較感興趣,所以後端、架站、DevOps、一些安全防護玩了一圈,現在來加強我的排版功力
Thumbnail
這次的專案為六角學院在 2021 年疫情期間舉辦的「程式體驗營」最終作業,其中使用了最近接觸的 Vite 作為專案開發和打包的工具,以及因為對 Utility-First CSS 頗感興趣,將 Tailwind 納入專案並初次使用它做開發...