Кутовий 2: Як стилізувати хост-елемент компонента?


189

У мене є компонент у Angular 2, який називається my-comp:

<my-comp></my-comp>

Як один стиль є головним елементом цього компонента в куті 2?

У полімері ви використовуєте селектор ": host". Я спробував це в Angular 2. Але це не працює.

:host {
  display: block;
  width: 100%;
  height: 100%;
}

Я також спробував використовувати компонент як селектор:

my-comp {
  display: block;
  width: 100%;
  height: 100%;
}

Обидва підходи, схоже, не спрацьовують.

Дякую.


2
Ви впевнені, що стиль не застосовується? Я зробив базовий проект і зробив саме це, і це спрацювало. Я встановив my-selector { color : red}у своєму css, і він прекрасно працює.
Пакан

1
Що стосується бета-версії 7, для мене працює селектор хостів:.
Джон Свонсон

Відповіді:


285

Була помилка, але її тим часом виправили. :host { }працює нормально зараз.

Також підтримуються

  • :host(selector) { ... }для selectorвідповідності атрибутів, класів, ... на хост-елементі
  • :host-context(selector) { ... }для selectorвідповідності елементів, класів, ... на батьківських компонентах

  • selector /deep/ selector(псевдонім selector >>> selectorне працює з SASS), щоб стилі відповідали межам елементів

    • ОНОВЛЕННЯ: SASS застаріло /deep/.
      Кутова (TS і Dart) додана ::ng-deepяк заміна, яка також сумісна з SASS.

    • UPDATE2: ::slotted ::slotted тепер підтримується всіма новими браузерами і може використовуватися з `ViewEncapsulation.ShadowDom
      https://developer.mozilla.org/en-US/docs/Web/CSS/::slotted

Дивіться також Завантаження зовнішнього стилю css у компонент Angular 2 Component

/deep/і на >>>них не впливають ті самі селекторні комбінатори, що і в Chrome, які застаріли.
Кутовий імітує (переписує) їх, тому не залежить від браузерів, які їх підтримують.

Це також пояснює , чому /deep/і >>>не працюють з , ViewEncapsulation.Nativeщо дозволяє рідний тіньову DOM і залежить від підтримки браузера.


@Component({selector: 'some-selector', template: 'xxx', styles: [':host { display: block; background-color: green; border: solid 1px red; }']}) export class SomeClass {}
Гюнтер Зехбауер

@ OndraŽižka Ви можете детальніше розробити? Це чистий CSS, як він може бути невідповідним CSS і собі?
Günter Zöchbauer

Якщо я не пропустив важливий зсув у CSS, / deep / та >>> не є CSS.
Ondra Žižka

Вони застарілі, але це не має значення. Вони імітуються Angular (переписані), тому вони працюють лише з ViewEncapsularion.Emulated(за замовчуванням), але не з Native.
Günter Zöchbauer

У Angular 2.4.7 я можу приступити :host { p { font-size: 80%; } }до роботи у файлі ... компонент.css. Як тільки я намагаюся використовувати його з styles: [:host { p { font-size: 80%; } }]ним, більше не працює. Дуже дивно.
Мартін

39

Я знайшов рішення, як стилізувати лише складовий елемент. Я не знайшов жодної документації, як вона працює, але ви можете помістити значення атрибутів у директиву компонента під властивістю "host" на зразок цього:

@Component({
    ...
    styles: [`
      :host {
        'style': 'display: table; height: 100%',
        'class': 'myClass'
      }`
})
export class MyComponent
{
    constructor() {}

    // Also you can use @HostBinding decorator
    @HostBinding('style.background-color') public color: string = 'lime';
    @HostBinding('class.highlighted') public highlighted: boolean = true;
}

ОНОВЛЕННЯ: Як згадував Гюнтер Зехбауер, виникла помилка, і тепер ви можете стилізувати хост-елемент навіть у файлі css, як це:

:host{ ... }

1
Мені це подобається краще, ніж створювати фіктивний .root елемент, але мені не подобається, що він встановлює ці стилі як вбудовані (змушує a !importantпереосмислювати). Там повинен бути кращий waayy: \
Scrimothy

4
немає, укладання з допомогою host{}в stylesUrlфайлі не працює. потреби :host.
phil294

як ми можемо отримати доступ до змінної компонента всередині хоста? Якщо я хочу вирішити колір фону динамічно? ': хост {background-color: this.bgColor; } '
Пратап АК

@ PratapA.K Привіт, ви можете використовувати дероратор HostBinding. Прикладом ви будете: @HostBinding('style.background-color') private color = 'lime'; Google знайде вам багато прикладів та статей.
преспіш

11

Перевірте цю проблему . Я думаю, що помилка буде вирішена, коли буде реалізована нова логіка докомпіляції шаблонів . На даний момент я думаю, що найкраще, що ви можете зробити, - це загортати шаблон <div class="root">і стилювати це div:

@Component({ ... })
@View({
  template: `
    <div class="root">
      <h2>Hello Angular2!</h2>
      <p>here is your template</p>
    </div>
  `,
  styles: [`
    .root {
      background: blue;
    }
  `],
   ...
})
class SomeComponent {}

Дивіться цей планкер


9

У своєму компоненті ви можете додати .class до свого хост-елемента, якщо у вас є загальні стилі, які ви хочете застосувати.

export class MyComponent{
     @HostBinding('class') classes = 'classA classB';

6

Для тих, хто хоче стилізувати дочірні елементи :hostсюди, є прикладом використання::ng-deep

:host::ng-deep <child element>

напр :host::ng-deep span { color: red; }

Як говорили інші, /deep/це застаріло


4

Спробуйте: host> / deep /:

Додайте наступне до файлу parent.component.less

:host {
    /deep/ app-child-component {
       //your child style
    }
}

Замініть компонент додаток-довідник дитиною, що вибирається


Що робити, якщо ви хочете, щоб таблиця стилів, як завантажувальна програма, була замість одного стилю?
Адітя Вікас Деварапаллі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.