Создание сложных компонентов из ограниченного набора примитивных утилит.
Традиционно, когда вам нужно стилизовать что-то в сети, вы пишете CSS.
Использование традиционного подхода, когда для нестандартного дизайна требуется собственный CSS
У вас новое сообщение!
<div class="chat-notification">
<div class="chat-notification-logo-wrapper">
<img class="chat-notification-logo" src="/img/logo.svg" alt="ChitChat Logo">
</div>
<div class="chat-notification-content">
<h4 class="chat-notification-title">ChitChat</h4>
<p class="chat-notification-message">У вас новое сообщение!</p>
</div>
</div>
<style>
.chat-notification {
display: flex;
max-width: 24rem;
margin: 0 auto;
padding: 1.5rem;
border-radius: 0.5rem;
background-color: #fff;
box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
}
.chat-notification-logo-wrapper {
flex-shrink: 0;
}
.chat-notification-logo {
height: 3rem;
width: 3rem;
}
.chat-notification-content {
margin-left: 1.5rem;
padding-top: 0.25rem;
}
.chat-notification-title {
color: #1a202c;
font-size: 1.25rem;
line-height: 1.25;
}
.chat-notification-message {
color: #718096;
font-size: 1rem;
line-height: 1.5;
}
</style>
С Tailwind вы стилизуете элементы, применяя уже существующие классы непосредственно в Вашем HTML.
Использование служебных классов для создания пользовательского дизайна без написания CSS
У вас новое сообщение!
<div class="p-6 max-w-sm mx-auto bg-white rounded-xl shadow-md flex items-center space-x-4">
<div class="flex-shrink-0">
<img class="h-12 w-12" src="/img/logo.svg" alt="ChitChat Logo">
</div>
<div>
<div class="text-xl font-medium text-black">ChitChat</div>
<p class="text-gray-500">У вас новое сообщение!</p>
</div>
</div>
В приведенном выше примере мы использовали:
flex
, flex-shrink-0
и p-6
) для управления общей компоновкой карточки.max-w-sm
и mx-auto
) для ограничения ширины карточки и ее центрирования по горизонталиbg-white
, rounded-xl
и shadow-md
) для стилизации внешнего вида карточкиw-12
и h-12
) для изменения размера изображения логотипаspace-x-4
) для обработки расстояния между логотипом и текстомtext-xl
, text-black
, font-medium
и т.д.) для стилизации текста карточкиТакой подход позволяет нам реализовать полностью настраиваемый дизайн компонента без написания ни одной строчки пользовательского CSS.
Теперь я знаю, о чем вы думаете “это злодеяние, какой ужасный беспорядок!” И вы правы, это некрасиво. На самом деле практически невозможно подумать, что это хорошая идея, когда вы впервые ее видите - вы должны действительно попробовать.
Но как только вы действительно построите что-то таким образом, вы быстро заметите некоторые действительно важные преимущества:
sidebar-inner-wrapper
, просто чтобы иметь возможность стилизовать что-то, и больше не нужно мучиться над идеальным абстрактным именем для чего-то, что на самом деле является просто гибким контейнером.Когда вы поймете, насколько продуктивно вы можете работать исключительно в HTML с предопределенными служебными классами, работа любым другим способом будет казаться пыткой.
Обычная реакция на этот подход - спросить: “Разве это не просто встроенные стили?” и в некотором смысле это так - вы применяете стили непосредственно к элементам, вместо того, чтобы присваивать им имя класса, а затем стилизовать этот класс.
Но использование служебных классов имеет несколько важных преимуществ перед встроенными стилями:
Этот компонент полностью адаптивен и включает кнопку со стилями наведения и фокуса и полностью построен с использованием служебных классов:
Эрин Линдфорд
Инженер по продукту
<div class="py-8 px-8 max-w-sm mx-auto bg-white rounded-xl shadow-md space-y-2 sm:py-4 sm:flex sm:items-center sm:space-y-0 sm:space-x-6">
<img class="block mx-auto h-24 rounded-full sm:mx-0 sm:flex-shrink-0" src="/img/erin-lindford.jpg" alt="Woman's Face">
<div class="text-center space-y-2 sm:text-left">
<div class="space-y-0.5">
<p class="text-lg text-black font-semibold">
Эрин Линдфорд
</p>
<p class="text-gray-500 font-medium">
Инженер по продукту
</p>
</div>
<button class="px-4 py-1 text-sm text-purple-600 font-semibold rounded-full border border-purple-200 hover:text-white hover:bg-purple-600 hover:border-transparent focus:outline-none focus:ring-2 focus:ring-purple-600 focus:ring-offset-2">Сообщение</button>
</div>
</div>
Самая большая проблема с обслуживанием при использовании подхода, ориентированного на полезность, - это управление часто повторяющимися комбинациями утилит.
Это легко решить с помощью extracting components, обычно в виде частей шаблона или компонентов.
<!-- PrimaryButton.vue -->
<template>
<button class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">
<slot/>
</button>
</template>
Вы также можете использовать функцию Tailwind @apply
для создания абстракций CSS вокруг общих служебных шаблонов.
<!-- Использование утилит -->
<button class="py-2 px-4 font-semibold rounded-lg shadow-md text-white bg-green-500 hover:bg-green-700">
Нажми на меня
</button>
<!-- Извлечение классов с помощью @apply -->
<button class="btn btn-green">
Кнопка
</button>
<style>
.btn {
@apply py-2 px-4 font-semibold rounded-lg shadow-md;
}
.btn-green {
@apply text-white bg-green-500 hover:bg-green-700;
}
</style>
Кроме того, поддержка проекта CSS, ориентированного на служебные программы, оказывается намного проще, чем поддержка большой базы кода CSS, просто потому, что HTML намного проще поддерживать, чем CSS. Такие крупные компании, как GitHub, Heroku, Kickstarter, Twitch, Segment и другие, с большим успехом используют этот подход.
Если вы хотите узнать об опыте других, использующих этот подход, ознакомьтесь со следующими ресурсами:
Чтобы узнать больше, ознакомьтесь с Доводы в пользу атомарного/утилитного CSS, куратором которого является Джон Полачек.