LoginComponent
とhtml
タグを「リスタイル」する必要があるAngular 2のbody
に取り組んでいるので、特定の背景画像をログインページ。
ただし、html, body
のスタイルをlogin.css
に追加するだけでは機能しないようです。
コンポーネントのhtml, body
のスタイルをオーバーライドする方法はありますか?またはその問題の任意の要素。
私は次のようなことを試しました:
:Host(.btn) { ... }
:Host(.btn:Host) { ... }
.btn:Host { ... }
Login
コンポーネントの外部から要素をスタイルします。しかし、何もうまくいかないようです。
試すことができます
body {
/* body styles here */
}
ただし、コンポーネントのスタイルは、それ自体の外部の要素に適用されることは想定されていません。
別の方法は、メインコンポーネントでセレクタとしてbody
を使用し、ホストバインディングを使用してbodyのCSSクラスを設定/削除して、index.htmlに追加したCSSを一致させることです。
@Component({
selector: "body",
Host: {
"[class.some-class]":"someClass"
},
})
export class AppComponent {
constructor(private loginService: LoginService) {
loginService.isLoggedInChanged.subscribe((value) => {
this.someClass = value;
});
}
someClass: bool = false;
}
someclass
をtrueに設定すると(サービスへのバインドが必要になると、クラスが本体に追加されます。
CSSをグローバルに追加したくない場合は、スタイル属性に直接バインドすることもできます
@Component({
selector: "body",
Host: {
"[style.background-image]":"bodyBackgroundImage()"
},
})
export class AppComponent {
bool isLoggedIn = false;
constructor(private loginService: LoginService) {
loginService.isLoggedInChanged.subscribe((value) => {
this.isLoggedIn = value;
});
}
function bodyBackgroundImage() {
return this.isLoggedIn ? 'url("gradient_bg.png")': 'none';
}
}
update
DomAdapter
はなくなりました。 Renderer2 は同様の機能を提供する必要があります。
ログインコンポーネントから直接<body>
をスタイルする方法は、DomAdapter
を使用することです( https://github.com/angular/angular/issues/4942 も参照)
System.import('angular2/src/platform/browser/browser_adapter').then(function(browser_adapter) { browser_adapter.BrowserDomAdapter.makeCurrent(); }) ... _dom: DomAdapter = new BrowserDomAdapter(); _dom.setStyle(_dom.query('body'), 'padding', '50px');
ViewEncapsulation を使用して、コンポーネントがcssを提供する方法を変更する必要があります。デフォルトでは、Emulated
に設定され、angularは
サロゲートIDを含む属性を追加し、スタイルルールを前処理します
この動作import ViewEncapsulation from 'angular2/core'
を変更し、コンポーネントのメタデータで使用するには:
@Component({
...
encapsulation: ViewEncapsulation.None,
...
})
これがまさにあなたが探しているものであるかどうかはわかりませんが、これはあなたに永続的に変更されたボディの背景画像を残しません。
似たようなもののために私がそれをした方法は次のとおりです。 touがこのページだけのボディ背景画像に影響を与えたい場合、これはうまくいくかもしれません。 (これは完全にはテストしていませんが、Windowsブラウザーで動作するようです。)
コンポーネントの内部では、コンポーネントが構築されたときにDOMを直接操作できます。破棄された場合、変更を取り消すことができます。
export class SpecialBackground {
constructor(){
document.body.style.backgroundImage = "url('path/to/your/image.jpg')";
document.body.style.backgroundPosition = "center center";
document.body.style.backgroundRepeat = "no-repeat";
document.body.style.backgroundAttachment = "fixed";
document.body.style.backgroundSize = "cover";
}
ngOnDestroy(){
document.body.style.backgroundImage = "none";
}
}
あなたの目的のために、ボタンがクリックされたときに、コンストラクタではなく別の関数を使用できます。
私がそれを使用した方法は
constructor() {
document.body.className = "bg-gradient";
}
ngOnDestroy(){
document.body.className="";
}
これにより、特定のコンポーネントのスタイルが動的にボディに追加および削除されます。
Styles.scssファイルを編集したところ、うまくいきました。
ルーターアウトレットに読み込まれたコンポーネントでこのアプローチを使用します。
ngOnInit() {
// Change <body> styling
document.body.classList.add('align-content-between');
}
ngOnDestroy() {
// Change <body> styling
document.body.classList.remove('align-content-between');
}
Margin-topで同じ問題がありましたが、修正方法は
constructor(
private _renderer: Renderer2,
) {
this._renderer.removeStyle(document.body, 'margin-top');
}
これは私にとって完璧に機能しました。
ルートレベルでcssファイルを追加し、angular-cli.jsonで構成することをお勧めしますOR index.htmlで追加します。リセットスタイルとグローバルスタイルを記述することができ、シャドウdomやその他の概念を心配する必要はありません。