ルーターのコンセントによって配置された要素を角度でスタイリングしようとしていますが、生成された要素の幅が100%になるようにします
ほとんどの返信から、::ng-deep
セレクターを使用する必要があることがわかりましたが、Angularのドキュメントからは非推奨になっています。に代わるものはあり::ng-deep
ますか?
!important
CSS仕様で重要な位置を占めています::deep
が、常に提案にすぎませんでした。
回答:
FWIW私の調査では、ng-deepやその他の適用可能な代替手段に代わるものは見つかりませんでした。これは、AngularチームがShadow domのW3C仕様を延期しているためdeep
です。これには、当初はなどのセレクターがありました。ただし、W3cはその後、推奨事項を削除しましたが、新しい推奨事項に置き換えていません。それが起こるまで、Angularチームは維持し::ng-deep
、代替手段を利用できると思いますが、W3Cのドラフトの保留状態のため、非推奨の状態になっています。現在、これをバックアップするためのドキュメントを見つけるのに時間がかかりませんが、最近見ました。
簡単に言う::ng-deep
と、代替品が作成されるまで、その代替手段を使い続けてください。実際の変更が実現するたびに人々が盲目的になることがないように、非推奨は単なる早期通知です。
-更新-
https://drafts.csswg.org/css-scoping-1/ 興味があれば、ここにドラフト提案があります。彼らはシャドウDOMツリー内の要素の強力なセレクターのセットに取り組んでいるようです。この仕様が承認されると、Angularクローンが存在する場合でも通知されると思います(つまり、ブラウザーで公開された後、Angularは独自のセレクターを実装する必要がない場合があります)。
::ng-deep
と、角張った素材のようなものであっても、たまに使用する必要がなくなることは事実上不可能です(サイトの外観をまったく気にしない場合)。それらには数ヶ月間修正されないバグがあり、回避策にはしばしばng-deepが含まれます。また、非推奨のさまざまな「ディープ」セレクターを混同しないでください::ng-deep
。これは間違いなく非推奨の最も少ないセレクターです。
:host[some-context] {}
-それを必要な柔軟性/移植性の種類によって異なります。どちらの方法もあまり好きではありませんが、これがカプセル化の世界です。
非推奨をバイパスするために::ng-deep
、私は通常無効にしViewEncapsulation
ます。これは最善のアプローチではありませんが、私には役立っています。
を無効にするViewEncapsulation
には、コンポーネントで次の手順を実行します。
import { Component, ViewEncapsulation } from '@angular/core';
@Component({
selector: 'app-header',
templateUrl: './header.component.html',
styleUrls: ['./header.component.scss'],
encapsulation: ViewEncapsulation.None
})
export class HeaderComponent {
}
これにより、このコンポーネントの.scssスタイルがアプリケーション全体に対してグローバルになります。スタイルが親コンポーネントと兄弟コンポーネントにチェーンを上ることを許可しないようにするには、次のようにセレクターでscss全体をラップします。
app-header {
// your styles here and any child component styles can go here
}
ここで指定するスタイルは子コンポーネントに分類されるため、CSSセレクターを特に具体的に指定し、CSSを追加するときにpとqに注意する必要があります(Angularアプリで指定した子セレクターを追加してからそのスタイルを追加する場合があります)。
上記の段落のため、これは最善のアプローチではないと言いますが、これは私に役立ちました。
ViewEncapsulation
にすると、それらのスタイルがすべてのコンポーネントに漏れる可能性があるため、多くの損害が発生します。この機能は、賢明かつ十分に理解して使用する必要があります
ディープスタイルのシンプルで簡単な代替手段は、親コンポーネントの要素セレクターを使用する一般的なスタイルです。したがって、これがhero-details.component.cssにある場合:
:host ::ng-deep h3 {
font-style: italic;
}
styles.cssでは次のようになります。
app-hero-details h3 {
font-style: italic;
}
基本的に、ディープスタイルはカプセル化されていないスタイルであるため、概念的には、コンポーネントスタイルというよりも一般的なスタイルのように見えます。個人的にはもうディープスタイルは使いません。メジャーバージョンのアップデートでは重大な変更は正常であり、非推奨の機能の削除は公正なゲームです。
誰かが前に述べたように、サードパーティのライブラリを使用している場合、たまに使用しなければならないことを避けることは事実上不可能::ng-deep
です。しかし::ng-deep
、ブラウザでサポートされなくなったとき、以前のプロジェクトについてどうしますか?
その瞬間に備えるために、私は次のことを提案します:
@Component({
selector: 'app-example',
templateUrl: './example.component.html',
styleUrls: ['./example.component.scss'],
encapsulation: ViewEncapsulation.None
})
<section class="app-example-container">
<!-- a third party component -->
<mat-tab-group>
<mat-tab label="First"></mat-tab>
<mat-tab label="Second"></mat-tab>
</mat-tab-group>
</section>
.app-example-container {
/* All the CSS code goes here */
.mat-tab-group .mat-tab-label {color: red;}
}
将来への自己メモ:https://angular.io/guide/component-styles
それは公式の代替案/ ways-to-goを探す最初の場所でなければなりません
But what are you going to do about your previous projects when the ::ng-deep became no longer supported by browsers?
それはangularcliによってコンパイル/ポリフィルされていないので、ブラウザーの関与はありませんか?ところで素晴らしい答え。
:host /deep/ .mat-tab-label
これを使用してエイリアシングは可能です(私は思います)::ng-deep
。に変換する必要があります。正直なところ、CLIはコンパイル時にエイリアスを変更できるため、エイリアスを使用する方が便利なようですが、それでも、エイリアスを実行しng build
て再度デプロイする必要があります。私の決意は避けることでした::ng-deep
すべての私のプロジェクト:)上のすべてで
これは:: ng-deepの一般的な置き換えではありませんが、質問の作成者が説明したユースケースの場合です。
router-outletによって挿入された要素のスタイルを設定する特別な場合には、CSSの隣接するネイバーセレクターを使用する洗練されたソリューションがあります。
router-outlet+* {
/* styling here... */
}
これは、ルーターアウトレットの直接の隣接要素であるすべての要素に適用されます。
参考文献:
https //developer.mozilla.org/en-US/docs/Web/CSS/Adjacent_sibling_combinator
https://angular.io/guide/router#router-outlet
*
最悪のシナリオは、僅差で続くんですelement *
が、element + *
何の場所最初の2近くです。
「/ deep /」を使用できます。:: ng-deepの代替手段です。
:host /deep/ h3 {
font-style: italic;
}
alias
はありませんalternative
。
::ng-deep
どこにも行きません。常に有効にできる設定になります。大規模なコミュニティの反発なしに、彼らが今それを取り除くことができる方法は絶対にありません。どのように多くの結果は、この検索に戻ってきて見github.com/search?q=%3A%3Ang-deep&type=Codeそれは、CSSと言ってようなものだ-!important
プロパティが消えるために起こっている