Селектор правил SASS/SCSS @extend

У меня небольшая проблема с правилом @extend, вот что я получил (сфокусируйтесь на h1):

.content-header {
    // CSS properties
    h1 {
        // CSS properties
    }
}

.box-header {
    // CSS properties
    h1 {
        @extend .content-header h1; // My selector problem!
        // And his own CSS properties
    }
}

Итак, это будет:

.content-header h1, .box-header h1 {
    /* Happily sharing the same CSS properties */
}

Но похоже, что @extend не нравится, это любой другой способ записать это, не давая h1 a class??

Ответы

Ответ 1

Вложенные селекторы не могут быть расширены - на самом деле это синтаксическая ошибка, о которой сообщает синтаксический анализатор. Структурные комментарии в сторону (я не могу придумать сценарий, где указанная связь @extend оправдана), это не то, что может быть выполнено в настоящее время с помощью SASS.

NB: это поддерживается, однако, Stylus, если вы открыты для него.

Ответ 2

Очевидное решение, которое должно было бы определить новый @mixin your-name для ваших .content-header h1 определений и @include your-name внутри .box-header h1.

Но есть гораздо лучшее решение Ссылка на родительские селектора: &:

h1 {
    .content-header &,
    .box-header & {
        // CSS properties
    }
    .box-header & {
        // And his own CSS properties
    }
}

Это не очевидно, потому что логика обратная, но лучше ее поддерживать. Вы изменяете определения h1 для конкретного селектора.

Ответ 3

Вложенная @extend не разрешена. Попробуйте это для работы вокруг

.foo {
  background-color: lime;    
}
.b{
  margin:0px;
}
.baz {
  @extend .foo;
  @extend .b;
}

Некоторая вещь, которую я построил для использования моим персоналом ниже, чтобы делиться со всеми вами. Это динамически создает селектор. Поскольку специальные символы не допускаются в соглашениях об именах, я использовал "-" для разделения класса

$ih-classes: ( "module--cardContainer--header",
                "a"
              );
  %module--cardContainer--header {
    color: #1e1d1c;
    background-color: #fff;
    border-bottom: 0.0714rem solid #e0dddc;
    padding: 0;
    line-height: 3.1429rem;
    font-size: 1.2857rem;
    font-family: ProximaNovaSemiBold;
}
%a{
  color:red;
}

@function str-replace($string, $search, $replace: '') {
  $index: str-index($string, $search);

  @if $index {
    @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);
  }

  @return $string;
}
@mixin generate-framework-code() {

              @each  $icon in $ih-classes {
               $val : str-replace($icon, '--', ' .');
                  .#{$val} {
                            @extend %#{$icon};
                         }
                  }
}

@include generate-framework-code();

Удачи!!