БЭМ с SASS и:hover
Как правильно объявлять активные / фокусирующие / парящие состояния, используя БЭМ с SASS? Например, у меня есть такая структура:
<div class="card">
<img class="card__image" src="..." alt="">
<div class="card__overlay">
<div class="card__title"></div>
</div>
</div>
И SCSS:
.card {
&__image {
}
&__overlay {
}
&__title {
}
}
И я хочу изменить элементы при наведении на блок. Это не работает:
.card {
&__overlay {
display: none;
}
&:hover {
&__overlay {
display: block;
}
}
}
И писать весь .project__image
только для этого один случай кажется неправильным.
Есть ли другой способ сделать это?
3 ответа
Вы можете достичь желаемого результата с помощью селектора амперсанд Sass, без использования переменных или интерполяции.
Ссылка на родительские селекторы с помощью амперсанда (&) может быть мощным инструментом, если используется правильно. Существуют простые способы использования этой функции, а также некоторые очень сложные варианты использования этой функции.
Например:
.card {
&__overlay {
display:none;
}
&:hover & {
&__overlay {
display: block;
}
}
}
Результаты в:
.card__overlay {
display: none;
}
.card:hover .card__overlay {
display: block;
}
Этот код использует меньше языковых конструкций (например, без использования переменных или интерполяции) и поэтому, возможно, является более чистой реализацией.
Узнайте больше об интерполяции: http://sass-lang.com/documentation/file.SASS_REFERENCE.html
SCSS:
.card {
$root: &;
&__overlay {
display: none;
#{$root}:hover & {
display: block;
}
}
}
РЕЗУЛЬТАТ:
.card__overlay {
display: none;
}
.card:hover .card__overlay {
display: block;
}
PS. Это похоже на сообщение @alireza safian, но таким образом вам не нужно дублировать имя класса. переменная $root
сделай это для себя:)
Альтернативный способ:
Используйте переменную вместо амперсанда для третьего уровня.
SASS:
$className: card;
.card {
&__overlay {
display: none;
}
&:hover {
.#{$className}__overlay {
display: block;
}
}
}
CSS:
.card__overlay {
display: none;
}
.card:hover .card__overlay {
display: block;
}