ViewEncapsulation — это механизм в Angular, который определяет, как стили компонента применяются к его шаблону и как они изолируются от других компонентов. Angular предоставляет три стратегии инкапсуляции, каждая из которых по-разному влияет на стилизацию.
@Component({
selector: 'app-example',
templateUrl: './example.component.html',
styleUrls: ['./example.component.css'],
encapsulation: ViewEncapsulation.Emulated
})
Особенности:
_ngcontent-c1
)@Component({
encapsulation: ViewEncapsulation.ShadowDom
})
Особенности:
::ng-deep
и подобные методы@Component({
encapsulation: ViewEncapsulation.None
})
Особенности:
Работают при любой инкапсуляции, но:
Emulated
и ShadowDom
нужно использовать :host
None
применяются как обычные CSS-правила/* Глобальный styles.css */
app-example {
display: block;
border: 1px solid #ccc;
}
/* example.component.css */
:host {
display: block;
padding: 20px;
}
:host(.active) {
background-color: #f0f0f0;
}
:host-context(.dark-theme) {
background-color: #333;
color: white;
}
::ng-deep .inner-element {
color: red;
}
/* или deprecated /deep/ и >>> */
Важно: ::ng-deep
считается устаревшим, но пока поддерживается. Альтернативы:
ViewEncapsulation.None
для конкретных стилей@mixin
в SCSS@Component({
selector: 'app-alert',
template: '<div class="alert">{{message}}</div>',
styles: [`
.alert {
padding: 15px;
border: 1px solid transparent;
}
:host(.error) .alert {
background-color: #f8d7da;
border-color: #f5c6cb;
}
`],
encapsulation: ViewEncapsulation.Emulated
})
@Component({
selector: 'app-counter',
template: `<button (click)="increment()">Count: {{count}}</button>`,
styles: [`
button {
background: #4CAF50;
color: white;
border: none;
padding: 10px 20px;
}
`],
encapsulation: ViewEncapsulation.ShadowDom
})
:host
и :host-context
для таргетинга на хост-элемент::ng-deep
- вместо него используйте CSS-переменные или миксиныПравильное использование ViewEncapsulation помогает создавать поддерживаемые и изолированные компоненты с предсказуемыми стилями.