Компонент Angular 6, применить css к классу, применяемому с привязкой к хосту?

Обычно я использую глобальный файл SCSS в своих приложениях, но сегодня я хотел ограничить область действия scss только моим компонентом.

Я установил класс для компонента через @HostBinding (из class.card).

Я могу стилизовать элементы внутри моего компонента, например caard-body, но как я могу применить переопределения к классу card этого компонента?

Другими словами, у меня на странице несколько карточек. У меня есть стили, которые я хочу применить только к этой карточке, чтобы она выглядела по-другому. Поэтому я хотел бы применить css, например

.card { background-color: violet; }

Так что фиолетовым только эта карта. Я хочу сделать этот CSS частью этого компонента, поэтому везде, где я его использую, он автоматически будет фиолетовой картой. (На самом деле я хочу большего, чем простая вещь, но вы поняли идею)

Мой компонент TS:

import { Component, Input, HostBinding } from '@angular/core';

@Component({
  selector: 'app-reviews',
  templateUrl: './reviews.component.html',
  styleUrls: ['./reviews.component.scss']
})
export class ReviewsComponent {
  @HostBinding('class.card')
  true;

  @Input()
  review;

  constructor() {}
}

Мой компонент SCSS:

.card-header {
  border: 0;
  color: #cf0989;
  font-family: 'Helvetica Neue', Arial, sans-serif;
  font-size: 2rem;
  font-weight: normal;
}

.card-body {
   ...
}

Мой компонент HTML:

<div class = "card-header">Testimonials</div>
<div class = "card-body">

  <div class = "review-image">
    <img class = "rounded-circle"
        alt = "{{review.acf.article_author.post_title}}"
        src = "{{review.acf.article_author.acf.image}}">
  </div>

  <div class = "review-content">
    <p class = "review">
      <span [innerHTML] = "review.content.rendered"></span>
    </p>
    <p class = "reviewer-name">{{review.acf.article_author.post_title}}</p>
  </div>

</div>

Селекторы в моем CSS для .card-body и .card-header работают нормально, но я не могу стилизовать этот .card. Добавление этого, например, ничего не делает:

.card { background-color: violet: }

Как я могу создать селекторы SCSS в файле SCSS компонента, которые также применимы к классу, примененному к компоненту через @HostBinding? Могу я? Нужно ли мне?

Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
0
0
857
1

Ответы 1

Похоже, мне нужно использовать :host, правильно?

:host {
  &.card {
    padding: 2rem;
  }
}

Вы можете это сделать, но, как правило, это не всегда лучшая практика, и по возможности ее следует избегать. Если стили, которые вы хотите применить, являются частью заботы самого этого компонента, я бы посоветовал вам добавить тег оболочки для вашего шаблона. <div class = "card">your card header and body tags</div>. Затем вы можете стилизовать его как обычно, без каких-либо уловок или обходных путей.

Xinan 17.10.2018 18:22

Другие вопросы по теме