Есть ли способ сохранить родительский селектор ($) как переменную в SCSS?

#css #sass

#css #sass

Вопрос:

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

 .mainNavigation__desktop__content {
  $mainNavigation: amp;; // save parent selector as variable
  display: flex;
  flex-direction: row;
  align-items: flex-start;
  justify-content: space-between;
  position: absolute;
  background: #fefefe;
  top: 100%;
  width: 100%;
  right: 0px;
  left: 0px;
  opacity: 0;
  pointer-events: none;
  visibility: hidden;
  transition: all 0.3s;
  margin: 0;
  z-index: 99;
  padding: 34px 120px 35px 120px;
  text-align: left;
  *:focus {
    // Access variable to make grandparent of child element visible
    $mainNavigation {
      border-bottom: 1px solid #d8d8d8;
      opacity: 1;
      visibility: visible;
      pointer-events: auto;
    }
  }
}
  

Однако мой сайт (Shopify preview) не загружается всякий раз, когда я пытаюсь сохранить родительский селектор (amp;) в переменной. Если я изменю эту переменную на что-либо другое, сайт загрузится без каких-либо проблем.

Я чего-то не понимаю? Я не могу получить доступ к родительскому селектору таким образом? Все примеры, которые я видел для сохранения родительского селектора в качестве переменной, показывают именно этот синтаксис.

Комментарии:

1. Вы не можете стилизовать родительский элемент на основе :focus состояния дочернего элемента в CSS или Sass. Вы можете стилизовать элемент A только на основе элемента B, если (B содержит A) или (B является родственным A и предшествует A).

2. @Sean ты не знаешь, есть ли какой-нибудь обходной путь? Или я должен просто использовать необработанный CSS?

3. Это также невозможно в CSS. Это просто не так, как работает CSS.

Ответ №1:

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

 #{$mainNavigation} {}
  

В любом случае, вы не можете создать родительский стиль, основанный на фокусировке дочерних элементов, используя этот метод, вы можете захотеть посмотреть на focus-within

Комментарии:

1. Большое спасибо! Я не знал о селекторе focus-within! Отсутствие интерполяции было опечаткой с моей стороны; страница по-прежнему не загружалась, даже если я удалил этот раздел кода и сохранил только ту часть, где я сохраняю родительский селектор в переменной. Мне все еще было бы очень интересно узнать, есть ли способ сохранить amp; в переменной.

2. Вы можете сохранить amp; в переменную в scss, хотя? Я делаю это постоянно. Вы получаете какие-либо ошибки компиляции? css-tricks.com/snippets/sass/caching-current-selector-sass