Как использовать переменные в селекторе

С помощью .class & я могу добавить правила, добавляющие родительский класс к пути, но он всегда ставит этого родителя впереди всех родителей.

Есть ли способ добавить родителя где-то посередине.

Я попытался использовать переменную для этого следующим образом: Пример меньше:

@color: "";
.a {
  .b @color {
    .d {
      .e {
        font-size: 2em;
        color: black;
        @color: ".yellow";
        color: yellow;
        @color: ".red";
        color: red;
        @color: "";
      }
      .f {
        font-size: 1.2em;
      }
    }
  }
}

Ожидаемый результат:

.a .b .d .e {
  font-size: 2em;
  color: black;
}
.a .b .yellow .d .e {
  color: yellow;
}
.a .b .red .d .e {
  color: red;
}
.a .b .d .f {
  font-size: 1.2em;
}

Но это не сработало.

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
60
2

Ответы 2

Вы можете использовать переменную в качестве селектора:

@color: .yellow;
.a {
  .b @{color} {
    ...

Но это не будет работать в вашем примере, потому что переменные компилируются из последнего использования цепочки (вот почему вы можете повторно использовать переменную), а это означает, что .red никогда не будет заполняться там, где вы хотите (там же, как желтый, потому что он находится в последний размах)

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

@colors: cornflowerblue, green, red, yellow;

.a  {
  .b {
    each(@colors, {
      .@{value} .d {
        .e {
          color: @value;
        }
      }
    });
    .d .e { 
      font-size: 2em;
    }
    .d .f {
      font-size: 1.2em;
    }
  }
}

Вы можете нажать кнопку «Просмотреть скомпилированный css» в нижней части встроенного фрагмента или увидеть здесь

<p class = "codepen" data-height = "265" data-theme-id = "dark" data-default-tab = "css" data-user = "soulshined2" data-slug-hash = "ErBYOY" style = "height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;" data-pen-title = "ErBYOY">
  <span>See the Pen <a href = "https://codepen.io/soulshined2/pen/ErBYOY/">
  ErBYOY</a> by soulshined (<a href = "https://codepen.io/soulshined2">@soulshined2</a>)
  on <a href = "https://codepen.io">CodePen</a>.</span>
</p>
<script async src = "https://static.codepen.io/assets/embed/ei.js"></script>

Вариант использования довольно близок к различным «тематическим» вопросам, таким как:

т.е. существует множество возможных решений, каждое из которых имеет свои плюсы и минусы в зависимости от других деталей и целей вашего реального проекта.

---

Принимая ваш «ожидаемый результат» как есть, хорошим началом было бы написать миксин, который обрабатывает повторяющийся код, например:

#1

.a .b {
    .d .e {
        font-size: 2em;
        color: black;
    }
    .-(@color) {
        .@{color} .d .e {color: @color}  
    }
    .-(red);
    .-(yellow);
    .-(green);
    // etc.
}

---

С некоторыми хитростями и хакерами мы можем избавиться от .d .e повторений, но я сомневаюсь, что повышенная сложность и потенциальные проблемы того стоят:

#2

.a .b {
    .themed(~'.d .e', {
        font-size: 2em;
        color: black;
    }, {
        color: @color;
    });
}

// .....................
// generic "theme" impl.

.themed(@selector, @default, @colored) {
    .-(default);
    .-(red);
    .-(yellow);
    .-(green);

    .-(@color) {
         .@{color} @{selector}
             when (iscolor(@color)) {@colored();}
         @{selector}
             when not (iscolor(@color)) {@default();}
    }
}

---

Чтобы проиллюстрировать, что варианты возможной реализации для получения примера «ожидаемого результата» почти бесконечны и в основном зависят от того, с какими функциями Less вы знакомы и какие функции вы можете/хотите/хотите использовать, вот еще немного «Современных Пример Less», использующий более «традиционную»/«основную» логику (многие люди предпочтут использовать; требуется Less 3.x или выше):

#3

.a .b {
    .d .e {
        font-size: 2em;
        color: black;
    }
    each(red yellow green, {
        .@{value} .d .e {color: @value}
    });
}

(хотя то же самое уже было предложено в другом ответе).

---

Говоря об элементах .color в середине селектора, подумайте, действительно ли ваш HTML требует этого. т.е. действительно ли вам понадобятся такие селекторы сверхспецифичный, как:
.a .b .yellow .d .e,
.x .y .yellow .d .e,
.p .q .yellow .d .e,
.a .b .yellow .foo .e,
имеющие разные значения цвета?

Набора типа .yellow .e {color: yellow} или что-то в этом роде не будет достаточно?

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