[Tailwind] 客製化-斷點及容器
斷點、容器基本介紹
斷點(Breakpoint)
Tailwind身為現代化的utility-first
框架,當然有提供斷點的設計。並且在每個utilities都支援斷點!
舉例來說我們可以使用<img class="w-16 md:w-32 lg:w-48" src="...">
去設計一個圖片在不同的裝置尺寸具有不同的寬度。Tailwind預設的斷點如下:
Breakpoint prefix | Minimum width | CSS |
---|---|---|
sm | 640px | @media (min-width: 640px) { ... } |
md | 768px | @media (min-width: 768px) { ... } |
lg | 1024px | @media (min-width: 1024px) { ... } |
xl | 1280px | @media (min-width: 1280px) { ... } |
2xl | 1536px | @media (min-width: 1536px) { ... } |
官方文件提到,也可以透過tailwind.config.js
去自定義斷點,
/** @type {import('tailwindcss').Config} */
export default {
theme: {
screens: {
'tablet': '640px',
// => @media (min-width: 640px) { ... }
'laptop': '1024px',
// => @media (min-width: 1024px) { ... }
'desktop': '1280px',
// => @media (min-width: 1280px) { ... }
},
}
}
這邊
screens
內的屬性名稱即為斷點的時候預設的名稱(例如預設的md
,lg
等等)
並且也支援JIT去指定特殊的斷點(可能是在超小尺寸例如320px-iphone SE1的時候的調整。撰寫方式如下:
<div class="min-[320px]:text-center max-[600px]:bg-sky-300">
<!-- ... -->
</div>
更多的斷點客製化可以參考下方的客製化斷點(breakpoint)
容器(Container)
我們要使用tailwind製作container
容器的時候,通常需要根據裝置寬度,去設定container
的實際寬度。
另外在設計container的時候,通常會需要讓容器在畫面正中間,所以需要使用到margin-left:auto
+ margin-right:auto
的語法 (mx-auto
)
tailwind預設已經提供了container
這個class,只是如果沒有額外設定,則只會包含容器的寬度這個設定,而沒有置中於父層
- Bootstrap5 Container
- Tailwind Container
Bootstrap5 | Extra small <576px | Small ≥576px | Medium ≥768px | Large ≥992px | X-Large ≥1200px | XX-Large ≥1400px |
---|---|---|---|---|---|---|
.container | 100% | 540px | 720px | 960px | 1140px | 1320px |
.container-sm | 100% | 540px | 720px | 960px | 1140px | 1320px |
.container-md | 100% | 100% | 720px | 960px | 1140px | 1320px |
.container-lg | 100% | 100% | 100% | 960px | 1140px | 1320px |
.container-xl | 100% | 100% | 100% | 100% | 1140px | 1320px |
.container-xxl | 100% | 100% | 100% | 100% | 100% | 1320px |
.container-fluid | 100% | 100% | 100% | 100% | 100% | 100% |
Breakpoint | Properties |
---|---|
None | width: 100%; |
sm (640px) | max-width: 640px; |
md (768px) | max-width: 768px; |
lg (1024px) | max-width: 1024px; |
xl (1280px) | max-width: 1280px; |
2xl (1536px) | max-width: 1536px; |
通常為了不讓邊線貼齊,我們還會在container左右設定一個padding,寬度通常會是gutter-x的一半(參考bootstrap格線的設計)。
我們可以使用px-*
去製造水平方向的左右padding。所以總結來說,我們在使用container容器的時候,通常會長得像下方的程式碼這樣:
<div class="container mx-auto px-4">
<!-- ... -->
</div>
當然容器也支援許多的客製化,例如預設container即包含mx-auto以及左右padding,這部分請參考下方的客製化容器
客製化斷點
feel free to have as few or as many screens as you want, naming them in whatever way you’d prefer for your project.
官方文件提到,如同其他客製化選項,我們可以在tailwind.config.js
內
- 完整取代預設的斷點
- 基於預設的斷點,額外新增別的斷點
- 只是想要替換掉預設斷點的名稱
Tailwind預設的斷點如下
Breakpoint prefix | Minimum width | CSS |
---|---|---|
sm | 640px | @media (min-width: 640px) { ... } |
md | 768px | @media (min-width: 768px) { ... } |
lg | 1024px | @media (min-width: 1024px) { ... } |
xl | 1280px | @media (min-width: 1280px) { ... } |
2xl | 1536px | @media (min-width: 1536px) { ... } |
預設的斷點所對應的tailwind.config.js如下:
/** @type {import('tailwindcss').Config} */
export default {
theme: {
screens: {
'sm': '640px',
// => @media (min-width: 640px) { ... }
'md': '768px',
// => @media (min-width: 768px) { ... }
'lg': '1024px',
// => @media (min-width: 1024px) { ... }
'xl': '1280px',
// => @media (min-width: 1280px) { ... }
'2xl': '1536px',
// => @media (min-width: 1536px) { ... }
}
}
}
完整取代預設的斷點
如果我們希望取代預設的斷點,完全使用我們自己設計的斷點,則如同其他的客製化方式,我們會在theme
物件下新增一個screens
物件**(screens不可自定義名稱)**範例如下:
/** @type {import('tailwindcss').Config} */
export default {
theme: {
screens: {
'sm': '576px',
// => @media (min-width: 576px) { ... }
'md': '960px',
// => @media (min-width: 960px) { ... }
'lg': '1440px',
// => @media (min-width: 1440px) { ... }
},
}
}
在取代掉預設的斷點時,因為我們自定義的斷點並沒有包含xl
,所以使用xl:text-xl
是不會有任何效果的
替換掉特定預設斷點的值
如果我們只是希望可以取代掉預設的特定幾個斷點,其他的斷點希望可以保留預設的設定,那我們就不應該使用theme
去調整,而是要在theme
下面的extend
去調整screens
, 設定如下:
/** @type {import('tailwindcss').Config} */
export default = {
theme: {
extend: {
screens: {
'lg': '992px',
// => @media (min-width: 992px) { ... }
},
},
},
}
以上設定則會只有lg
一個斷點被改為992px
,其他如sm、md、xl、2xl的斷點仍然會同預設值,依序為640px、768px、1280px、1536px。
基於預設的斷點,額外新增別的斷點
如果想要再額外擴充更大的斷點時,同樣撰寫在theme
下的extend
中
/** @type {import('tailwindcss').Config} */
export default = {
theme: {
extend: {
screens: {
'3xl': '1600px',
// => @media (min-width: 1600px) { ... }
},
},
},
}
因為3xl並非tailwind預設的斷點,而且我們是撰寫在extend內,故不會影響tailwind預設斷點,另外還可以增加我們自己設定的3xl斷點名稱
之後就可以使用3xl:text-blue-100
這種指定斷點行為的語法了
要擴充比預設值更小的斷點時,不可以使用上述方式!!因為extend
內撰寫的斷點,在編譯的時候會產生在預設的 斷點以後,所以會被其他的斷點給取代掉,沒有辦法正確運作。相對的我們要使用theme
的完整取代方式(即第一種方法)再搭配js的展開運算符
去帶入預設值得斷點。範例如下:
const defaultTheme = require('tailwindcss/defaultTheme')
export default {
theme: {
screens: {
'xs': '475px',
...defaultTheme.screens,
},
},
plugins: [],
}
自定義斷點名稱
我們也不一定要使用sm,md,lg等等預設的名稱,可以自定義自己的斷點名稱,如同官方文件所提到的,Feel free to have as few or as many screens as you want, naming them in whatever way you’d prefer for your project.
/** @type {import('tailwindcss').Config} */
export default {
theme: {
screens: {
'tablet': '640px',
// => @media (min-width: 640px) { ... }
'laptop': '1024px',
// => @media (min-width: 1024px) { ... }
'desktop': '1280px',
// => @media (min-width: 1280px) { ... }
},
}
}
將媒體查詢(@media)改為使用max-width設定斷點
因為tailwind是mobile-first,斷點的設計都是使用min-widht
去撰寫的,如果我們今天想要將斷點改成max-width
,則需要使用以下的方法
/** @type {import('tailwindcss').Config} */
export default {
theme: {
screens: {
'2xl': {'max': '1535px'},
// => @media (max-width: 1535px) { ... }
'xl': {'max': '1279px'},
// => @media (max-width: 1279px) { ... }
'lg': {'max': '1023px'},
// => @media (max-width: 1023px) { ... }
'md': {'max': '767px'},
// => @media (max-width: 767px) { ... }
'sm': {'max': '639px'},
// => @media (max-width: 639px) { ... }
}
}
}
我們這邊使用取代的方法,因為不會同時具有min-width跟max-width的斷點,我們在設計的時候只會採取其中一種。所以使用theme去直接取代即可。