Можно ли иметь переменную в имени класса CSS?

Я реализую набор классов для каждой буквы слова и присваиваю каждому из них 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 - целое положительное число

Отправьте также свой код реакции, но вы можете поместить что угодно в стилизованную строку, и библиотека соберет ее вместе, поэтому в основном ответ на ваш вопрос: да, вы можете.

Márius Rak 21.04.2023 16:38

Как вы представляли себе использование переменных здесь? Вы собирались генерировать эти правила в цикле? Возможно, было бы лучше вообще убрать это из CSS и просто сделать это в своем скрипте.

isherwood 21.04.2023 16:40

@MáriusRak Я только что добавил правку 🙏🏼

Alex Hoggett 21.04.2023 16:48

Таким образом, вы можете сгенерировать строку, состоящую из правил классов, и использовать эту строку позже в css.

Márius Rak 21.04.2023 17:32
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
0
4
73
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Да, переменные CSS теперь существуют, и вы также можете использовать такие фреймворки, как SCSS (мой любимый) или LESS!

То, что вы хотите, на самом деле было бы невозможно со стандартными переменными 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>

Другие вопросы по теме