Style not working for innerHTML in Angular
This behavior you're getting is normal. The class added to innerHTML
is ignored because by default the encapsulation is Emulated
. Which means Angular prevents styles from intercepting inside and outside of the component.
You should change the encapsulation to None
in your component.
This way, you'll be able to define classes wherever you want: inside styles
or in a separate .css
, .scss
or .less
style-sheet (it doesn't matter) and Angular will add them to the DOM automatically.
import { Component, ViewEncapsulation } from '@angular/core';
@Component({
selector: 'example',
styles: ['.demo {background-color: blue}'],
template: '<div [innerHTML]="someHtmlCode"></div>',
encapsulation: ViewEncapsulation.None,
})
export class Example {
private someHtmlCode = '';
constructor() {
this.someHtmlCode = '<div class="demo"><b>This is my HTML.</b></div>';
}
}
span doesn't apply css style when entered via innerHTML
This happens because you are adding the span
element dynamically and it is not part of your component, therefore the span
element is not decorated with component style isolation. When you explore your components rendered html then you see that each element has attribute like _ngcontent-c2
but your span doesn't, so it is not part of that component styling.
You can change your css to:
::ng-deep div#JSONContainer span.highlightSpan
to style descendants of your component (other components or elements added dynamically). Or you can add the styling to your global style so it is not part of that component isolation.
I have created stackblitz demo to simulate your situation.
You can read more about angular view encapsulation.
Angular add style tag into innerHTML
You need to use DomSanitizer of @angular/platform-browser
to sanitize the HTML.
Take a look of the docs: https://angular.io/api/platform-browser/DomSanitizer.
In your particular case, you need to use bypassSecurityTrustHtml()
method. Also, for apply styles only to one component, add an id
to your target component and use it in your styles. (You can use class if that component will appear more than once in your web).
EXAMPLE:
import { Component } from '@angular/core';
import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
@Component({
selector: 'my-app',
template: `
<div id="myId">
<div [innerHtml]="myStyle"></div>
<h1>Hello</h1>
</div>
`
})
export class AppComponent {
myStyle: SafeHtml;
constructor(private _sanitizer: DomSanitizer) { }
ngOnInit() {
this.myStyle =
this._sanitizer.bypassSecurityTrustHtml(`<style>#myId h1{color: red}</style>`);
}
}
DEMO: https://stackblitz.com/edit/angular-3kza7c?file=src%2Fapp%2Fapp.component.ts
Angular: Component scss styles not applied to tags supplied to [innerHTML] of div?
You should disable encapsulation for that component. You can do it like this:
import { Component, ViewEncapsulation } from '@angular/core';
...
@Component({
...
encapsulation: ViewEncapsulation.None,
})
Angular 2 - innerHTML styling
update 2 ::slotted
::slotted
is now supported by all new browsers and can be used with ViewEncapsulation.ShadowDom
https://developer.mozilla.org/en-US/docs/Web/CSS/::slotted
update 1 ::ng-deep
/deep/
was deprecated and replaced by ::ng-deep
.
::ng-deep
is also already marked deprecated, but there is no replacement available yet.
When ViewEncapsulation.Native
is properly supported by all browsers and supports styling accross shadow DOM boundaries, ::ng-deep
will probably be discontinued.
original
Angular adds all kinds of CSS classes to the HTML it adds to the DOM to emulate shadow DOM CSS encapsulation to prevent styles of bleeding in and out of components. Angular also rewrites the CSS you add to match these added classes. For HTML added using [innerHTML]
these classes are not added and the rewritten CSS doesn't match.
As a workaround try
- for CSS added to the component
/* :host /deep/ mySelector { */
:host ::ng-deep mySelector {
background-color: blue;
}
- for CSS added to
index.html
/* body /deep/ mySelector { */
body ::ng-deep mySelector {
background-color: green;
}
>>>
(and the equivalent/deep/
but /deep/
works better with SASS) and ::shadow
were added in 2.0.0-beta.10. They are similar to the shadow DOM CSS combinators (which are deprecated) and only work with encapsulation: ViewEncapsulation.Emulated
which is the default in Angular2. They probably also work with ViewEncapsulation.None
but are then only ignored because they are not necessary.
These combinators are only an intermediate solution until more advanced features for cross-component styling is supported.
Another approach is to use
@Component({
...
encapsulation: ViewEncapsulation.None,
})
for all components that block your CSS (depends on where you add the CSS and where the HTML is that you want to style - might be all components in your application)
Update
Example Plunker
Style is not applied after sanitization and [innerHTML]
Angular use encapsulation for styles. See https://angular.io/guide/component-styles#view-encapsulation. You can use one of the way:
- use
::ng-deep
in your stiles like this:::ng-deep span.add {...}
- change encapsulation to
None
by addingencapsulation: ViewEncapsulation.None
in@Component
decorator.
Passing innerHtml with inline styles (Angular 10)
You need to utilize the DomSanitizer. With the sanitizer injected in the constructor, your htmlValue assignment would be updated to the following.
var htmlValue = this.sanitizer
.bypassSecurityTrustHtml("<div style="margin-left: 13px; font-size: large;" fxLayout="column" fxLayoutAlign="center start">
Need Help?
</div>")
Working StackBlitz example.
WARNING
Angular stripping out the styles, etc initially is due to safety concerns, so do this cautiously. This should be used only when you can trust the html being injected. If the html is something that ultimately comes from user input, then this should be done very judiciously as the user could utilize this to inject unsafe code into your application.
Related Topics
How to Make the HTML5 Number Field Display Trailing Zeroes
How to Notify the HTML Container That the Swf Has Finished, Using Swfobject
How to Create a Hidden Div That Doesn't Create a Line Break or Horizontal Space
Can You Use CSS to Mirror/Flip Text
How to Scale a Stubborn Svg Embedded with the <Object> Tag
Disable Spell-Checking on HTML Textfields
Deploying Just HTML, CSS Webpage to Tomcat
How to Align Flexbox Columns Left and Right
Stop CSS Transition from Firing on Page Load
How to Embed Latex in a Webpage
Disable Double-Tap "Zoom" Option in Browser on Touch Devices
Css: How to Set Image Size Relative to Parent Height
Exclude Menu Item from the Collapse of Bootstrap 3 Navbar
Center HTML Input Text Field Placeholder