Sass.scss: Nesting и несколько классов?

Я использую Sass (.scss) для моего текущего проекта.

Следующий пример:

HTML

<div class="container desc">
    <div class="hello">
        Hello World
    </div>
</div>

SCSS

.container {
    background:red;
    color:white;

    .hello {
        padding-left:50px;
    }
}

Это отлично работает.

Можно ли обрабатывать несколько классов при использовании вложенных стилей.

В приведенном выше примере я говорю об этом:

CSS

.container.desc {
    background:blue;
}

В этом случае все div.container будут обычно red, но div.container.desc будет синим.

Как я могу вставить это внутри container с помощью Sass?

Ответ 1

Вы можете использовать ссылку родительский селектор &, после компиляции он будет заменен родительским селектором:

В вашем примере:

.container {
    background:red;
    &.desc{
       background:blue;
    }
}

/* compiles to: */
.container {
    background: red;
}
.container.desc {
    background: blue;
}

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

Эта нотация чаще всего используется для записи псевдоэлементов и классов:

.element{
    &:hover{ ... }
    &:nth-child(1){ ... }
}

Однако вы можете поместить & практически в любую позицию, которая вам нравится * поэтому возможно следующее:

.container {
    background:red;
    #id &{
       background:blue;
    }
}

/* compiles to: */
.container {
    background: red;
}
#id .container {
    background: blue;
}

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

*: перед символом & не допускается никаких других символов, кроме пробелов. Таким образом, вы не можете выполнить прямую конкатенацию selector + & - #id&, чтобы вызвать ошибку.

Ответ 2

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

SCSS

.container {
  background: red;

  &--desc {
    background: blue;
  }

  // or you can do a more specific name
  &--blue {
    background: blue;
  }

  &--red {
    background: red;
  }
}

CSS

.container {
  background: red;
}

.container--desc {
  background: blue;
}

.container--blue {
  background: blue;
}

.container--red {
  background: red;
}

Приведенный выше код основан на методологии BEM в соглашениях об именах классов. Вы можете проверить эту ссылку: BEM - Методика модификатора элемента блока