Angular 2: Как стиль элемента хоста компонента?
У меня есть компонент в Angular 2, называемый my-comp:
<my-comp></my-comp>
Как стилизовать элемент хоста этого компонента в Angular 2?
В Polymer вы будете использовать селектор ": host". Я попробовал его в Angular 2. Но он не работает.
:host {
display: block;
width: 100%;
height: 100%;
}
Я также попытался использовать компонент в качестве селектора:
my-comp {
display: block;
width: 100%;
height: 100%;
}
Оба подхода не работают.
Спасибо.
Ответы
Ответ 1
Появилась ошибка, но она была исправлена тем временем. :host { }
теперь отлично работает.
Также поддерживаются
-
:host(selector) { ... }
для selector
для соответствия атрибутам, классам... на элементе хоста
-
:host-context(selector) { ... }
для selector
для соответствия элементам, классам,... на родительских компонентах
-
selector /deep/ selector
(псевдоним selector >>> selector
не работает с SASS) для стилей, сопоставляемых границам элементов
- ОБНОВЛЕНИЕ: SASS осуждает
/deep/
.
Angular (TS и Dart) добавили ::ng-deep
в качестве замены, которая также совместима с SASS.
См. также Загрузите внешний CSS-стиль в Angular 2 Компонент
/deep/
и >>>
не соответствуют теми же комбинаторами селекторов, что и в Chrome, которые устарели.
Angular эмулирует (переписывает) их и, следовательно, не зависит от браузеров, поддерживающих их.
Вот почему /deep/
и >>>
не работают с ViewEncapsulation.Native
, который позволяет создавать собственные DOM теневого пространства и зависит от поддержки браузера.
Ответ 2
Я нашел решение, как стилизовать только элемент компонента. Я не нашел никакой документации, как это работает, но вы можете поместить значения атрибутов в директиву компонента под свойством "host" следующим образом:
@Component({
...
styles: ['''
:host {
'style': 'display: table; height: 100%',
'class': 'myClass'
}'''
})
export class MyComponent
{
constructor()
{}
}
UPDATE:
Как упоминал Гюнтер Цохбауэр, произошла ошибка, и теперь вы можете стилизовать элемент хоста даже в файле css, например:
:host{ ... }
Ответ 3
Отметьте эту проблему. Я думаю, что ошибка будет решена, когда будет реализована новая логика прекомпиляции шаблона. На данный момент я думаю, что лучшее, что вы можете сделать, это обернуть ваш шаблон в <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 {}
Смотрите этот плункер
Ответ 4
В вашем Компоненте вы можете добавить .class к вашему элементу хоста, если у вас будут какие-то общие стили, которые вы хотите применить.
export class MyComponent{
@HostBinding('class') classes = 'classA classB';
Ответ 5
Для тех, кто ищет стиль дочерних элементов :host
, приведен пример использования ::ng-deep
:host::ng-deep <child element>
e.g :host::ng-deep span { color: red; }
Как говорили другие, /deep/
устарел
Ответ 6
Попробуйте: host > /deep/:
Добавьте в файл parent.component.less следующее
:host {
/deep/ app-child-component {
//your child style
}
}
Заменить дочерний компонент app-child на ваш дочерний селектор