Ich versuche, ein vom Router-Ausgang platziertes Element in einem Winkel zu gestalten und möchte sicherstellen, dass das generierte Element eine Breite von 100% erhält
Aus den meisten Antworten geht hervor, dass ich den ::ng-deep
Selektor verwenden sollte, aber aus Angulars Dokumenten wird er nicht mehr empfohlen. Gibt es eine Alternative zu ::ng-deep
?
::ng-deep
geht nirgendwo hin. Es wird immer eine Einstellung sein, die Sie aktivieren können. Es gibt absolut keine Möglichkeit, es jetzt ohne massive Community-Gegenreaktionen zu entfernen. Schauen Sie sich an, wie viele Ergebnisse für diese Suche zurückkommen. Github.com/search?q=%3A%3Ang-deep&type=Code - es ist, als würde man sagen, dass die CSS-!important
Eigenschaft verschwinden wird!important
hat es einen wichtigen Platz in der CSS-Spezifikation, während::deep
es immer nur ein Vorschlag war.Antworten:
FWIW In meiner Forschung habe ich keinen Ersatz für ng-deep oder die anderen anwendbaren Alternativen gefunden. Dies liegt daran, dass das Angular-Team meines Erachtens auf die W3C-Spezifikation für den Schattendom zurückgreift, für die ursprünglich Selektoren wie z
deep
. Der W3c hat die Empfehlung jedoch inzwischen entfernt, aber nicht durch eine neue ersetzt. Bis dahin stelle ich mir vor, dass das Angular-Team::ng-deep
die verfügbaren Alternativen beibehalten und verfügbar machen wird, jedoch aufgrund des anstehenden Zustands der W3C-Entwürfe in einem veralteten Zustand. Ich kann mir momentan nicht die Zeit nehmen, die Dokumentation zu finden, um dies zu sichern, aber ich habe sie kürzlich gesehen.Lange Rede, kurzer Sinn: Verwenden Sie
::ng-deep
und seine Alternativen weiter, bis ein Ersatz erstellt wird - die Abwertung ist nur eine frühe Benachrichtigung, damit die Leute nicht blind sind, wenn die tatsächliche Änderung eintritt.- UPDATE -
https://drafts.csswg.org/css-scoping-1/ Hier ist der Entwurf des Vorschlags, wenn Sie interessiert sind. Es scheint, dass sie an einem robusten Satz von Selektoren für Elemente innerhalb eines Schattendom-Baums arbeiten. Es ist diese Spezifikation, die nach ihrer Genehmigung den Winkelklon informiert, falls es überhaupt eine gibt (dh Winkel muss möglicherweise keine eigenen Selektoren implementieren, sobald diese in Browsern verfügbar sind).
quelle
::ng-deep
(wenn Sie sich überhaupt für das Aussehen Ihrer Website interessieren) - selbst bei etwas wie eckigem Material. Sie haben Fehler, die seit Monaten nicht mehr behoben wurden, und Problemumgehungen betreffen häufig ng-deep. Und verwechseln Sie nicht die verschiedenen veralteten "tiefen" Selektoren - es::ng-deep
ist definitiv die am wenigsten veraltete.:host[some-context] {}
- it leben hängt davon ab, welche Art von Flexibilität / Portabilität Sie wünschen. Ich mag so oder so nicht super, aber das ist die Welt der Verkapselung.Um das Veraltete zu umgehen
::ng-deep
, deaktiviere ich normalerweiseViewEncapsulation
. Obwohl dies nicht der beste Ansatz ist, hat er mir gute Dienste geleistet.Gehen Sie zum Deaktivieren
ViewEncapsulation
in Ihrer Komponente wie folgt vor:import { Component, ViewEncapsulation } from '@angular/core'; @Component({ selector: 'app-header', templateUrl: './header.component.html', styleUrls: ['./header.component.scss'], encapsulation: ViewEncapsulation.None }) export class HeaderComponent { }
Dadurch werden die .scss-Stile in dieser Komponente für die gesamte Anwendung global. Um nicht zuzulassen, dass die Stile die Kette zu übergeordneten und geschwisterlichen Komponenten hinaufgehen, wickeln Sie den gesamten scss wie folgt mit dem Selektor ein:
app-header { // your styles here and any child component styles can go here }
Die hier angegebenen Stile werden nun auf untergeordnete Komponenten übertragen, sodass Sie beim Hinzufügen von CSS besonders auf Ihre CSS-Selektoren achten und auf Ihre Ps und Qs achten müssen (fügen Sie möglicherweise die in Ihrer Angular-App angegebene untergeordnete Auswahl und dann deren Stile hinzu).
Ich sage, es ist aufgrund des obigen Absatzes nicht der beste Ansatz, aber das hat mir gute Dienste geleistet.
quelle
ViewEncapsulation
großen Schaden, da diese Stile in alle Komponenten eindringen können. Diese Funktion sollte mit Bedacht und mit vollem Verständnis verwendet werdenDie einfache Alternative zu einem tiefen Stil ist ein gängiger Stil, bei dem die Elementauswahl der übergeordneten Komponente verwendet wird. Also, wenn Sie dies in hero-details.component.css hatten:
:host ::ng-deep h3 { font-style: italic; }
Es würde dies in styles.css werden:
app-hero-details h3 { font-style: italic; }
Grundsätzlich ist ein tiefer Stil ein nicht gekapselter Stil, daher scheint er mir konzeptionell eher ein allgemeiner Stil als ein Komponentenstil zu sein. Persönlich würde ich keine tiefen Stile mehr verwenden. Brechende Änderungen sind bei wichtigen Versionsaktualisierungen normal und das Entfernen veralteter Funktionen ist ein faires Spiel.
quelle
Wie bereits erwähnt, ist es bei Verwendung einer Bibliothek eines Drittanbieters praktisch unmöglich, die gelegentliche Verwendung zu vermeiden
::ng-deep
. Aber was machen Sie mit Ihren vorherigen Projekten, wenn diese::ng-deep
von Browsern nicht mehr unterstützt werden?Um für diesen Moment bereit zu sein, werde ich Folgendes vorschlagen:
@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;} }
Eine Selbstnotiz für die Zukunft: https://angular.io/guide/component-styles
Dies sollte der erste Ort sein, an dem nach offiziellen Alternativen / Wegen gesucht werden kann
quelle
But what are you going to do about your previous projects when the ::ng-deep became no longer supported by browsers?
Wird das nicht von Angular Cli kompiliert / polygefüllt, sodass keine Browserbeteiligung vorliegt? Tolle Antwort übrigens.:host /deep/ .mat-tab-label
wenn dies verwendet wird, sollte in umgewandelt werden::ng-deep
. Um ehrlich zu sein, scheint die Verwendung des Alias bequemer zu sein, da die CLI ihn während der Kompilierungszeit ändern kann. Sie müssen ihn jedochng build
erneut ausführen und erneut bereitstellen. Mein Vorsatz war es,::ng-deep
bei all meinen Projekten überhaupt zu vermeiden :)Dies ist kein allgemeiner Ersatz für :: ng-deep, sondern für den vom Fragesteller beschriebenen Anwendungsfall:
In dem speziellen Fall, in dem Sie das von einem Router-Ausgang eingefügte Element formatieren möchten, gibt es eine elegante Lösung, die den Selektor für benachbarte Nachbarn in CSS verwendet:
router-outlet+* { /* styling here... */ }
Dies gilt für alle Elemente, die direkte Nachbarn einer Router-Steckdose sind.
Weitere Informationen:
https://developer.mozilla.org/en-US/docs/Web/CSS/Adjacent_sibling_combinator
https://angular.io/guide/router#router-outlet
quelle
*
ist das Worst-Case-Szenario, dicht gefolgt vonelement *
aberelement + *
nicht , wo in der Nähe der ersten beiden.Sie können "/ deep /" verwenden. Es ist :: ng-tiefe Alternative.
:host /deep/ h3 { font-style: italic; }
quelle
alias
keinalternative
.