Angular 4'te yeniyim, bu yüzden biri Angular 4'te nasıl ve nerede kullanılacağını açıklayabilir ::ng-deep
mi?
Aslında, üst bileşenlerden alt bileşenlerin bazı CSS özelliklerinin üzerine yazmak istiyorum. Üstelik IE11'de destekleniyor mu?
Angular 4'te yeniyim, bu yüzden biri Angular 4'te nasıl ve nerede kullanılacağını açıklayabilir ::ng-deep
mi?
Aslında, üst bileşenlerden alt bileşenlerin bazı CSS özelliklerinin üzerine yazmak istiyorum. Üstelik IE11'de destekleniyor mu?
Yanıtlar:
Genellikle /deep/ “shadow-piercing”
birleştirici, bir stili zorlamak için kullanılabilir child components
. Bu seçicinin bir takma adı >>> ve şimdi :: ng-deep adında başka bir ad var.
beri /deep/ combinator
kullanımdan kaldırıldı kullanımda önerilir::ng-deep
Örneğin:
<div class="overview tab-pane" id="overview" role="tabpanel" [innerHTML]="project?.getContent( 'DETAILS')"></div>
ve css
.overview {
::ng-deep {
p {
&:last-child {
margin-bottom: 0;
}
}
}
}
alt bileşenlere uygulanacak
::ng-deep
, >>>
Ve /deep/
belirli CSS kurallarını devre dışı görünümü kapsülleme, diğer bir deyişle, bu size bileşenin HTML olmayan DOM öğeleri, erişim sağlar. Örneğin, Angular Material (veya bunun gibi başka bir üçüncü taraf kitaplığı) kullanıyorsanız, oluşturulan bazı öğeler bileşeninizin alanı ( iletişim kutusu gibi ) dışındadır ve bu öğelere doğrudan veya normal bir CSS kullanarak erişemezsiniz. yol. Bu öğelerin stillerini değiştirmek istiyorsanız, şu üç şeyden birini kullanabilirsiniz, örneğin:
::ng-deep .mat-dialog {
/* styles here */
}
Şimdilik Angular ekibi, yalnızca Öykünülmüş görünüm kapsüllemesiyle "derin" manipülasyonlar yapılmasını tavsiye ediyor .
"Derin" manipülasyonlar da aslında kullanımdan kaldırıldı , AMA şimdilik hala çalışıyor çünkü Angular ön işleme desteği veriyor ( ::ng-deep
bugün reddetmek için acele etmeyin , önce kullanımdan kaldırma uygulamalarına bir göz atın ).
Her neyse, bu yolu izlemeden önce, görünüm kapsülleme yaklaşımını devre dışı bırakmaya bir göz atmanızı tavsiye ederim (ki bu da ideal değildir, stillerinizin diğer bileşenlere sızmasına izin verir), ancak bazı durumlarda daha iyi bir yol. Görünüm kapsüllemeyi devre dışı bırakmaya karar verdiyseniz, CSS kuralları kesişiminden kaçınmak ve son olarak stil sayfalarınızda karışıklık olmasını önlemek için belirli sınıfları kullanmanız şiddetle önerilir. Doğrudan bileşenin .ts
dosyasında devre dışı bırakmak gerçekten çok kolay :
@Component({
selector: '',
template: '',
styles: [''],
encapsulation: ViewEncapsulation.None // Use to disable CSS Encapsulation for this component
})
Bu makalede görünüm kapsülleme hakkında daha fazla bilgi bulabilirsiniz .
ViewEncapsulation.None
! Bu stillerin diğer bileşenlere sızmasını mümkün kılarak çok fazla zarar verecektir.
::ng-deep
Ebeveynin kapsüllenmiş bir css sınıfı olmasını zorunlu kılarak bir bileşenin yalnızca çocuklarıyla sınırlandırmanın önemini vurgulamak isterim .
Bunun işe yaraması ::ng-deep
için ebeveynden sonra kullanılması önemlidir , aksi takdirde bileşen yüklendiği anda aynı ada sahip tüm sınıflar için geçerli olacaktır.
Bileşen css:
.my-component ::ng-deep .mat-checkbox-layout {
background-color: aqua;
}
Bileşen şablonu:
<h1 class="my-component">
<mat-checkbox ....></mat-checkbox>
</h1>
Ortaya çıkan (Açısal oluşturulmuş) css:
.my-component[_ngcontent-c1] .mat-checkbox-layout {
background-color: aqua;
}
DÜZENLE:
:host
Yeni bir css sınıfı oluşturmak yerine anahtar kelimeyi kullanarak aynı davranışı elde edebilirsiniz .
:host ::ng-deep .mat-checkbox-layout
my-component ::ng-deep...
günümü kurtardı. Tüm günümü bileşenim için ng-deep ile bir stil uygulamaya çalışarak geçirdim ve tüm uygulamamdan tüm bileşenlerimi geçersiz kılıyordum.
:host
anahtar kelime ile aynı davranışı elde edeceksiniz - netlik için cevaba bir not ekledi.
Açısal kılavuzda :host-context
doğrudan yukarıdaki açıklamayı kaçırmamaya dikkat edin ::ng-deep
: https://angular.io/guide/component-styles . Şimdiye kadar kaçırdım ve keşke daha önce görseydim.
::ng-deep
genellikle bileşeni yazmadığınızda ve kaynağına erişiminiz olmadığında gereklidir, ancak :host-context
bunu yaptığınızda çok yararlı bir seçenek olabilir.
Örneğin <h1>
, tasarladığım bir bileşenin içinde siyah bir başlığım var ve koyu temalı bir arka planda görüntülendiğinde bunu beyaza çevirme yeteneğini istiyorum.
Kaynağa erişimim yoksa bunu ebeveyn için css'de yapmam gerekebilir:
.theme-dark widget-box ::ng-deep h1 { color: white; }
Ancak bunun yerine :host-context
, bunu bileşenin içinde yapabilirsiniz .
h1
{
color: black; // default color
:host-context(.theme-dark) &
{
color: white; // color for dark-theme
}
// OR set an attribute 'outside' with [attr.theme]="'dark'"
:host-context([theme='dark']) &
{
color: white; // color for dark-theme
}
}
Bu, bileşen zincirinde herhangi bir yere bakar .theme-dark
ve bulunursa css'yi h1'e uygular. Bu, ::ng-deep
çoğu zaman gerekli olsa da biraz anti-model olan çok fazla güvenmeye iyi bir alternatiftir .
Bu durumda, &
ile değiştirilir h1
(sass / scss böyle çalışır), böylece çok kullanışlı olan 'normal' ve temalı / alternatif css'inizi hemen yan yana tanımlayabilirsiniz.
Doğru numarayı almaya dikkat edin :
. Çünkü ::ng-deep
iki tane var ve :host-context
sadece biri için.
:host(.theme-dark)
miras theme-dark
almak istemiyorsanız da kullanabilirsiniz . Bu tamamen sitenizin css tasarımına bağlı olacaktır. Ayrıca öznitelikler çok yararlı olabilir ve yalnızca :host([theme='dark']:not([dayofweek='tuesday'))
.theme-light
sınıfa sahip bir kapsayıcı içinde bir bileşene sahipseniz, bu daha sonra bir kap içinde yuvalanacak ve .theme-dark
yine de onu alacak theme-dark
ve uygulayacaktır. css. Ancak bu, 'modernizr' türü sınıflar için veya küresel olarak ve yalnızca bir kez bir tema kümeniz varsa harika bir çözümdür.
Sadece bir güncelleme:
Kullanımdan kaldırılmış gibi görünen ::ng-deep
yerine kullanmalısınız /deep/
.
Belgelere göre:
Gölge delici alt birleştirici kullanımdan kaldırıldı ve büyük tarayıcılardan ve araçlardan destek kaldırılıyor. Bu nedenle Angular'da desteği bırakmayı planlıyoruz (/ deep /, >>> ve :: ng-deep'un 3'ü için). O zamana kadar :: ng-deep, aletlerle daha geniş bir uyumluluk için tercih edilmelidir.
Burada bulabilirsin
Dikkatli bir şekilde :: ng-deep kullanın. Uygulamamın tamamında malzeme tasarımı araç çubuğu rengini uygulamamda farklı renklere ayarlamak için kullandım, bunu yalnızca uygulama araç çubuğu renklerini birbiri üzerinde test ederken bulmak için kullandım. Öğrenmek için gelin, çünkü bu tarzlar küresel hale geliyor, bu makaleye bakın İşte diğer bileşenlere sızmayan bir çalışma kodu çözümü.
<mat-toolbar #subbar>
...
</mat-toolbar>
export class BypartSubBarComponent implements AfterViewInit {
@ViewChild('subbar', { static: false }) subbar: MatToolbar;
constructor(
private renderer: Renderer2) { }
ngAfterViewInit() {
this.renderer.setStyle(
this.subbar._elementRef.nativeElement, 'backgroundColor', 'red');
}
}
/deep/
ve::ng-deep
her ikisi de artık kullanılmamaktadır, seni bu cevabı için alook almaya önermek stackoverflow.com/a/49308475/2275011 ve daha ayrıntılı bilgi ve çözümler için yapılan yorumlar.