[others] CSS trivia
至中
https://juejin.cn/post/6844903982960214029
Specificity 權重
Every CSS selector has its place in the specificity hierarchy.
There are four categories which define the specificity level of a selector:
1. important
2. Inline styles - Example: <h1 style="color: pink;">
3. IDs - Example: #navbar
4. Classes, pseudo-classes, attribute selectors - Example: .test, :hover, [href]
5. Elements and pseudo-elements - Example: h1, :before
6. universal selectors (*)
resources:
https://www.w3schools.com/css/css_specificity.asp
box model (盒模型)
由外到內分別為 margin > border > padding > content
:box model(盒模型)為 css 中的佈局模型。
box model explain https://www.oxxostudio.tw/articles/202008/css-box-model.html
margin(元素外擴展) vs padding(元素內擴展) https://ithelp.ithome.com.tw/articles/10205322
什麼是 box-sizing:content box?為什麼需要設 box-sizing:border-box?
什麼是 box-sizing:border-box?
設定 box-sizing:border-box 不用再去計算實際的 width/height,因為 width/height 會設定為 border-box,代表 padding 會往 border-box 裡面長,margin 則會往外長,width/height 不會因此而改變。
將 box-sizing 設定成 border-box 後, width / height 的作用範圍就是指到 border 這個 box 的範圍了,我們就稱為 border-box,從前面所寫的可以了解一個物件的範圍,是由四個層層包裹的矩形所構成,此時 width 所作用的 box 就是 border 這個範圍了,如下圖所示(圖片取自 Chrome DevTools)
BFC(Block Formatting Contexts)
:W3C 規範中的一個概念,簡單來說具有 BFC 特性的元素可以看做是隔離了的獨立容器,容器裡面的元素不會被外面的元素所影響。
解決問題:
元素間的 margin collapsing(外邊距重疊)問題
解決方法:
觸發 BFC 的條件
根元素或其它包含它的元素 浮動元素 (元素的 float 不是 none) 絕對定位元素 (元素具有 position 為 absolute 或 fixed) 內聯塊 (元素具有 display: inline-block) 表格單元格 (元素具有 display: table-cell,HTML 表格單元格默認屬性) 表格標題 (元素具有 display: table-caption, HTML 表格標題默認屬性) 具有 overflow 且值不是 visible 的塊元素 彈性盒(flex 或 inline-flex) display: flow-root column-span: all
https://codesandbox.io/s/crazy-paper-8imk9f?file=/src/App.js
https://stackoverflow.com/questions/19718634/how-to-disable-margin-collapsing
閱讀資料:
https://yachen168.github.io/article/Block-formatting-context.html
css layout
position fixed
- positioned relative to the viewport, which means it always stays in the same place even if the page is scrolled
- 直接參考 viewport 的空間
position absolute
- positioned relative to the nearest positioned ancestor.
- 會從資料流中抽離,自己獨立一個層,並參考父層空間作為定位的空間,也代表後面的 UI 有可能會覆蓋到被設定 absolute 而脫離的資料流中的 UI
- 元素的 position 設定 absolute 後,它就會往外層的元素找是否有 position:relative | absolute | fixed | inherit(若繼承的是前面 3 個之一)的元素,若是都沒有,就會以該網頁頁面(
<body>
)的左上角為定位點。
https://ithelp.ithome.com.tw/articles/10253500
https://ithelp.ithome.com.tw/articles/10212202
position relative
- relative 所參考的空間是物件本身位於資料流內的原始位置,但是可以設定距離母層的 right, left 等位置
css display
inline
- 排列成 inline 樣式
- width, height 皆無效
- default inline:
span
,a
,img
inline-block
- 排列成 inline 樣式,但是可以操控 width, height
block
- 排列成 block 樣式
- 常見 block 樣式:
div
,h1
,p
,li
,section
display: inline-block vs block?
- display: inline-block allows to set a width and height on the element.
- with display: inline-block, width, height and padding are respected,
https://www.digitalocean.com/community/tutorials/css-display-inline-vs-inline-block
css flex?
flex:1 ?
TL;DR
flex:1 等於
flex-grow : 1;
flex-shrink : 1;
flex-basis : '0%';
flex 的預設值?
flex-grow : 1;
flex-shrink : 1;
flex-basis : auto;
推薦閱讀文章:https://www.51cto.com/article/683878.html
css grid?
CSS grid vs CSS flexbox?
CSS Grid 是一個二維佈局系統,允許你在一個網格中定義兩個維度的大小(ex, 行和列),以創建複雜的佈局。它提供了對佈局的位置和大小的控制,包括創建重疊元素和控制項目沿著兩個軸的對齊方式。CSS Grid 非常適合創建需要精確和可適應的複雜佈局,例如雜誌式佈局或數據表格。
而 Flexbox 則是一個一維佈局系統,代表一次只能控制一個維度(ex, 行),用於沿著單個軸(水平或垂直)排列項目。 它設計用於更靈活和簡單的佈局,不需要複雜的定位。Flexbox 尤其適用於創建需要根據不同的屏幕尺寸調整的響應式佈局,例如導航菜單、卡片佈局和可彈性調整的內容容器。
CSS 套件
CSS-in-JS
styled-components
pros:
- 避免汙染全域 CSS:生成唯一的 class 名,避免汙染全域 CSS。
- autoprefixer: 自動產生瀏覽器兼容性前綴。
- 用 props 做 dynamic styling
cons:
- 在 SSR hydration 中要額外去 render ServerStyleSheet,因為 styled-components 是動態的被生成(ex, props)
- 效能不好(越多 JS,代表要解析越多東西,效能越不好)
lineria
pros:
- 用 CSS-in-JS 的寫法加上 zero runtime(在 build time 建立 css) 來減少 JS 程式碼量,以增加 loading 時間來達到更好的 SEO
資源:
why airbnb switch to linaria
https://medium.com/airbnb-engineering/airbnbs-trip-to-linaria-dc169230bd12
use lineria with atomic css
https://github.com/callstack/linaria/blob/master/docs/ATOMIC_CSS.md
https://css-tricks.com/lets-define-exactly-atomic-css/
atomic css
:把 css 切分,來減少多餘/重複的 CSS。
//before
<style>
.redButton {
background: red;
width: 100px;
}
.blueButton {
background: blue;
width: 100px;
}
</style>
<button class="redButton" />
<button class="blueButton" />
//after
<style>
.a {
background: red;
}
.b {
background: blue;
}
.c {
width: 100px;
}
</style>
<button class="a c" />
<button class="b c" />
比較
CSS-in-JS vs CSS-Module
CSS-in-JS
pros
- 複用性高
- 好用,易讀
cons
- 樣式是和 JS 文件打包在一起,所以會拖慢 JS 文件加載時間
- 沒有單獨 CSS 文件所以無法緩存
CSS-Module
pros
- 樣式代碼與 JS 代碼分離,代碼會相對簡潔樣式
- 只是在 CSS 基礎上加入了局部作用域跟模塊以來,代碼相對規範
cons
- CSS Modules don’t accept props.
https://juejin.cn/post/7030349710023983117
visibility:hidden vs display:none
總之,display: none 和 visibility: hidden 之間的主要區別在於前者完全從文檔流中刪除元素,而後者隱藏元素但仍使其保留在文檔流中,佔據空間並影響佈局。
偽元素 vs 偽類
偽元素:a css pseudo-element is used to style specified parts of an element. ex, ::first, ::before
偽類:a css pseudo-class is used to define a special state of an element. 常見的包含以下幾種:
:hover :active => 它代表的是用戶按下按鍵和鬆開按鍵之間的時間。 :visited => 表示用戶已訪問過的鏈接
css combinators 用法
https://www.w3schools.com/css/css_combinators.asp
+ (select element immediate after)
~ (select element behind it)
https://stackoverflow.com/questions/6910049/on-a-css-hover-event-can-i-change-another-divs-styling https://stackoverflow.com/questions/10782054/what-does-the-tilde-squiggle-twiddle-css-selector-mean
css attributes
attribute selector 可以透過對象擁有的 attribute 來選定他,來做 css 樣式的使用。
https://www.w3schools.com/css/css_attribute_selectors.asp
Resources:
https://zh-tw.learnlayout.com/frameworks.html https://ithelp.ithome.com.tw/articles/10252827 https://zh-tw.learnlayout.com/box-sizing.html