Я реализую набор классов для каждой буквы слова и присваиваю каждому из них transition-delay, кратное позиции буквы.
Например:
<span class = "char1">H</span>
<span class = "char2">e</span>
<span class = "char3">l</span>
<span class = "char4">l</span>
<span class = "char5">o</span>
И тогда каждой букве будет присвоен transition-delay вот так:
.link:hover .char1 {
transition-delay: 15ms;
}
.link:hover .char2 {
transition-delay: 30ms;
}
.link:hover .char3 {
transition-delay: 45ms;
}
.link:hover .char4 {
transition-delay: 60ms;
}
Есть ли способ написать это более динамично? Сейчас я переписываю это с помощью React Styled Components, и мне интересно, есть ли способ использовать число, присутствующее в имени класса, для расчета задержки перехода. Так что должно быть только одно определение класса, а не несколько (поскольку я превращаю это в реагирующий компонент, и я не знаю, какой длины будет слово).
Вот как я представляю, как это работает в React:
const Link = styled.a`
...
.char${num} {
transition-delay: ${num*15}
}
`
Где num - целое положительное число
Как вы представляли себе использование переменных здесь? Вы собирались генерировать эти правила в цикле? Возможно, было бы лучше вообще убрать это из CSS и просто сделать это в своем скрипте.
@MáriusRak Я только что добавил правку 🙏🏼
Таким образом, вы можете сгенерировать строку, состоящую из правил классов, и использовать эту строку позже в css.






То, что вы хотите, на самом деле было бы невозможно со стандартными переменными CSS или, по крайней мере, нецелесообразно. Я бы рекомендовал использовать SCSS, и вы можете легко добавить SCSS в проект реагирования, если он еще не является частью вашего проекта.
Ваш код можно преобразовать в SCSS, чтобы он делал то, что вы хотите, и он выведет ваш точный код:
$delay: 15ms;
@for $i from 1 through 4 {
.link:hover .char#{$i} {
transition-delay: $delay;
}
//increment delay
$delay: $delay + $delay;
}
или
$delay: 15ms;
@for $i from 1 through 4 {
.link:hover .char#{$i} {
transition-delay: $delay * $i;
}
}
или, что более вероятно, вариант использования будет написан как таковой, чтобы вы могли писать стили для каждого селектора индивидуально.
.link {
// styles for `.link` go here
&:hover {
//styles for `.link:hover` go here
//Loop for all the `.link:hover .char*` elements
$delay: 15ms;
@for $i from 1 through 4 {
.char#{$i} {
transition-delay: $delay * $i;
}
}
}
}
Если вы хотите попробовать, вставьте его сюда, чтобы увидеть скомпилированный результат CSS: https://sass.js.org/
В зависимости от вашего подхода к стилю вы также можете использовать встроенные стили и JavaScript для динамического вычисления значений свойств CSS без SCSS. Вы можете сопоставить массив и использовать индекс для вычисления transitionDelay, если элемент в данный момент наведен:
const [hoverIndex, setHoverIndex] = React.useState(-1);
return (
<div>
{'hello'.split('').map((char, index) => {
const transitionStyles = hoverIndex === index ? {transitionDelay: `${(index+1) * 15}ms`} : {}
return <span onMouseEnter = {() => setHoverIndex(index)} onMouseLeave = {() => setHoverIndex(-1)} style = {transitionStyles}>{char}</span>
})
}
</div>
);
}
Вот пример с размером шрифта:
https://codesandbox.io/s/exciting-chaplygin-9czuhv?file=/src/App.js
Поскольку вы спросили, есть ли способ написать это более динамично, да, есть. Я не думаю, что вы можете сделать его полностью динамическим, используя только CSS, но я думаю, что вы можете пройти половину пути от того, где вы находитесь.
Вместо того, чтобы добавлять отдельный класс для каждого символа, есть, по крайней мере, способ использовать только один класс (показан ниже), используя селекторы псевдоклассов nth-child. Тогда все, на чем вам нужно сосредоточиться, это ваши селекторы CSS:
.link:hover > span:nth-child(1) {
transition-delay: 15ms;
}
.link:hover > span:nth-child(2) {
transition-delay: 30ms;
}
.link:hover > span:nth-child(3) {
transition-delay: 45ms;
}
.link:hover > span:nth-child(4) {
transition-delay: 60ms;
}<a href = "#" class = "link">
<span>H</span>
<span>e</span>
<span>l</span>
<span>l</span>
<span>o</span>
</a>
Отправьте также свой код реакции, но вы можете поместить что угодно в стилизованную строку, и библиотека соберет ее вместе, поэтому в основном ответ на ваш вопрос: да, вы можете.