Настройка того, какие варианты утилит включены в Вашем проекте.
В разделе variants Вашего файла tailwind.config.js вы определяете, какие варианты должны быть включены для каждого основного плагина:
// tailwind.config.js
module.exports = {
variants: {
extend: {
backgroundColor: ['active'],
// ...
borderColor: ['focus-visible', 'first'],
// ...
textColor: ['visited'],
}
},
}Каждое свойство - это имя основного плагина, указывающее на массив вариантов, которые нужно сгенерировать для этого плагина.
Из коробки поддерживаются следующие варианты:
| Вариант | Описание |
|---|---|
responsive | Адаптивные варианты, такие как sm, md, lg и xl. |
dark | Нацелен на темный режим. |
motion-safe | Нацелен на медиа выражение prefers-reduced-motion: no-preference. |
motion-reduce | Нацелен на медиа выражение prefers-reduced-motion: reduce. |
first | Нацелен на псевдокласс first-child. |
last | Нацелен на псевдокласс last-child. |
odd | Нацелен на псевдокласс odd-child. |
even | Нацелен на псевдокласс even-child. |
visited | Нацелен на псевдокласс visited. |
checked | Нацелен на псевдокласс checked. |
group-hover | Нацелен на элемент, когда отмеченный родительский элемент соответствует hover. |
group-focus | Нацелен на элемент, когда отмеченный родительский элемент соответствует focus. |
focus-within | Нацелен на псевдокласс focus-within. |
hover | Нацелен на псевдокласс hover. |
focus | Нацелен на псевдокласс focus. |
focus-visible | Нацелен на псевдокласс focus-visible. |
active | Нацелен на псевдокласс active. |
disabled | Нацелен на псевдокласс disabled. |
Для получения дополнительной информации о том, как работают варианты, прочтите нашу документацию по адаптивным вариантам, вариантам темного режима и hover, focus и другим вариантам состояния.
Если вы хотите включить дополнительные варианты для плагина в дополнение к настройкам по умолчанию, вы можете настроить свои варианты с помощью ключевого слова extend, аналогично тому, как вы можете использовать расширение внутри раздела theme:
// tailwind.config.js
module.exports = {
variants: {
// "Активный" вариант будет сгенерирован в дополнение к значениям по умолчанию.
extend: {
backgroundColor: ['active']
}
},
}Поскольку порядок вариантов важен, любые варианты, добавленные под ключом extend, автоматически упорядочиваются для вас с использованием разумного порядка вариантов по умолчанию. При необходимости вы можете настроить этот порядок с помощью параметра variantOrder.
Любые варианты, настроенные непосредственно под ключом options, переопределяют варианты по умолчанию для этого подключаемого модуля.
// tailwind.config.js
module.exports = {
variants: {
// Будут созданы только "активные" варианты
backgroundColor: ['active'],
},
}При переопределении вариантов по умолчанию убедитесь, что вы всегда указываете все варианты, которые хотите включить, а не только новые, которые вы хотите добавить.
Важно отметить, что при переопределении вариантов варианты создаются в указанном Вами порядке, поэтому варианты в конце списка будут иметь приоритет над вариантами в начале списка.
Например, здесь варианты focus имеют наивысший приоритет для утилит backgroundColor, а варианты hover имеют наивысший приоритет для утилит borderColor:
// tailwind.config.js
module.exports = {
variants: {
backgroundColor: ['hover', 'focus'],
borderColor: ['focus', 'hover'],
},
}/* Сгенерированный CSS */
.bg-black { background-color: #000 }
.bg-white { background-color: #fff }
/* ... */
.hover\:bg-black:hover { background-color: #000 }
.hover\:bg-white:hover { background-color: #fff }
/* ... */
.focus\:bg-black:focus { background-color: #000 }
.focus\:bg-white:focus { background-color: #fff }
/* ... */
.border-black { border-color: #000 }
.border-white { border-color: #fff }
/* ... */
.focus\:border-black:focus { border-color: #000 }
.focus\:border-white:focus { border-color: #fff }
/* ... */
.hover\:border-black:hover { border-color: #000 }
.hover\:border-white:hover { border-color: #fff }
/* ... */Это означает, что с учетом следующего HTML:
<input class="focus:bg-white hover:bg-black focus:border-white hover:border-black">…если бы вход был завис и одновременно сфокусирован, фон был бы белым, а граница была бы черной.
Создание вариантов таким образом дает вам максимальную гибкость как конечному пользователю, но это также острый инструмент и может иметь непредвиденные последствия, если вы не будете осторожны. Мы рекомендуем включить дополнительные варианты вместо того, чтобы переопределять значения по умолчанию, когда это возможно, и использовать эту функцию только как аварийный выход.
Вариант responsive - это особый случай в Tailwind, и на него не влияет порядок, который вы указываете в конфигурации вариантов.
Это связано с тем, что вариант responsive автоматически складывается с другими вариантами, а это означает, что если вы укажете для утилиты и responsive, и hover варианты , Tailwind также сгенерирует responsive hover варианты:
// tailwind.config.js
module.exports = {
variants: {
backgroundColor: ['responsive', 'hover'],
borderColor: ['responsive', 'focus'],
},
}Адаптивные варианты сгруппированы вместе и вставлены в конец Вашей таблицы стилей по умолчанию, чтобы избежать проблем со специфичностью, независимо от того, где в Вашем списке variants появляется responsive.
Если вы по какой-либо причине хотите настроить это поведение, вы можете использовать директиву @tailwind screens, чтобы указать, где должны быть вставлены адаптивные варианты.
Варианты dark, motion-safe и motion-reduce также складываются с другими вариантами, но, в отличие от responsive, они складываются в один и тот же «слот», так что вы можете комбинировать их как с responsive, так и с варианты простых состояний, но не друг с другом.
Порядок этих вариантов имеет значение относительно друг друга, но не относительно других вариантов. Практически невозможно представить себе ситуацию, в которой они могли бы конфликтовать друг с другом на практике, так что это в любом случае не является проблемой.
Вы можете включать эти варианты в любом порядке в конфигурацию variants и никогда не замечать разницы.
Вы можете использовать специальный вариант DEFAULT , чтобы указать, где генерируется обычная версия утилиты без префикса по сравнению с другими вариантами.
Это расширенная функция, которая действительно полезна только в том случае, если у вас есть собственный вариант (например, children в приведенном ниже примере), который должен иметь более низкий приоритет, чем обычная версия утилиты.
// tailwind.config.js
module.exports = {
variants: {
backgroundColor: ['children', 'DEFAULT', 'hover', 'focus'],
},
}/* Generated CSS */
.children\:bg-black > * { background-color: #000; }
.children\:bg-white > * { background-color: #fff; }
.bg-black { background-color: #000 }
.bg-white { background-color: #fff }
/* ... */
.hover\:bg-black:hover { background-color: #000 }
.hover\:bg-white:hover { background-color: #fff }
/* ... */
.focus\:bg-black:focus { background-color: #000 }
.focus\:bg-white:focus { background-color: #fff }
/* ... */Дополнительные сведения о создании пользовательских вариантов смотрите в документации по подключаемым модулям вариантов.
Если вы написали или установили плагин, который добавляет новый вариант, вы можете включить этот вариант, включив его в конфигурацию вариантов, как если бы это был встроенный вариант.
Например, плагин tailwindcss-interaction-variants добавляет вариант с group-disabled (среди прочего):
// tailwind.config.js
{
variants: {
backgroundColor: ['responsive', 'hover', 'focus', 'group-disabled'],
},
plugins: [
require('tailwindcss-interaction-variants'),
],
}Дополнительные сведения о создании пользовательских вариантов смотрите в документации по подключаемым модулям вариантов.
Если вы хотите указать позицию сортировки по умолчанию для настраиваемого варианта, переопределите свой вариант variantOrder, чтобы включить настраиваемый вариант:
// tailwind.config.js
module.exports = {
// ...
variantOrder: [
'first',
'last',
'odd',
'even',
'visited',
'checked',
'group-hover',
'group-focus',
'focus-within',
'hover',
'focus',
'focus-visible',
'active',
'group-disabled', // Custom variant
'disabled',
],
variants: {
extend: {
backgroundColor: ['group-disabled'],
}
}
}вам нужно будет указать весь список при переопределении variantOrder, чтобы включить любые пользовательские варианты.
Вот полный справочник по конфигурации вариантов Tailwind по умолчанию, который может быть полезен, если вы хотите добавить новый вариант с сохранением значений по умолчанию.
// Default configuration
module.exports = {
// ...
variants: {
accessibility: ['responsive', 'focus-within', 'focus'],
alignContent: ['responsive'],
alignItems: ['responsive'],
alignSelf: ['responsive'],
animation: ['responsive'],
appearance: ['responsive'],
backdropBlur: ['responsive'],
backdropBrightness: ['responsive'],
backdropContrast: ['responsive'],
backdropFilter: ['responsive'],
backdropGrayscale: ['responsive'],
backdropHueRotate: ['responsive'],
backdropInvert: ['responsive'],
backdropOpacity: ['responsive'],
backdropSaturate: ['responsive'],
backdropSepia: ['responsive'],
backgroundAttachment: ['responsive'],
backgroundBlendMode: ['responsive'],
backgroundClip: ['responsive'],
backgroundColor: ['responsive', 'dark', 'group-hover', 'focus-within', 'hover', 'focus'],
backgroundImage: ['responsive'],
backgroundOpacity: ['responsive', 'dark', 'group-hover', 'focus-within', 'hover', 'focus'],
backgroundPosition: ['responsive'],
backgroundRepeat: ['responsive'],
backgroundSize: ['responsive'],
backgroundOrigin: ['responsive'],
blur: ['responsive'],
borderCollapse: ['responsive'],
borderColor: ['responsive', 'dark', 'group-hover', 'focus-within', 'hover', 'focus'],
borderOpacity: ['responsive', 'dark', 'group-hover', 'focus-within', 'hover', 'focus'],
borderRadius: ['responsive'],
borderStyle: ['responsive'],
borderWidth: ['responsive'],
boxDecorationBreak: ['responsive'],
boxShadow: ['responsive', 'group-hover', 'focus-within', 'hover', 'focus'],
boxSizing: ['responsive'],
brightness: ['responsive'],
clear: ['responsive'],
container: ['responsive'],
contrast: ['responsive'],
cursor: ['responsive'],
display: ['responsive'],
divideColor: ['responsive', 'dark'],
divideOpacity: ['responsive', 'dark'],
divideStyle: ['responsive'],
divideWidth: ['responsive'],
dropShadow: ['responsive'],
fill: ['responsive'],
filter: ['responsive'],
flex: ['responsive'],
flexDirection: ['responsive'],
flexGrow: ['responsive'],
flexShrink: ['responsive'],
flexWrap: ['responsive'],
float: ['responsive'],
fontFamily: ['responsive'],
fontSize: ['responsive'],
fontSmoothing: ['responsive'],
fontStyle: ['responsive'],
fontVariantNumeric: ['responsive'],
fontWeight: ['responsive'],
gap: ['responsive'],
gradientColorStops: ['responsive', 'dark', 'hover', 'focus'],
grayscale: ['responsive'],
gridAutoColumns: ['responsive'],
gridAutoFlow: ['responsive'],
gridAutoRows: ['responsive'],
gridColumn: ['responsive'],
gridColumnEnd: ['responsive'],
gridColumnStart: ['responsive'],
gridRow: ['responsive'],
gridRowEnd: ['responsive'],
gridRowStart: ['responsive'],
gridTemplateColumns: ['responsive'],
gridTemplateRows: ['responsive'],
height: ['responsive'],
hueRotate: ['responsive'],
inset: ['responsive'],
invert: ['responsive'],
isolation: ['responsive'],
justifyContent: ['responsive'],
justifyItems: ['responsive'],
justifySelf: ['responsive'],
letterSpacing: ['responsive'],
lineHeight: ['responsive'],
listStylePosition: ['responsive'],
listStyleType: ['responsive'],
margin: ['responsive'],
maxHeight: ['responsive'],
maxWidth: ['responsive'],
minHeight: ['responsive'],
minWidth: ['responsive'],
mixBlendMode: ['responsive'],
objectFit: ['responsive'],
objectPosition: ['responsive'],
opacity: ['responsive', 'group-hover', 'focus-within', 'hover', 'focus'],
order: ['responsive'],
outline: ['responsive', 'focus-within', 'focus'],
overflow: ['responsive'],
overscrollBehavior: ['responsive'],
padding: ['responsive'],
placeContent: ['responsive'],
placeItems: ['responsive'],
placeSelf: ['responsive'],
placeholderColor: ['responsive', 'dark', 'focus'],
placeholderOpacity: ['responsive', 'dark', 'focus'],
pointerEvents: ['responsive'],
position: ['responsive'],
resize: ['responsive'],
ringColor: ['responsive', 'dark', 'focus-within', 'focus'],
ringOffsetColor: ['responsive', 'dark', 'focus-within', 'focus'],
ringOffsetWidth: ['responsive', 'focus-within', 'focus'],
ringOpacity: ['responsive', 'dark', 'focus-within', 'focus'],
ringWidth: ['responsive', 'focus-within', 'focus'],
rotate: ['responsive', 'hover', 'focus'],
saturate: ['responsive'],
scale: ['responsive', 'hover', 'focus'],
sepia: ['responsive'],
skew: ['responsive', 'hover', 'focus'],
space: ['responsive'],
stroke: ['responsive'],
strokeWidth: ['responsive'],
tableLayout: ['responsive'],
textAlign: ['responsive'],
textColor: ['responsive', 'dark', 'group-hover', 'focus-within', 'hover', 'focus'],
textDecoration: ['responsive', 'group-hover', 'focus-within', 'hover', 'focus'],
textOpacity: ['responsive', 'dark', 'group-hover', 'focus-within', 'hover', 'focus'],
textOverflow: ['responsive'],
textTransform: ['responsive'],
transform: ['responsive'],
transformOrigin: ['responsive'],
transitionDelay: ['responsive'],
transitionDuration: ['responsive'],
transitionProperty: ['responsive'],
transitionTimingFunction: ['responsive'],
translate: ['responsive', 'hover', 'focus'],
userSelect: ['responsive'],
verticalAlign: ['responsive'],
visibility: ['responsive'],
whitespace: ['responsive'],
width: ['responsive'],
wordBreak: ['responsive'],
zIndex: ['responsive', 'focus-within', 'focus']
}
}