ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Tailwind
ΠΠ΅ΡΠ²ΡΠΌ Π΄Π΅Π»ΠΎΠΌ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΏΠ°ΠΊΠ΅Ρ ΡΡΠΎΠ½Ρ-ΡΠ½Π΄ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
npx create-react-app my-project
cd my-project
ΠΠ°Π»Π΅Π΅ Π½ΡΠΆΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠ°ΠΌΠΈ ΠΌΠΎΠ΄ΡΠ»ΠΈ ΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΡΡΠΈΠ»Π²ΠΈΠ½Π΄Π°
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p
ΠΠ°ΡΠ°Π»ΡΠ½ΡΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ
tailwind.config.js
/** @type {import('tailwindcss').Config} */
module.exports = {
content: ['./src/**/*.{js,jsx,ts,tsx}'],
theme: {
extend: {},
},
plugins: [],
};
Π ΡΡΠΈ ΡΡΡΠΎΠΊΠΈ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ Π²ΡΡΠ°Π²ΠΈΡΡ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΠ°ΠΉΠ» ΡΡΠΈΠ»Π΅ΠΉ
index.css
@tailwind base;
@tailwind components;
@tailwind utilities;
Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ Tailwind VS code
ΠΡΠΎ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ Π°Π²ΡΠΎΠΊΠΎΠΌΠΏΠ»ΠΈΡ ΠΏΠΎΠ΄ Tailwind
ΠΡΡΠ°Π»ΡΠ½ΡΠ΅ Π΄Π²Π° ΠΏΠ»Π°Π³ΠΈΠ½Π° Π½ΡΠΆΠ½Ρ Π΄Π»Ρ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠ΅ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅Ρ ΡΡΠΈΠ»Π²ΠΈΠ½Π΄
ΠΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΡΠ΅ΠΌ ΡΠ°ΠΉΠ» ΠΊΠ°ΠΊ ΡΡΠΈΠ»Π²ΠΈΠ½Π΄ΠΎΠ²ΡΠΊΠΈΠΉ
ΠΡΡΡΡΠΏΡ (margin, padding, borders)
m-10
- margin:10rem
mx-10
- ΡΠ΄Π΅Π»Π°Π΅Ρ ΠΌΠ°ΡΠ΄ΠΆΠΈΠ½ ΠΏΠΎ ΠΎΡΠΈ x
my-10
- ΡΠ΄Π΅Π»Π°Π΅Ρ ΠΌΠ°ΡΠ΄ΠΆΠΈΠ½ ΠΏΠΎ ΠΎΡΠΈ y
m-auto
/ mx-auto
/my-auto
- ΡΠ΄Π΅Π»Π°Π΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠ°ΡΠ΄ΠΆΠΈΠ½ ΠΏΠΎ Π²ΡΠ΅ΠΌ ΠΎΡΡΠΌ, Π»ΠΈΠ±ΠΎ ΡΠΏΡΠ°Π²Π° ΡΠ»Π΅Π²Π° ΠΏΠΎ ΡΠ΅Π½ΡΡΡ, Π»ΠΈΠ±ΠΎ ΠΎΡΡΠ΅Π½ΡΡΠΈΡΡΠ΅Ρ ΡΠ²Π΅ΡΡ
Ρ ΡΠ½ΠΈΠ·Ρ ΠΏΠΎ ΡΠ΅ΡΠ΅Π΄ΠΈΠ½Π΅
-m-10
- ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΡΠΉ ΠΌΠ°ΡΠ΄ΠΆΠΈΠ½
-mx-10
- ΠΏΠΎ ΠΎΡΠΈ x
-my-10
- ΠΏΠΎ ΠΎΡΠΈ y
p-10
- Π΄Π΅Π»Π°Π΅Ρ ΠΏΠ°Π΄Π΄ΠΈΠ½Π³ ΡΠΎ Π²ΡΠ΅Ρ
ΡΡΠΎΡΠΎΠ½
px-10
- ΡΠ΄Π΅Π»Π°Π΅Ρ ΠΏΠ°Π΄Π΄ΠΈΠ½Π³ ΠΏΠΎ ΠΎΡΠΈ x
py-10
ΡΠ΄Π΅Π»Π°Π΅Ρ ΠΏΠ°Π΄Π΄ΠΈΠ½Π³ ΠΏΠΎ ΠΎΡΠΈ y
p-auto
/ px-auto
/py-auto
-p-10
- Π΄Π΅Π»Π°Π΅Ρ ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΡΠΉ ΠΏΠ°Π΄Π΄ΠΈΠ½Π³
-px-10
- ΠΏΠΎ ΠΎΡΠΈ x
-py-10
- ΠΏΠΎ ΠΎΡΠΈ y
function App() {
return (
<div className='App'>
<h1 className="m-10">Tailwind CSS</h1>
<button className='mx-10'>Login</button>
</div>
);
}
border
- ΡΠΎΠ·Π΄Π°ΡΡ Π³ΡΠ°Π½ΠΈΡΡ ΡΠΎΠ»ΡΠΈΠ½ΠΎΠΉ 1 ΠΏΠΈΠΊΡΠ΅Π»Ρ
border-ΡΠ²Π΅Ρ-Π½Π°ΡΡΡΠ΅Π½Π½ΠΎΡΡΡ
- ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ°ΠΌΠΊΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠ³ΠΎ ΡΠ²Π΅ΡΠ°
rounded-ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΎΡ
- ΡΠΊΡΡΠ³Π»ΠΈΡ ΡΠ°ΠΌΠΊΡ
Π¨ΡΠΈΡΡ (ΡΠ°Π·ΠΌΠ΅Ρ, ΡΠ²Π΅Ρ, ΠΆΠΈΡΠ½ΠΎΡΡΡ)
text-xl
- ΡΡΠΈΠΌ ΠΊΠ»Π°ΡΡΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΠΆΠΈΡΠ½ΠΎΡΡΡ ΡΠ΅ΠΊΡΡΠ° (ΠΎΡ xl
Π΄ΠΎ 4xl
)
font-bold
- ΠΆΠΈΡΠ½ΡΠΉ ΡΠ΅ΠΊΡΡ
text-center
- ΡΠ΅Π½ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅ΠΊΡΡΠ°
text-ΡΠ²Π΅Ρ-Π½Π°ΡΡΡΠ΅Π½Π½ΠΎΡΡΡ
- ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠ²Π΅ΡΠ° ΡΠ΅ΠΊΡΡΠ°
Π¨ΠΈΡΠΈΠ½Π°, Π²ΡΡΠΎΡΠ°
w-ΡΠΈΡΠ»ΠΎ
- ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΡΠΈΡΠΈΠ½Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΎΠΊΠ½Π°
w-screen
- width: 100vw
w-full
- width: 100%
h-ΡΠΈΡΠ»ΠΎ
- ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡ Π²ΡΡΠΎΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°
h-screen
- height: 100vw
h-full
- height: 100%
hover, focus, before, afterβ¦
bg-purple-500
- ΡΠ°ΠΊ ΠΆΠ΅ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΊΠ·ΡΠ²Π°ΡΡ ΡΠ²Π΅ΡΠ° Π΄Π»Ρ bg
bg-opacity-60
- ΠΈ Π½Π΅ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΠΎΡΡΡ ΡΠΎΠΆΠ΅
hover:ΠΊΠΎΠ½Π΅ΡΠ½ΡΠΉ-ΠΈΡΠΎΠ³
- Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡΡ ΠΏΡΠΈ Π½Π°Π²Π΅Π΄Π΅Π½ΠΈΠΈhover:bg-opacity-100
- Π½Π΅ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΠΎΡΡΡ ΡΠΎΠ½Π° ΠΏΡΠΈ Π½Π°Π²Π΅Π΄Π΅Π½ΠΈΠΈ =100%
hover/focus/before/after:ΠΊΠΎΠ½Π΅ΡΠ½ΡΠΉ-ΠΈΡΠΎΠ³
- ΡΠ°ΠΊ ΠΆΠ΅ ΡΠΎ Π²ΡΠ΅ΠΌΠΈ ΠΎΡΡΠ°Π»ΡΠ½ΡΠΌΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ
function App() {
return (
<div className='App border border-emerald-600 rounded-md m-10 p-4'>
<h1 className='text-4xl font-bold text-center text-gray-600'>
Hello Tailwind CSS
</h1>
<button
className='block mt-10 mx-auto px-4 py-2
bg-purple-500 bg-opacity-60 rounded-lg
hover:bg-opacity-100'
>
Login
</button>
</div>
);
}
Transition
transition
- ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ
transition-[colors/opacity/shadow/transform]
- Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ Π΄Π»Ρ ΡΠ²Π΅ΡΠΎΠ², Π½Π΅ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΠΎΡΡΠΈ, ΡΠ΅Π½Π΅ΠΉ ΠΈ ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΠΈ
transition-all
- Π·Π°Π΄Π°ΡΡ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ Π½Π° Π²ΡΠ΅ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ, Π·Π°Π΄Π°Π½Π½ΡΠ΅ Π΄Π»Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°
delay-[ΡΠΈΡΠ»ΠΎ]
- Π·Π°Π΄Π΅ΡΠΆΠΊΠ° Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ
ease-in-out
- ΡΠΈΠΏ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ
ΠΠ½ΠΈΠΌΠ°ΡΠΈΠΈ
animate-[Π°Π½ΠΈΠΌΠ°ΡΠΈΡ]
- ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π·Π°Π΄Π°ΡΡ Π·Π°ΡΠ°Π½Π΅Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΡ (Π·Π°Π³ΠΎΡΠΎΠ²Π»Π΅Π½Π½Ρ) Π°Π½ΠΈΠΌΠ°ΡΠΈΡ
animate-spin
- Π°Π½ΠΈΠΌΠ°ΡΠΈΡ ΠΊΡΡΡΠ΅Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°
ΠΠ΄Π°ΠΏΡΠ°ΡΠΈΡ - ΠΌΠ΅Π΄ΠΈΠ° Π·Π°ΠΏΡΠΎΡΡ
Π’Π°ΠΊ ΠΆΠ΅ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°ΡΡ Π»ΡΠ±ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΏΠΎΠ΄ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΡ ΡΠΊΡΠ°Π½ΠΎΠ²: sm
, md
, lg
, xl
, 2xl
(ΡΠΎΡΠΌΠ°Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΊΠ°ΠΊ Π² bootstrap - mobile-first)
<div className='App border border-emerald-600 rounded-md m-10 p-4'>
<h1 className='text-4xl font-bold text-center text-gray-600'>Hello Tailwind CSS</h1>
<button className='block mt-10 mx-auto px-4 py-2 bg-green-500 bg-opacity-60 rounded-lg md:bg-purple-500'>
Login
</button>
</div>
Π’Π΅ΠΌΠ½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ
dark:[ΠΊΠ°ΠΊΠΎΠ΅-ΡΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ]
- ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ, Π΅ΡΠ»ΠΈ Π½Π° ΠΠ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π° ΡΡΠΌΠ½Π°Ρ ΡΠ΅ΠΌΠ°
@apply ΠΈ module.scss
Π‘Π½Π°ΡΠ°Π»Π° ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΠΌ ΡΡΠΈΠ»ΠΈ ΠΊ ΡΠΊΡΠΈΠΏΡΡ Π² .module
ΡΠ΅ΠΆΠΈΠΌΠ΅ (ΡΡΠΎΠ±Ρ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΠΈΠ· JSX ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ Π² ΡΡΠΈΠ»ΠΈ Π² Π²ΠΈΠ΄Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ²)
styles.parent
- ΠΎΠ±ΡΠ°ΡΠ°Π΅ΡΡΡ ΠΊ ΡΡΠΈΠ»ΡΠΌ styles
ΠΈ Π±Π΅ΡΡΡ ΠΎΡΡΡΠ΄Π° ΡΡΠΈΠ»ΠΈ ΠΊΠ»Π°ΡΡΠ° parent
App.js
import styles from './App.module.scss';
function App() {
return (
<div className={`App ${styles.parent}`}>
<h1 className={styles.heading}>Hello Tailwind CSS</h1>
<button className={styles.button}>Login</button>
</div>
);
}
export default App;
ΠΠΈΡΡΠ΅ΠΊΡΠΈΠ²Π° @apply
ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π² PostCSS
, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΡΡΠΈΠ»ΠΈ ΡΡΠΈΠ»Π²ΠΈΠ½Π΄Π° ΠΏΡΡΠΌΠΎ Π²Π½ΡΡΡΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° CSS
App.module.scss
.parent {
@apply border border-emerald-600 rounded-md m-10 p-4;
.heading {
@apply text-4xl font-bold text-center text-gray-600;
}
.button {
@apply block mt-10 mx-auto px-4 py-2 bg-green-500 bg-opacity-60 rounded-lg md:bg-purple-500 dark:bg-rose-500 transition-all;
&:hover {
@apply bg-green-900;
}
}
}
ΠΡΠΈΠΌΠ΅Ρ Π½Π° Π²Π΅ΡΡΡΠΊΠ΅ ΡΠΎΡΠΌΡ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ
App.js
import { useState } from 'react';
import styles from './App.module.scss';
function App() {
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
return (
<div className={`App ${styles.parent}`}>
<h1 className={styles.heading}>Hello Tailwind CSS</h1>
<div>
<input
className={styles.input}
placeholder='Login'
value={email}
onChange={(e) => setEmail(e.target.value)}
/>
<input
className={styles.input}
placeholder='Password'
value={password}
onChange={(e) => setPassword(e.target.value)}
/>
<button className={styles.button}>Login</button>
</div>
</div>
);
}
export default App;
App.module.scss
.parent {
@apply mx-auto mt-0 w-80;
.heading {
@apply text-2xl font-bold text-center text-white my-6;
}
> div {
@apply shadow-2xl rounded-sm overflow-hidden;
.input {
@apply block w-full py-3 px-4 bg-white bg-opacity-10 border-r-2 border-transparent placeholder:text-slate-500 outline-none text-slate-50 transition-all;
&:focus {
@apply border-slate-400;
}
}
.button {
@apply block w-full py-2.5 bg-orange-500 text-white transition-all font-bold text-lg;
&:hover {
@apply bg-orange-600;
}
}
}
}
Tailwind Config
ΠΠ΅ΡΠ²ΡΠΌ Π΄Π΅Π»ΠΎΠΌ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΊΠ°Π·Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π² theme
, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΡΠΈΡΡΡΡΡΠ²ΠΎΠ²Π°ΡΡ Π² Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅. ΠΡΠ»ΠΈ ΠΌΡ Π½Π°ΡΠ½ΡΠΌ ΠΈΡ
ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ ΠΏΡΡΠΌΠΎ Π² ΡΠ΅ΠΌΠ΅, ΡΠΎ Π΄ΡΡΠ³ΠΈΡ
Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΡΡΠΎΠΉ Π³ΡΡΠΏΠΏΡ ΠΏΡΠΈΡΡΡΡΡΠ²ΠΎΠ²Π°ΡΡ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ Π±ΡΠ΄Π΅Ρ
/** @type {import('tailwindcss').Config} */
module.exports = {
content: ['./src/**/*.{js,jsx,ts,tsx}'],
// Π΅ΡΠ»ΠΈ Π±ΡΠ΄Π΅ΠΌ ΠΏΠΈΡΠ°ΡΡ ΠΏΡΡΠΌΠΎ ΡΡΡ, ΡΠΎ ΠΌΡ Π·Π°ΠΌΠ΅Π½ΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»
theme: {
// Π·Π°ΠΌΠ΅Π½ΡΠ΅ΠΌ Π²ΡΠ΅ ΡΠ²Π΅ΡΠ° Π½Π° ΠΏΠΎΠ΄ΡΡΠ°Π²Π»Π΅Π½Π½ΡΠ΅
colors: {
primary: 'red',
},
extend: {},
},
plugins: [],
};
ΠΠ΄Π½Π°ΠΊΠΎ, Π΅ΡΠ»ΠΈ ΠΏΠΈΡΠ°ΡΡ Π½Π΅ ΠΏΡΠΎΡΡΠΎ Π² ΡΠ΅ΠΌΡ, Π° Π² extend
, ΡΠΎ Π²ΡΠ΅ Π΄Π΅ΡΠΎΠ»ΡΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΎΡΡΠ°Π½ΡΡΡΡ
/** @type {import('tailwindcss').Config} */
module.exports = {
content: ['./src/**/*.{js,jsx,ts,tsx}'],
theme: {
// ΡΠ°ΡΡΠΈΡΡΠ΅ΠΌ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»
extend: {
colors: {
primary: 'red',
},
spacing: {
0.5: '0.12rem',
},
},
},
plugins: [],
};
Π’Π°ΠΊ ΠΆΠ΅ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΌΠ΅Π½ΡΡΡ Π΄Π΅ΡΠΎΠ»ΡΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π½Π° ΡΠ²ΠΎΠΈ, ΠΏΡΠΎΠΏΠΈΡΠ°Π² ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΠΌΠ΅Π½ΡΠ² ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ DEFAULT
/** @type {import('tailwindcss').Config} */
module.exports = {
content: ['./src/**/*.{js,jsx,ts,tsx}'],
theme: {
extend: {
transitionTimingFunction: {
DEFAULT: 'ease-in-out',
},
transitionDuration: {
DEFAULT: '400ms',
},
},
},
plugins: [],
};
Π ΡΠΆΠ΅ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΡΠ°Π±Π»ΠΎΠ½Ρ Π΄Π»Ρ Π½Π°ΡΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ
module.exports = {
content: ['./src/**/*.{js,jsx,ts,tsx}'],
theme: {
extend: {
transitionTimingFunction: {
DEFAULT: 'ease-in-out',
},
transitionDuration: {
DEFAULT: '400ms',
},
// Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΎΡΠΊΠ°ΠΌ
keyframes: {
// Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΎΠ½Π°
fadeIn: {
from: {
opacity: 0,
},
to: {
opacity: 1,
},
},
},
// ΡΡΡ ΡΠΆΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊ Π³ΡΡΠΏΠΏΠ΅ animation ...
animation: {
// ... Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ fade
fade: 'fadeIn 0.5s ease-in-out'
}
},
},
plugins: [],
};
Π’Π°ΠΊ ΠΆΠ΅ ΡΡΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΊΠ°Π·Π°ΡΡ ΡΠ²ΠΎΠΈ ΠΌΠ°Π»Π΅Π½ΡΠΊΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ z-index
, Π΅ΡΠ»ΠΈ Π½Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΡΡΡΡ (ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π² ΡΡΠΈΠ»Π²ΠΈΠ½Π΄Π΅ ΠΎΠ½ΠΈ ΠΈΠ΄ΡΡ, Π½Π°ΡΠΈΠ½Π°Ρ Ρ 10)
module.exports = {
content: ['./src/**/*.{js,jsx,ts,tsx}'],
theme: {
extend: {
zIndex: {
1: '1',
2: '2',
},
},
},
plugins: [],
};
ΠΠ»Π°Π³ΠΈΠ½Ρ
Π’Π°ΠΊ ΠΆΠ΅ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½Ρ Π»ΠΈΠ±ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ Ρ npm, Π»ΠΈΠ±ΠΎ ΠΎΡ ΡΠ°ΠΌΠΈΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ²
npm i -D @tailwindcss/typography
Π’ΡΡ Π² ΠΏΠ»Π°Π³ΠΈΠ½Π°Ρ ΠΎΠ½ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°ΡΡΡΡ
module.exports = {
content: ['./src/**/*.{js,jsx,ts,tsx}'],
theme: {
extend: {},
},
plugins: [require('@tailwindcss/typography')],
};
Π Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°ΡΡΡΡ
<article class='prose lg:prose-xl'>
<h1>Garlic bread with cheese: What the science tells us</h1>
<p>
For years parents have espoused the health benefits of eating garlic bread with cheese to
their children, with the food earning such an iconic status in our culture that kids will
often dress up as warm, cheesy loaf for Halloween.
</p>
<p>
But a recent study shows that the celebrated appetizer may be linked to a series of rabies
cases springing up around the country.
</p>
</article>
ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΊΠ½ΠΎΠΏΠΊΠΈ
Π’Π°ΠΊ ΠΆΠ΅ Π²Π½ΡΡΡΠΈ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² ΡΠ΅ΡΠ΅Π· ΡΡΠ½ΠΊΡΠΈΡ plugin()
ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ addComponents()
, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π² ΡΠ΅Π±Ρ ΠΎΠ±ΡΠ΅ΠΊΡ Ρ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΈ ΡΡΠΈΠ»ΠΈ Π΄Π»Ρ Π½Π΅Π³ΠΎ
/** @type {import('tailwindcss').Config} */
import plugin from 'tailwindcss/plugin';
module.exports = {
content: ['./src/**/*.{js,jsx,ts,tsx}'],
theme: {
extend: {},
},
plugins: [
plugin(({ addComponents, theme, addUtilities }) => {
// ΡΡΡ ΠΌΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ
addComponents({
'.btn-primary': {
// ΠΏΠΈΡΠ΅ΠΌ ΡΡΠΈΠ»ΠΈ
// ΡΡΡ ΠΌΡ Π±Π΅ΡΡΠΌ ΡΡΠΈΠ»ΠΈ ΠΈΠ· tailwind
backgroundColor: theme('colors.orange.500'),
// Π° ΡΡΡ ΠΏΠΈΡΠ΅ΠΌ ΡΡΠΈΠ»ΠΈ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ
color: 'white',
padding: '10px 0',
display: 'block',
width: '100%',
fontSize: 18,
fontWeight: 'bold',
// ΡΡΠΎ ΡΡΠΈΠ»Ρ-ΠΏΡΠ΅Π²Π΄ΠΎΠΊΠ»Π°ΡΡ
'&:hover': {
backgroundColor: theme('colors.orange.600'),
},
},
});
}),
],
};
Π’Π°ΠΊ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½Π°
.button {
@apply btn-primary transition-all;
&:hover {
@apply bg-orange-600;
}
}
ΠΠ°ΡΡΠΎΠΌΠ½Π°Ρ ΡΡΠΈΠ»ΠΈΡΠ°
Π£ΡΠΈΠ»ΠΈΡΠ° - ΡΡΠΎ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, Π° Π½Π΅ ΡΠ΅Π»ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ ΡΠ΅ΡΠ΅Π· addUtilities()
plugins: [
plugin(({ addComponents, theme, addUtilities }) => {
// ΡΡΡ ΠΌΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ
addComponents({
'.btn-primary': {
// ΠΏΠΈΡΠ΅ΠΌ ΡΡΠΈΠ»ΠΈ
// ΡΡΡ ΠΌΡ Π±Π΅ΡΡΠΌ ΡΡΠΈΠ»ΠΈ ΠΈΠ· tailwind
backgroundColor: theme('colors.orange.500'),
// Π° ΡΡΡ ΠΏΠΈΡΠ΅ΠΌ ΡΡΠΈΠ»ΠΈ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ
color: 'white',
padding: '10px 0',
display: 'block',
width: '100%',
fontSize: 18,
fontWeight: 'bold',
// ΡΡΠΎ ΡΡΠΈΠ»Ρ-ΠΏΡΠ΅Π²Π΄ΠΎΠΊΠ»Π°ΡΡ
'&:hover': {
backgroundColor: theme('colors.orange.600'),
},
},
});
// ΡΡΡ ΡΠΆΠ΅ ΠΌΡ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΡΡΠΈΠ»ΠΈΡΠΊΡ
addUtilities({
'.textShadow': {
textShadow: '1px 1px rgba(0, 0, 0, 0.4)',
},
});
}),
],