Как переопределить стили Angular material с помощью global styles.css, избегая !important?

#css #angular-material #material-design #angular7

#css #angular-material #материал-дизайн #angular7

Вопрос:

В моем приложении angular 7 я использую material design. В моем файле global styles.css у меня есть некоторый стиль для компонентов материала, а именно для значков mat. Однако мои настройки переопределяются собственным стилем material.

Использование !important, очевидно, работает, но я думаю, что есть более естественный способ, я просто не могу в нем разобраться. В chrome dev tools мой селектор классов CSS просто отображается под селектором material design, и я думаю, это означает, что он просто был применен раньше, и, таким образом, material style имеет приоритет, поскольку они оба являются селекторами классов и должны иметь одинаковый приоритет (во всяком случае, я так понимаю).

Соответствующая запись из styles.css:

 .icon {
  display: inline-block;
  height: 30px;
  width: 30px;
  margin: 0 auto;
  text-align: center;
  vertical-align: middle;
}
  

Как это отображается в chrome dev tools:

 .mat-icon {
    background-repeat: no-repeat;
    display: inline-block;
    fill: currentColor;
    height: 24px;
    width: 24px;
}

.icon {
    height: 30px;
    width: 30px;
    margin: 0 auto;
    text-align: center;
    vertical-align: middle;
}
  

Ширина и высота просто зачеркнуты в моем стиле .icon.

Как я могу установить приоритет в моей таблице стилей? Могу ли я каким-либо образом указать порядок загрузки таблиц стилей или явно сообщить angular, что я хочу, чтобы мои стили заменяли стили материалов?

РЕДАКТИРОВАТЬ: добавлен HTML, где значки mat:

 <mat-toolbar color="primary">
  <div fxFlex fxLayout>
    <mat-toolbar-row fxFlex fxLayout fxLayoutGap="20px" class="navigation-items icon-group">
      <span>
        <a routerLink="/">
          <mat-icon class="icon">home</mat-icon>
          <span class="label">Home</span>
        </a>
      </span>
      <span>
        <a routerLink="/product">
          <mat-icon class="icon">bubble_chart</mat-icon>
          <span class="label">Product</span>
        </a>
      </span>
      <span>
        <a routerLink>
          <mat-icon class="icon">widgets</mat-icon>
          <span class="label">Expedition</span>
        </a>
      </span>
      <span class="spacer"></span>
      <span>
        <a routerLink (click)="logout()">
          <mat-icon class="icon">input</mat-icon>
          <span class="label">LogOut</span>
        </a>
      </span>
    </mat-toolbar-row>
  </div>
</mat-toolbar>
  

Ответ №1:

Это специфическая проблема. Вы можете изменить класс mat-icon напрямую, использовать id, который имеет более высокую специфичность, или использовать комбинированный селектор, такой как

 .icon-group > .icon
  

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

1. Изменяя класс mat-icon напрямую, вы имеете в виду простое изменение моего класса .icon на .mat-icon для добавления желаемых свойств? Это не сработало, я пытался. Кроме того, я обновил вопрос с помощью примера HTML, поскольку я понятия не имею, как использование дочернего селектора могло бы мне помочь. Куда мне поместить класс icon-group?

2. В вашем случае вы должны быть в состоянии сделать это либо с помощью a > .icon , либо a > mat-icon

3. Это сделало свое дело. Итак, комбинированные селекторы более специфичны, чем обычные селекторы классов? Я прочитал кое-что по этой теме, но это правило нигде не упоминалось. Спасибо.