DEV Community

Cover image for Understanding :host and :host-context in Angular Styling
bytebantz
bytebantz

Posted on • Edited on

1

Understanding :host and :host-context in Angular Styling

When styling Angular components, you can’t simply target them using standard CSS selectors like you would with regular HTML elements. Instead, Angular provides special selectors like :host and :host-context to help style components effectively.

What is :host?

The :host selector is a special CSS rule in Angular that allows you to apply styles to the root element of a component.

Why do we need it?

Normally, in CSS, you can target elements directly. But in Angular, components are custom elements, and you cannot style them the usual way.

Example

Let’s say we are building a User Profile Card component in Angular.

<app-user-card>
    <img src="profile.jpg" alt="User Photo">
    <h3>John Doe</h3>
    <p>Web Developer</p>
</app-user-card>

Enter fullscreen mode Exit fullscreen mode

If we try to add a border to this app-user-card in the component's CSS file:

app-user-card {
    border: 2px solid black;
    padding: 10px;
}

Enter fullscreen mode Exit fullscreen mode

👉 This will not work because app-user-card is an Angular component and not a standard HTML element.

Solution: Use :host

We can use :host to target the root element:

:host {
  display: block;
  border: 2px solid black;
  border-radius: 0.375em;
  background-color: #eee;
}

Enter fullscreen mode Exit fullscreen mode

Now, the styles apply to the root element of the app-user-card component.

Conditional Styling Using :host(.class-name)

Sometimes, you only want to apply styles when the component has a certain class.

Example

Imagine we want to highlight premium users with a golden border.

<app-user-card class="premium">
    <img src="profile.jpg" alt="User Photo">
    <h3>Jane Smith</h3>
    <p>Premium Member</p>
</app-user-card>

Enter fullscreen mode Exit fullscreen mode

Now, in our component's CSS:

:host(.premium) {
    display: block;
    border: 2px solid gold;
    border-radius: 0.375em;
    background-color: #eee;
}

Enter fullscreen mode Exit fullscreen mode

Now, these styles apply only when the premium class is present on app-user-card. If we remove the class="premium", the styles won’t apply.

What is :host-context?

The :host-context selector allows us to apply styles based on where the component is used.

:host-context(selector) applies styles only when the component is inside an element matching the given selector.

Using :host-context

Imagine your site has a Dark Mode feature. You want all User Profile Cards to look different when inside a dark-mode container.

<div class="dark-mode">
    <app-user-card>
        <img src="profile.jpg" alt="User Photo">
        <h3>Sarah Connor</h3>
        <p>Graphic Designer</p>
    </app-user-card>
</div>

:host-context(.dark-mode) {
    display: block;
    border: 2px solid gray;
    border-radius: 0.375em;
    background-color: #333;
    color: white;
}

Enter fullscreen mode Exit fullscreen mode

Now, if app-user-card is inside .dark-mode, it automatically changes to dark mode! 🌙

The Problem with :host-context()

While :host-context() is useful, it can cause tight coupling between components and global styles.

If you rename .dark-mode to .theme-dark, you must update every component using :host-context(.dark-mode).

A Better Alternative: Use CSS Variables Instead of :host-context()

Instead of :host-context(), we can use CSS variables that change based on a global class.

CSS variables are a powerful way to manage and centralize styling properties in CSS.

Here's how they work:

✅ Step 1: Define Global Theme Variables

CSS variables are defined with a -- prefix followed by a name and a value.

The :root pseudo-class is commonly used to define these variables globally, making them accessible throughout the application.

For example:

/* styles.css */
:root {
  --bg-color: white;
  --text-color: black;
}

.dark-mode {
  --bg-color: black;
  --text-color: white;
}

Enter fullscreen mode Exit fullscreen mode

✅ Step 2: Apply Variables in Components

To use a CSS variable, you use the var() function, passing the variable name as an argument.

For example:

:host {
  background-color: var(--bg-color);
  color: var(--text-color);
  display: block;
  border: 2px solid gray;
  border-radius: 0.375em;
}

Enter fullscreen mode Exit fullscreen mode

Now, components will automatically adjust without relying on :host-context().

Want to explore more?

Check out my deep dive on Angular styling techniques on Gumroad for additional insights and best practices! → https://bytebantz.gumroad.com

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More

Top comments (0)