What is the use case of :host-context selector in angular
This answer explains the difference between host
and host-context
. Here is an example of host-context
usage. Suppose you have a component that wraps an input and this input can be used inside two different components - table and dropdown. When inside a dropdown it should occupy 50% of the width, when in table - 100%. Now if you have these two components selectors defined like this:
<my-dropdown>
<my-table>
Then the styles for the input component can be defined like this:
:host-context(my-dropdown) input { width: 50% }
:host-context(my-table) input { width: 100% }
What is the different between :host ,:host() ,:host-context selectors
:host
Is syntax for styling the host component.
:host(.element)
Is an experimental CSS pseudo-class function that selects the shadow host of the shadow DOM containing the CSS it is used inside
(Reference)
:host-context
Is syntax for styling a specific class anywhere outside the current element. The class must already be applied to an element outside the scope of the current element.
More in-depth info on the context of Angular applications can be found in this blog post.
How to use :host-context selector in an ngClass condition?
In angular you should not make any logical decisions in the code based on the html content properties such as classes or attributes, but vice versa - you should render classes and attributes in html based on data bindings. That's the main idea of angular - rendering view based on data bindings. Component's code should not really care too much about view structure.
So, in this case if your class should be based on some external information you need to @Import() that data through data bindings into your component and then use component properties in the ngClass directive. Yes, it moves logic into the component instead of html/css, but that's where it's supposed to be anyway: in the model/controller code, not in the view markup. Also, this way it will be much more convenient to test such a component.
Cannot Understand the Use of :host in components in Angular2
What i have understood of host is that if i have a child component
inside a parent component and we want to style a child component from
the parent component we can use :host . and :host-context for
vice-versa
No, this is not what it used for.
:host
selector comes from shadow DOM spec.
...This scoped subtree is called a shadow tree. The element it's
attached to is its shadow host.
In angular world, a component's template is a shadow tree. The component's element is a shadow host. So when you're defining styles for :host
selector, the styles are applied to the component's element.
:host
In your example, if you defined styles in my-app
component, the styles will be applied to <my-app>
DOM element. This particular configuration:
:host(.mine){
color:red;
}
Will be applied to the host element that has .mine
class:
<my-app class="active">
If you defined styles in app-ngrx
component, the styles will be applied to <app-ngrx>
DOM element, NOT <my-app>
. This particular configuration:
:host(.mine){
color:red;
}
Will be applied to the host element that has .mine
class:
<app-ngrx class="active">
:host-context
Now, :host-context
is also applied to the host element, but the function (parenthesis) takes a selector that is checked not against the host element itself, but against all ancestors up to document root. If such element is found, the styles are applied.
For example, this selector
:host(.mine){
color:red;
}
matches such structure:
<my-app class="mine">
whereas, this selector:
:host-context(.mine){
color:red;
}
matches this structure:
<div class="mine">
...
<my-app>
This is useful, if you want to apply styles to components view (shadow root) conditionally. This makes h2
always bold:
h2 {
font-weight: bold;
}
whereas this
:host-context(.make-inner-components-bold) h2 {
font-weight: bold;
}
makes them bold only if your component is inside an element with class .make-inner-components-bold
.
Angular :host selector is not working
From the docs:
Use the :host pseudo-class selector to target styles in the element
that hosts the component (as opposed to targeting elements inside the
component's template).
So
:host {
display: block;
border: 1px solid white;
}
will set the style for the whole host, so your element will just inherit of that style.
Here you are setting a class style .active but :host is not taken in consideration.
:host .active {
display: block;
border: 1px solid white;
}
Do
:host(.active) {
display: block;
border: 1px solid white;
}
How to apply CSS to the elements of a component through its selector - Angular7/8
An angular approach would be to pass the styles as an input property to your custom input as
@Input() styles: any;
and bind it to the ngStyle
property as
[styles]="styles"
Demo at: https://stackblitz.com/edit/angular-ngstyle-as-input-property
PS: As one of the user mentioned to use ::ng-deep
, it is not advised to do so and will soon be depricated. More info HERE
Using :host-context() with an adjacent sibling selector
:host()
and :host-context()
only accept a compound selector as their argument, and not a complex selector.
x-foo[active] + x-foo
is a complex selector that contains two compound selectors, x-foo[active]
and x-foo
, separated by the adjacent sibling combinator. :host()
and :host-context()
can accept either compound selector, but not any combinators.
Unfortunately, because the shadow host's siblings do not exist in the shadow context, you won't be able to write something like x-foo[active] + :host
. As a consequence, I don't think you will be able to accomplish what you're looking to do in a shadow context. (In the light context, of course, you can just write x-foo[active] + x-foo
, but that defeats the purpose of prepackaging CSS into a web component.)
It's not clear to me why :host()
and :host-context()
weren't specced to allow complex selectors in the first place, since if they did, what you have would have just worked.
Related Topics
Bootstrap 3 Placing Icon Inside Input Field
Show Google Picker Inside/Over Modal
Select Last Child When Odd, 2 Last Childs When Even
CSS Media Queries to Hide and Show Page Elements
How to Disable CSS Warning "Unknown Property" in Eclipse Mars
P.Classname or .Classname P, Any Difference
How to Avoid Webkit Contenteditable Copy-Paste Resulting in Unwanted CSS
CSS Selector Clarification: |= VS ^=
Applying Border to a Checkbox in Chrome
What Is the Simplest Way to Implement Pure CSS Show/Hide
Less CSS: Reuse Generated .@{Name} Class as a Mixin
Does Semantic UI Framework Support Rtl Languages
Adding a Dotted Line Trail After Menu Description
Realtime CSS/Scss Edition with Meteor Avoiding Server Restart