Динамическое вложение классов CSS в SASS

Я пытаюсь создать динамически вложенные классы в SASS. Я использую React 18 и SASS 1.62 (Craco).

У меня есть файл scss, который должен выглядеть так

.gridRow.scss

.root {
  &.row-cols-auto>* {
    flex: 0 0 auto;
    width: auto;
  }

  &.row-cols-1>* {
    flex: 0 0 auto;
    width: 100%;
  }

  &.row-cols-2>* {
    flex: 0 0 auto;
    width: 50%;
  }

  &.row-cols-3>* {
    flex: 0 0 auto;
    width: 33.3333333333%;
  }

  &.row-cols-4>* {
    flex: 0 0 auto;
    width: 25%;
  }

  &.row-cols-5>* {
    flex: 0 0 auto;
    width: 25%;
  }

  &.row-cols-6>* {
    flex: 0 0 auto;
    width: 16.6666666667%;
  }
}

Я хочу динамически создавать все эти классы CSS. Для этого я написал следующий миксин:

$grid-row-columns: 6;

@mixin create-row-cols () {
  &.row-cols-auto>* {
    flex: 0 0 auto;
    width: auto;
  }

  @for $i from 1 through $grid-row-columns {
    &.row-cols-#{$i}>* {
      flex: 0 0 auto;
      width: math.percentage(math.div(1, $i));
    }
  }
}

Тем не менее, когда я использую миксин как:

.root {
 @include create-row-cols()
}

Это не работает.

Кто-нибудь знает, как это исправить? У меня сейчас нет идей. Спасибо.

Я попытался жестко закодировать значения, которые сработали.

Я попытался проверить связанный файл css, но не смог его найти, возможно, взглянув на него, вы увидите, что он на самом деле создан.

Я попытался реорганизовать функцию миксина, чтобы найти опечатки, но не смог их найти.

Приемы 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
0
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Я думаю, что причина, по которой это не сработало, заключается в том, что ваша версия SASS немного низковата. Попробуйте обновить, может решить проблему.

Или другое решение: используйте width: math.percentage(1/$i); вместо width: math.percentage(math.div(1, $i));.

Ниже мой тест:

Моя sass-версия:

Дарт-сасс это:

И это работает.

Так что я все еще считаю, что ваша версия sass недостаточно высока.

На самом деле Sass обновлен до последней версии, и использование деления без math.div вызывает предупреждение в линтере

Jonatan Kruszewski 24.04.2023 11:05

@JonatanKruszewski Я добавил несколько скриншотов моей тестовой среды. Вы можете проверить на своей стороне.

Jason Li 25.04.2023 03:51

Спасибо Джейсон. Теперь, когда я вижу, что у вас все работает нормально, я проверю некоторые другие элементы в среде. Я мог что-то еще упустить.

Jonatan Kruszewski 25.04.2023 12:32

Спасибо, Джейсон, как вы сказали, все работало нормально. Проблема заключалась в обработке className. Это была не та версия.

Jonatan Kruszewski 25.04.2023 15:28

В конечном итоге проблема была не в SCSS, а в файле реакции. Это не попало в цель из-за неправильной обработки classNames.

Пример фиксированного компонента:

const Row = React.forwardRef(({
  as: Component,
  className,
  rowCols,
  g,
  gx,
  gy, 
  children,
  ...props
}, ref) => {

    // parse possible {XS: 4, ...} to {GridRow-row-cols-xs-4: 4, ...}
  const mappedRowCols = _.isObject(rowCols) ?
    _.mapKeys(rowCols, (value, key) => [styles[`row-cols-${_.toLower(key)}-${value}`]]) :
    rowCols && {[styles[`row-cols-${rowCols}`]]: rowCols};

  const mappedGutters = _.isObject(g) ?
    _.mapKeys(g, (value, key) => [styles[`g-${_.toLower(key)}-${value}`]]) :
    g && {[styles[`g-${g}`]]: g};

  const mappedGuttersX = _.mapKeys(gx, (value, key) => [styles[`gx-${_.toLower(key)}-${value}`]]);
  const mappedGuttersY = _.mapKeys(gy, (value, key) => [styles[`gy-${_.toLower(key)}-${value}`]]);

  return (
    <Component
      ref = {ref}
      {...props}
      className = {classNames(
        styles.root,
        mappedGuttersX,
        mappedGuttersY,
        mappedGutters,
        mappedRowCols,
        className)}
    >
      {children}
    </Component>
  );
});

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