HTTP呼び出しから大量のHTMLコードを取得しています。 HTMLブロックを変数に入れて[innerHTML]を使って自分のページに挿入しましたが、挿入したHTMLブロックをスタイルすることはできません。どのように私はこれを達成する可能性があります誰かが何か提案がありますか?
@Component({selector: 'calendar',
template: '<div [innerHTML]="calendar"></div>',
providers:[HomeService],
styles: [`
h3 {color:red;}
`})
私がスタイルしたいHTMLは、変数 "calendar"に含まれているブロックです。
update 2 ::slotted
::slotted
は現在、すべての新しいブラウザでサポートされており、 `ViewEncapsulation.ShadowDomで使用できます。
https://developer.mozilla.org/en-US/docs/Web/CSS/::slotted
update 1 :: ng-deep
/deep/
は非推奨になり、::ng-deep
に置き換えられました。
::ng-deep
もすでに非推奨とマークされていますが、それに代わるものはまだありません。
ViewEncapsulation.Native
がすべてのブラウザで適切にサポートされていて、シャドウDOMの境界を越えたスタイリングをサポートしている場合、::ng-deep
はおそらく廃止されるでしょう。
オリジナル
Angularは、DOMに追加するHTMLにあらゆる種類のCSSクラスを追加して、シャドウDOM CSSのカプセル化をエミュレートし、コンポーネントへの出入りのスタイルを防止します。 Angularは、追加したCSSをこれらの追加クラスに合わせて書き換えます。 [innerHTML]
を使用して追加されたHTMLの場合、これらのクラスは追加されず、書き換えられたCSSは一致しません。
回避策として試してください
/* :Host /deep/ mySelector { */
:Host ::ng-deep mySelector {
background-color: blue;
}
index.html
に追加/* body /deep/ mySelector { */
body ::ng-deep mySelector {
background-color: green;
}
>>>
(および同等の/deep/
だが/deep/
はSASSでよりうまく機能する)および::shadow
は2.0.0-beta.10で追加された。これらはshadow DOM CSSコンビネータ(非推奨)と似ており、Angular 2のデフォルトであるencapsulation: ViewEncapsulation.Emulated
でのみ動作します。おそらくViewEncapsulation.None
でも動作しますが、必要ないので無視されるだけです。クロスコンポーネントスタイリングのためのより高度な機能がサポートされるまで、これらのコンビネータは中間的な解決策にすぎません。
もう一つのアプローチは使うことです
@Component({
...
encapsulation: ViewEncapsulation.None,
})
cSSをブロックするすべてのコンポーネントの場合(CSSを追加する場所とスタイルを設定するHTMLの場所によって異なります。アプリケーションのすべてコンポーネントになる可能性があります)
更新
Angularコンポーネント内に動的に追加されたHTML要素のスタイルを設定しようとしている場合、これは役に立ちます。
// inside component class...
constructor(private hostRef: ElementRef) { }
getContentAttr(): string {
const attrs = this.hostRef.nativeElement.attributes
for (let i = 0, l = attrs.length; i < l; i++) {
if (attrs[i].name.startsWith('_nghost-c')) {
return `_ngcontent-c${attrs[i].name.substring(9)}`
}
}
}
ngAfterViewInit() {
// dynamically add HTML element
dynamicallyAddedHtmlElement.setAttribute(this.getContentAttr(), '')
}
この属性の規約はAngularのバージョン間で安定しているとは保証されていないので、Angularの新しいバージョンにアップグレードするときにこのソリューションで問題が発生する可能性があります。そのような場合はおそらく簡単なことでしょう)。