Подтвердить что ты не робот

Sass, объединяющий родителя с использованием амперсанда (&) с базовым элементом

У меня возникают проблемы с гнездом в Сасс. Скажем, у меня есть следующий HTML:

<p href="#" class="item">Text</p>
<p href="#" class="item">Text</p>
<a href="#" class="item">Link</a>

Когда я пытаюсь вложить свои стили в следующее, я получаю компиляционную ошибку:

.item {
    color: black;
    a& {
        color:blue;
   }
}

Как связать базовый элемент перед родительским селектором, когда он является частью одного и того же элемента?

4b9b3361

Ответ 1

Как указывает Кумар, это было возможно, так как Sass 3.3.0.rc.1 (Maptastic Maple).

Директива @at-root вызывает исключение одного или нескольких правил в корневом каталоге документа, а не вложенных под родительскими селекторами.

Мы можем объединить директиву @at-root вместе с интерполяция #{}, чтобы достичь намеченного результата.

SASS

.item {
    color: black;
    @at-root {
        a#{&} {
            color:blue;
        }
    }
}

// Can also be written like this.
.item {
    color: black;
    @at-root a#{&} {
        color:blue;
    }
}

Вывод CSS

.item {
    color: black;
}
a.item {
    color: blue;
}

Ответ 2

Метод @at-root -only не решит проблему, если вы намерены расширить ближайший селектор вверх по цепочке. В качестве примера:

#id > .element {
    @at-root div#{&} {
        color: blue;
    }
}

Скомпилирует для:

div#id > .element {
    color: blue;
}

Что делать, если вам нужно присоединить свой тег к .element вместо #id?

Там функция в Sass называется selector-unify(), которая решает это. Используя это с @at-root, можно настроить таргетинг на .element.

#id > .element {
    @at-root #{selector-unify(&, div)} {
        color: blue;
    }
}

Скомпилирует для:

#id > div.element {
    color: blue;
}

Ответ 3

Для начала (во время написания этого ответа) нет синтаксиса sass, который использует селектор &. Если вы собираетесь делать что-то подобное, вам понадобится пространство между селектором и амперсандом. Например:

.item {
    .helper & {

    }
}

// compiles to:
.helper .item {

}

Другой способ использования амперсанда - это, вероятно, то, что вы (неправильно) ищете:

.item {
    &.helper {

    }
}

// compiles to:
.item.helper {

}

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

Вы можете просто переосмыслить, как вы пишете свой CSS. Есть ли родительский элемент, который вы могли бы использовать?

<div class="item">
    <p>text</p>
    <p>text</p>
    <a href="#">a link</a>
</div>

Таким образом, вы можете легко написать свой SASS следующим образом:

.item {
    p {
        // paragraph styles here
    }
    a {
        // anchor styles here
    }
}

(Боковое примечание: вы должны взглянуть на свой html. Вы смешиваете одиночные и двойные кавычки и помещаете атрибуты href в теги p.)

Ответ 4

Эта функция приземлилась в новейшей версии Sass, 3.3.0.rc.1 (Maptastic Maple)

Двумя тесно связанными функциями, которые вам понадобятся, являются скриптовые &, которые вы можете интерполировать внутри вложенных стилей для ссылки на родительские элементы и директиву @at-root, которая помещает сразу следующий селектор или блок css в корне (у него не будет родителей в выпуске css)

Подробнее см. Github для более подробной информации