元件該怎麼添加 CSS 樣式?
主要方法有四種:
- Inline style 直接給他寫上去(最難維護)
- CSS(全域套用容易撞名)
- Styled Component(CSS in JS)
- CSS modules(CSS JS 分離)
inline style 撰寫動態樣式
- useState 來更新有效無效狀態
- 沒效套用紅色,有效套用黑色
|
|
為什麼不用 inline style 撰寫動態樣式?
- 分散在 html 程式的樣式不好管理
- inline style 會覆蓋掉其他 CSS 樣式(權重僅次!important),找改動點更費時
CSS 撰寫動態樣式
- 把剛剛的樣式貼到 CSS file
|
|
- 拿掉 inline style ,動態添加 className
- 上一篇"有提到 class 是 JavaScript 的保留字,所以不使用 class
|
|
為什麼不用 CSS 撰寫動態樣式
- 因為樣式會套用在全域環境,即生效在所有元件上,而大型專案上在 className 命名的時候很難避免撞名,樣式容易發生衝突
- 使用 Styled Component 套件來創造 scoped CSS
Styled Component 撰寫動態樣式
安裝套件跟撰寫方式
- cd 到專案資料夾
npm install --save styled-components
- const Input = styled.html 元素
CSS樣式
(attacked template literal) - styled package 有所有 html 元素的方法,透過反引號``可以撰寫多行 CSS 樣式,指定到對應 html 元素當中
- 動態產生獨特 hash
|
|
使用 props 動態管理樣式
- 可以拿掉一些不必要的 CSS 樣式(form-control.invalid input 聯集的選擇器)
|
|
style component 使用 media queries
|
|
style component 的優缺點
- 優點:不用想 className 名字了
- 缺點:隨機的 hash 不容易 debug,但透過安裝 babel-plugin-styled-components 可以在瀏覽器看到元件名稱
- 適合喜歡 CSS 跟 JS 邏輯寫在一起的人
CSS modules
- 不用安裝套件,CRA 本身支援 CSS modules
- 把副檔名.css 檔案改成.module.css,引用路徑也要改
- className = {styles. 樣式選擇器名}
- 瀏覽器看到 class 名為:元件名_class 名__hash,因此不會撞名
- class 名若有橫線
-
連接,寫法需要改成${style['form-control']}
|
|
CSS modules 使用 media queries
- 一樣寫在 CSS 檔案就好
|
|
CSS modules 的優缺點
- 優點:命名時不用擔心撞名,hash 維持獨特性
- 缺點:需要改副檔名,一開始沒導入後面手動要改比較累一點
- 適合喜歡 CSS 跟 JS 分離的人