This is a solution with just vanilla css, nothing fancy, you don't even need !important
. I assume you can't modify the child, otherwise the answer is even more simple, I put that answer at the end just in case.
Overriding a child's CSS is sometimes needed when using a pre-made component from a library, and the devs have not provided any class
input variables. ::ng-deep
is deprecated and encapsulation: ViewEncapsulation.None
turns all of your component's CSS global. So here is a simple solution that uses neither of those.
The fact is, we do need a global style in order for the CSS to reach the child. So, we can just put the style in styles.css
or we can create a new CSS file and add it to the styles
array in angular.json
. The only issue is that we need a specific selector so as not to target other elements. That's a pretty easy solution - just add a unique class name to the html, I recommend using the parent component's name in the class name to ensure it is unique.
Parent Component
<child class="child-in-parent-component"></child>
Let's pretend we want to change the background-color of all the buttons within the child, we do need to achieve the correct specificity to make sure our styles take precedence. We can do this with !important
next to all our properties, but a better way is to just repeat the class name until our selector is specific enough, may take a few tries. That way, someone else can override this css again if necessary.
Global Styles File
.child-in-parent-component.child-in-parent-component.child-in-parent-component
button {
background-color: red;
}
or quick and dirty with !important
(not recommended)
.child-in-parent-component button {
background-color: red !important;
}
If the child component can be modified
Simply add an input variable to the component and make use of Angular's ngStyle
directive. You can add multiple variables to style multiple areas of your component.
Child Component
type klass = { [prop: string]: any } | null;
@Component({...})
export class ChildComponent {
@Input() containerClass: klass = null;
@Input() pClass: klass = null;
...
}
<div [ngStyle]="containerClass">
<p [ngStyle]="pClass">What color will I be?</p>
</div>
Parent Component
<child
[containerClass]="{ padding: '20px', 'background-color': 'black' }"
[pClass]="{ color: 'red' }"
>
</child>
This is the intended way to create a component with a dynamic style. Many pre-made components will have a similar input variable.