[Tailwind CSS] 把我的樣式還來

更新 發佈閱讀 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
留言分享你的想法!
avatar-img
Andy Tsou的沙龍
1會員
4內容數
紀錄閱讀Vue3框架思維、設計實戰的過程
Andy Tsou的沙龍的其他內容
2023/12/24
如果前人已經走出一條最佳路徑,我們只顧著欣賞也會到山頂 關注點的改變 一個好的架構都會希望讓開發者能專注在”業務邏輯”的實現,可以提高專案的開發效率、減少開發者非關業務邏輯的事情而煩惱。例如: 開發者A: 請問元件的對話窗如何在確認時控制關閉或開啟狀態? 這個實際案例是架構師認為對話窗的動作
Thumbnail
2023/12/24
如果前人已經走出一條最佳路徑,我們只顧著欣賞也會到山頂 關注點的改變 一個好的架構都會希望讓開發者能專注在”業務邏輯”的實現,可以提高專案的開發效率、減少開發者非關業務邏輯的事情而煩惱。例如: 開發者A: 請問元件的對話窗如何在確認時控制關閉或開啟狀態? 這個實際案例是架構師認為對話窗的動作
Thumbnail
2023/12/24
CAN I USE 解決方法 加入 SCSS 或是 CSS 在 SCSS 檔案中加入以下這段 Code $max:20; @for $i from 1 through $max { body.below-safari14 { .flex-row { &.flex-n
Thumbnail
2023/12/24
CAN I USE 解決方法 加入 SCSS 或是 CSS 在 SCSS 檔案中加入以下這段 Code $max:20; @for $i from 1 through $max { body.below-safari14 { .flex-row { &.flex-n
Thumbnail
2023/12/24
前言 近期用 Nuxt3 開發內嵌於 iOS、Android App 的網頁,並且要支援到 iOS13 版本。 測試時發現 Nuxt3 在 iOS13 功能會無法正常執行,因此順手記錄這個踩坑過程…XD 第一坑 Nuxt3 Announcing Nuxt 3 officially suppo
Thumbnail
2023/12/24
前言 近期用 Nuxt3 開發內嵌於 iOS、Android App 的網頁,並且要支援到 iOS13 版本。 測試時發現 Nuxt3 在 iOS13 功能會無法正常執行,因此順手記錄這個踩坑過程…XD 第一坑 Nuxt3 Announcing Nuxt 3 officially suppo
Thumbnail
看更多
你可能也想看
Thumbnail
情境 前陣子使用 Tailwind CSS 開發的正舒服時,遇到一個常見的需求。 為了營運方便,網頁常常會留一個區域給客戶使用,客戶可以編輯 HTML 來達到想要的效果 這樣的好處是,客戶可以馬上應對業務需要,IT也不用重新佈署程式 壞處是要考量資安,不過都是內部來源,出、入口增加檢核,好好
Thumbnail
情境 前陣子使用 Tailwind CSS 開發的正舒服時,遇到一個常見的需求。 為了營運方便,網頁常常會留一個區域給客戶使用,客戶可以編輯 HTML 來達到想要的效果 這樣的好處是,客戶可以馬上應對業務需要,IT也不用重新佈署程式 壞處是要考量資安,不過都是內部來源,出、入口增加檢核,好好
Thumbnail
本篇是Tailwind CSS系列文章的第一篇,就用輕鬆的閒聊方式來認識一下Tailwind CSS,讓你知道它的魅力所在。Tailwind CSS是一種「Utility-First」的CSS設計模式,提供非常多預先定義好的class給開發者使用,直接加在HTML上就能直接使用,協助開發者更快的開發
Thumbnail
本篇是Tailwind CSS系列文章的第一篇,就用輕鬆的閒聊方式來認識一下Tailwind CSS,讓你知道它的魅力所在。Tailwind CSS是一種「Utility-First」的CSS設計模式,提供非常多預先定義好的class給開發者使用,直接加在HTML上就能直接使用,協助開發者更快的開發
Thumbnail
教大家如何用TailwindCSS來做現代蠻流行的DarkMode和LightMode之間轉換😃 註: 最後面"dark"請改為"black",錄製太快沒有看到有錯誤
Thumbnail
教大家如何用TailwindCSS來做現代蠻流行的DarkMode和LightMode之間轉換😃 註: 最後面"dark"請改為"black",錄製太快沒有看到有錯誤
Thumbnail
動態導覽列為增加使用者經驗UX,要如何在Tailwind CSS上實現呢?這次JayLin來帶大家做一個動態導覽列(Animation Navigation)
Thumbnail
動態導覽列為增加使用者經驗UX,要如何在Tailwind CSS上實現呢?這次JayLin來帶大家做一個動態導覽列(Animation Navigation)
Thumbnail
TaiwlildCSS已成為主流技術在2023年https://roadmap.sh/frontend 擁有良好的設計系統(Design System)以及CSS-In-JS增加讀取速度 和不需要創建CSS檔案即可以用class去做Styling
Thumbnail
TaiwlildCSS已成為主流技術在2023年https://roadmap.sh/frontend 擁有良好的設計系統(Design System)以及CSS-In-JS增加讀取速度 和不需要創建CSS檔案即可以用class去做Styling
Thumbnail
想要知道如何用最新技術來製作一個App嗎? 跟著JayLin用React | Redux Tool Kit | TypeScript | TailwildCSS 來製作一個Drawing App
Thumbnail
想要知道如何用最新技術來製作一個App嗎? 跟著JayLin用React | Redux Tool Kit | TypeScript | TailwildCSS 來製作一個Drawing App
Thumbnail
老師請問tailwind是什麼呢? Tailwind 是一個現代化的 CSS 框架,它的設計理念是「高度可定制的實用型 CSS 庫」。與其他 CSS 框架不同的是,Tailwind 不是基於預先定義好的樣式類別和樣式集合,而是提供了大量的 CSS 實用類別,讓開發者可以更靈活地自由組合和應用。
Thumbnail
老師請問tailwind是什麼呢? Tailwind 是一個現代化的 CSS 框架,它的設計理念是「高度可定制的實用型 CSS 庫」。與其他 CSS 框架不同的是,Tailwind 不是基於預先定義好的樣式類別和樣式集合,而是提供了大量的 CSS 實用類別,讓開發者可以更靈活地自由組合和應用。
Thumbnail
一切始於迭代 舊版個人區在時間的淬煉與服務的發展下,已經越來越多、越來越長,以讓大家更清楚查找使用優先,下階段也能擴充其他功能為目的,因此我們著手改造,接著來看看本次改動的範圍吧!
Thumbnail
一切始於迭代 舊版個人區在時間的淬煉與服務的發展下,已經越來越多、越來越長,以讓大家更清楚查找使用優先,下階段也能擴充其他功能為目的,因此我們著手改造,接著來看看本次改動的範圍吧!
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News