I. Introduction
Tailwindcss – a utility-first CSS framework, is gaining popularity among frontend developers with 34.7k
stars per github and nearly 2k
fork contribute. Tailwindcss can be seen gradually improving to continue the influence of bootstrap in the present time.
Through development and release of multiple versions, Tailwindcss released v2, which has significantly improved: placeholder styling, screenreader visibility, CSS grid, transitions, transforms, animations, layout utilities, integrated tree-shaking, gradients , … and many pretty “delicious” utilities for Frontend Developer.
II. main content
1. Tailwindcss provide new color code table
- If in v1: https://v1.tailwindcss.com/docs/customizing-colors Tailwindcss only 10 main colors, in v2 the number increased to 22 main colors with 10 shades of each color bringing the total number of colors up. number 220.
- Tailwindcss preconfigured for 8 basic colors, you can import
tailwindcss/colors
and use. When needed, we import it intailwind.config.js
offline
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <span class="token comment">// tailwind.config.js</span> <span class="token keyword">const</span> colors <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'tailwindcss/colors'</span> <span class="token punctuation">)</span> module <span class="token punctuation">.</span> exports <span class="token operator">=</span> <span class="token punctuation">{</span> theme <span class="token operator">:</span> <span class="token punctuation">{</span> colors <span class="token operator">:</span> <span class="token punctuation">{</span> gray <span class="token operator">:</span> colors <span class="token punctuation">.</span> trueGray <span class="token punctuation">,</span> indigo <span class="token operator">:</span> colors <span class="token punctuation">.</span> indigo <span class="token punctuation">,</span> red <span class="token operator">:</span> colors <span class="token punctuation">.</span> rose <span class="token punctuation">,</span> yellow <span class="token operator">:</span> colors <span class="token punctuation">.</span> amber <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> |
2. Dark mode
As you can see most of the websites today use two main themes: Dark mode and Light mode. Can be mentioned as: Facebook, Github, Viblo, … We just need to declare in tailwind config:
1 2 3 4 5 6 | <span class="token comment">// tailwind.config.js</span> module <span class="token punctuation">.</span> exports <span class="token operator">=</span> <span class="token punctuation">{</span> darkMode <span class="token operator">:</span> <span class="token string">'media'</span> <span class="token punctuation">,</span> <span class="token comment">// ...</span> <span class="token punctuation">}</span> |
3. Expand 2XL breakpoint
To support responsive on larger screens, in particular, Tailwindcss in the default config:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <span class="token comment">// tailwind.config.js</span> module <span class="token punctuation">.</span> exports <span class="token operator">=</span> <span class="token punctuation">{</span> theme <span class="token operator">:</span> <span class="token punctuation">{</span> screens <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token string">'sm'</span> <span class="token operator">:</span> <span class="token string">'640px'</span> <span class="token punctuation">,</span> <span class="token comment">// => @media (min-width: 640px) { ... }</span> <span class="token string">'md'</span> <span class="token operator">:</span> <span class="token string">'768px'</span> <span class="token punctuation">,</span> <span class="token comment">// => @media (min-width: 768px) { ... }</span> <span class="token string">'lg'</span> <span class="token operator">:</span> <span class="token string">'1024px'</span> <span class="token punctuation">,</span> <span class="token comment">// => @media (min-width: 1024px) { ... }</span> <span class="token string">'xl'</span> <span class="token operator">:</span> <span class="token string">'1280px'</span> <span class="token punctuation">,</span> <span class="token comment">// => @media (min-width: 1280px) { ... }</span> <span class="token string">'2xl'</span> <span class="token operator">:</span> <span class="token string">'1536px'</span> <span class="token punctuation">,</span> <span class="token comment">// => @media (min-width: 1536px) { ... }</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
and then use:
1 2 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> h1</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> ... 2xl:text-9xl <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> Viblo <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> h1</span> <span class="token punctuation">></span></span> |
Personally, right from v1.9, you can completely customize the size of the responsive screen: so this change is nothing special.
4. New facilities for outline ring
Ring
provides a solid box-shadow for the card, for example when you want to focus on a button and it will have a solid box-shadow add the following:
1 2 3 4 5 6 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> button</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> ... focus:outline-none focus:ring-2 focus:ring-blue-300 focus:ring-opacity-50 <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token comment"><!-- ... --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> button</span> <span class="token punctuation">></span></span> |
- You can add effects with
ring-offset-{width}
1 2 3 4 5 6 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> button</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> ... focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-300 focus:ring-opacity-50 <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> Viblo </button |
- The use of
ring
can also be combined withshadow
:
1 2 3 4 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> button</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> shadow-sm focus:ring-2 ... <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> Viblo <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> button</span> <span class="token punctuation">></span></span> |
5. Utility-friendly form styles
TailwindCss provides one more plugin for forms which is declared at @tailwindcss/forms
1 2 3 4 5 6 | <span class="token comment">// tailwind.config.js</span> module <span class="token punctuation">.</span> exports <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token comment">// ...</span> plugins <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'@tailwindcss/forms'</span> <span class="token punctuation">)</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> |
6. Default line-heights according to font-size
When declaring font-size, it will declare line-heights attached.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <span class="token comment">// Tailwind's default theme</span> module <span class="token punctuation">.</span> exports <span class="token operator">=</span> <span class="token punctuation">{</span> theme <span class="token operator">:</span> <span class="token punctuation">{</span> <span class="token comment">// ...</span> fontSize <span class="token operator">:</span> <span class="token punctuation">{</span> xs <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token string">'0.75rem'</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> lineHeight <span class="token operator">:</span> <span class="token string">'1rem'</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> sm <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token string">'0.875rem'</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> lineHeight <span class="token operator">:</span> <span class="token string">'1.25rem'</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> base <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token string">'1rem'</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> lineHeight <span class="token operator">:</span> <span class="token string">'1.5rem'</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> lg <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token string">'1.125rem'</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> lineHeight <span class="token operator">:</span> <span class="token string">'1.75rem'</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> xl <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token string">'1.25rem'</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> lineHeight <span class="token operator">:</span> <span class="token string">'1.75rem'</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token string">'2xl'</span> <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token string">'1.5rem'</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> lineHeight <span class="token operator">:</span> <span class="token string">'2rem'</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token string">'3xl'</span> <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token string">'1.875rem'</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> lineHeight <span class="token operator">:</span> <span class="token string">'2.25rem'</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token string">'4xl'</span> <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token string">'2.25rem'</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> lineHeight <span class="token operator">:</span> <span class="token string">'2.5rem'</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token string">'5xl'</span> <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token string">'3rem'</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> lineHeight <span class="token operator">:</span> <span class="token string">'1'</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token string">'6xl'</span> <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token string">'3.75rem'</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> lineHeight <span class="token operator">:</span> <span class="token string">'1'</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token string">'7xl'</span> <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token string">'4.5rem'</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> lineHeight <span class="token operator">:</span> <span class="token string">'1'</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token string">'8xl'</span> <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token string">'6rem'</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> lineHeight <span class="token operator">:</span> <span class="token string">'1'</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token string">'9xl'</span> <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token string">'8rem'</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> lineHeight <span class="token operator">:</span> <span class="token string">'1'</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> |
So when we use the font-size base
, the tag will receive a line-height of 1.5rem
. For example:
1 2 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> p</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> text-base <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> Viblo <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> p</span> <span class="token punctuation">></span></span> |
In addition, the leading
(line-height) property, when written with the same font-size, overrides the tag’s line-height.
1 2 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> p</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> text-base leading-none <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> Viblo <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> p</span> <span class="token punctuation">></span></span> |
7. Expand spacing, typography, and opacity
- Add starting values
0.5
,1.5
,2.5
, and3.5
for the gaps as we use padding, margin, …
1 2 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> span</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> ml-0.5 <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> Viblo <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> span</span> <span class="token punctuation">></span></span> |
- And ends with the values
72
,80
, and96
:
1 2 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> div</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> p-96 <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> Viblo <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> div</span> <span class="token punctuation">></span></span> |
- Add the
inset
property to align the position (top / right / bottom / left):
1 2 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> div</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> inset-0 <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> Viblo <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> div</span> <span class="token punctuation">></span></span> |
- Fontsize extends
7xl
,8xl
, and9xl
:
1 2 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> h1</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> text-9xl <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> Viblo <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> h1</span> <span class="token punctuation">></span></span> |
- Opacity range from
0
to100
:
1 2 3 4 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> figure</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> opacity-10 <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> Viblo <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> figure</span> <span class="token punctuation">></span></span> |
8. Use @apply with everything
You can use @apply
to inline the utility classes for tags:
1 2 3 4 | .btn { @apply bg-indigo-500 hover:bg-indigo-600 focus:ring-2 focus:ring-indigo-200 focus:ring-opacity-50; } |
9. Add a new widget for text overflow
- Add
overflow-ellipsis
andoverflow-clip
1 2 3 4 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> p</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> overflow-ellipsis overflow-hidden <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> viblo <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> p</span> <span class="token punctuation">></span></span> |
10. Extend variants
In previous versions, if you wanted to use the focus-visible
for backgroundColor
, you had to list in the config all the properties like:
1 2 3 4 5 6 7 8 | <span class="token comment">// tailwind.config.js</span> module <span class="token punctuation">.</span> exports <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token comment">// ...</span> variants <span class="token operator">:</span> <span class="token punctuation">{</span> backgroundColor <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token string">'responsive'</span> <span class="token punctuation">,</span> <span class="token string">'hover'</span> <span class="token punctuation">,</span> <span class="token string">'focus'</span> <span class="token punctuation">,</span> <span class="token string">'focus-visible'</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> |
As for TailwindCss v2:
1 2 3 4 5 6 7 8 9 10 | <span class="token comment">// tailwind.config.js</span> module <span class="token punctuation">.</span> exports <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token comment">// ...</span> variants <span class="token operator">:</span> <span class="token punctuation">{</span> extend <span class="token operator">:</span> <span class="token punctuation">{</span> backgroundColor <span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token string">'focus-visible'</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> |
11. Declare group-hover and focus-within
group-hover
and focus-within
are enabled by default:
1 2 3 4 | <span class="token operator"><</span> div <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"group ..."</span> <span class="token operator">></span> <span class="token operator"><</span> span <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"group-hover:text-blue-600 ..."</span> <span class="token operator">></span> Da ba dee da ba daa <span class="token operator"><</span> <span class="token operator">/</span> span <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> |
12. Register the transition duration and easing curve
Previously when adding a transition you had to add 3 classes:
1 2 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> button</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> ... transition duration-150 ease-in-out <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> Post <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> button</span> <span class="token punctuation">></span></span> |
Now you need to register the effects in the config
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // tailwind.config.js module.exports = { // ... theme: { // ... transitionDuration: { DEFAULT: '150ms', // ... }, transitionTimingFunction: { DEFAULT: 'cubic-bezier(0.4, 0, 0.2, 1)', // ... }, }, } |
We use:
1 2 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> button</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> ... transition <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> Post <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> button</span> <span class="token punctuation">></span></span> |
And of course, we can also override properties if we write the old style:
1 2 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> button</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> ... transition duration-300 ease-out <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> Post <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> button</span> <span class="token punctuation">></span></span> |
13. No longer compatible with IE11
You should consider using it if your project uses IE11.
III. Conclusion
TailwindCss v2 has improved a lot of utilities, but you see how. Personally, I am still waiting for another breakthrough from Tailwind.