Краткое руководство по Tailwind
Это руководство поможет освоиться с Tailwind CSS, что позволит быстро создавать красивые, современные и анимированные веб-сайты. Мы создадим простое боковое навигационное меню, вдохновленное Discord
.
Что такое Tailwind CSS?
Tailwind CSS – это набирающий популярность CSS-фреймворк, позволяющий вносить изменения в оформление веб-сайтов и приложений, не покидая HTML-разметку (причем как в соответствующих файлах, так и в компонентах типа React
или Svelte
) и не используя тег <style>
.
Идея заключается в том, чтобы прописывать стили напрямую в директиву class
, а не под селекторами в CSS-файле. Это выглядит так:
<div class="flex justify-center font-bold text-red-400">Tailwind</div>
<div class="flex justify-center font-bold text-red-400">Tailwind</div>
Технически это похоже на применение inline-классов, когда вы описываете дизайн элемента внутри его тега. Например, так:
<div style="display: flex; justify-content: center; font-weight: 700; color: rgba(248, 113, 113, var(--tw-text-opacity));">Tailwind</div>
<div style="display: flex; justify-content: center; font-weight: 700; color: rgba(248, 113, 113, var(--tw-text-opacity));">Tailwind</div>
Но, как видите, в случае с inline-стилями кода становится намного больше, его тяжелее читать и трудно конфигурировать. Tailwind
решает эту и множество других проблем, упрощая стилизацию контента в ваших приложениях.
В основе Tailwind
лежат все те же классы и селекторы, только в больших масштабах и с заранее подготовленными правилами взаимодействия. Да, любое свойство в Tailwind
– это класс. Вот как это выглядит при конвертации в CSS
.
html-код:
<div class="flex justify-center flex-col border text-blue-200">Tailwind</div>
<div class="flex justify-center flex-col border text-blue-200">Tailwind</div>
css-код:
.flex \{ display: flex; }
.justify-center \{ justify-content: center; }
.flex-col \{ flex-direction: column; }
.border \{ border: 1px black solid; }
.text-blue-200 \{ --tw-text-opacity: 1; rgba(191, 219, 254, var(--tw-text-opacity)); }
.flex \{ display: flex; }
.justify-center \{ justify-content: center; }
.flex-col \{ flex-direction: column; }
.border \{ border: 1px black solid; }
.text-blue-200 \{ --tw-text-opacity: 1; rgba(191, 219, 254, var(--tw-text-opacity)); }
Установка
Для работы желательно установить расширение для VS Code - Tailwind CSS IntelliSense
Можете использовать любой JS-фреймворк по вашему выбору. В этом руководстве используется Create React App.
Создание навигационной панели а-ля Discord
Основной контейнер
Создайте строку flexbox, просто добавив класс flex
к родительскому элементу.
function App() {
return (
<div className="flex">
</div>
);
}
function App() {
return (
<div className="flex">
</div>
);
}
Позиционирование боковой панели
Объедините служебные классы Tailwind
для размещения боковой панели. При наведении курсора на каждый класс в VS Code
он будет отображать свои истинные значения CSS
.
const SideBar = () => {
return (
<div className="fixed top-0 left-0 h-screen w-16 m-0 flex flex-col bg-gray-900 text-white shadow-lg">
</div>
);
};
const SideBar = () => {
return (
<div className="fixed top-0 left-0 h-screen w-16 m-0 flex flex-col bg-gray-900 text-white shadow-lg">
</div>
);
};
Добавление кнопки со значками
Чтобы быстро добавить кнопку со значком на навигационную панель, установите react-icons
.
$ npm install react-icons
$ npm install react-icons
import { BsPlus, BsFillLightningFill } from 'react-icons/bs';
import { FaFire, FaPoo } from 'react-icons/fa';
const SideBar = () => {
return (
<div className="...">
<SideBarIcon icon={<FaFire size="28" />} />
<SideBarIcon icon={<BsPlus size="32" />} />
<SideBarIcon icon={<BsFillLightningFill size="20" />} />
<SideBarIcon icon={<FaPoo size="20" />} />
</div>
);
};
const SideBarIcon = ({ icon }) => (
<div className="sidebar-icon group">
{icon}
</div>
);
import { BsPlus, BsFillLightningFill } from 'react-icons/bs';
import { FaFire, FaPoo } from 'react-icons/fa';
const SideBar = () => {
return (
<div className="...">
<SideBarIcon icon={<FaFire size="28" />} />
<SideBarIcon icon={<BsPlus size="32" />} />
<SideBarIcon icon={<BsFillLightningFill size="20" />} />
<SideBarIcon icon={<FaPoo size="20" />} />
</div>
);
};
const SideBarIcon = ({ icon }) => (
<div className="sidebar-icon group">
{icon}
</div>
);
Создание пользовательских классов
Директива @apply
позволяет создавать пользовательские классы CSS
путем объединения классов Tailwind
.
@layer components {
.sidebar-icon {
@apply relative flex items-center justify-center
h-12 w-12 mt-2 mb-2 mx-auto shadow-lg
bg-gray-800 text-green-500
hover:bg-green-600 hover:text-white
rounded-3xl hover:rounded-xl
transition-all duration-300 ease-linear
cursor-pointer;
}
}
@layer components {
.sidebar-icon {
@apply relative flex items-center justify-center
h-12 w-12 mt-2 mb-2 mx-auto shadow-lg
bg-gray-800 text-green-500
hover:bg-green-600 hover:text-white
rounded-3xl hover:rounded-xl
transition-all duration-300 ease-linear
cursor-pointer;
}
}
Анимированные подсказки
Создание контейнера для всплывающих подсказок
Каждая кнопка со значком имеет дочерний класс для всплывающей подсказки.
const SideBarIcon = ({ icon, text = 'tooltip 💡' }) => (
<div className="sidebar-icon">
{icon}
<span class="sidebar-tooltip">{text}</span>
</div>
);
const SideBarIcon = ({ icon, text = 'tooltip 💡' }) => (
<div className="sidebar-icon">
{icon}
<span class="sidebar-tooltip">{text}</span>
</div>
);
.sidebar-tooltip {
@apply absolute w-auto p-2 m-2 min-w-max left-14
rounded-md shadow-md
text-white bg-gray-900
text-xs font-bold
transition-all duration-100 scale-0 origin-left;
}
.sidebar-tooltip {
@apply absolute w-auto p-2 m-2 min-w-max left-14
rounded-md shadow-md
text-white bg-gray-900
text-xs font-bold
transition-all duration-100 scale-0 origin-left;
}
Анимировние группы элементов
Создавайте группы для анимации дочернего элемента при изменении состояния родительского элемента.
Класс group
не работает с @apply
, поэтому его следует использовать явно.
const SideBarIcon = ({ icon, text = 'tooltip 💡' }) => (
<div className="sidebar-icon group">
{icon}
<span class="sidebar-tooltip group-hover:scale-100">{text}</span>
</div>
);
const SideBarIcon = ({ icon, text = 'tooltip 💡' }) => (
<div className="sidebar-icon group">
{icon}
<span class="sidebar-tooltip group-hover:scale-100">{text}</span>
</div>
);
Ссылки и дополнительная информация
Коментарии
Остались вопросы, появились идеи для обсуждения или просто хотите оставить отзыв? Буду рад любой обратной связи!
Вместо авторизации в приложении giscus , вы также можете оставлять комментарии непосредственно на GitHub, с которым связанна данная ветка комментариев.
Похожие записи
Доступ к Docker Hub
Обход блокировки досутпа к Docker Hub с помощью прокси-сервера
Комментарии в блоге с Giscus
Система комментариев на основе GitHub Discussions.