Aynı öğe için birden fazla: sözde öğeye sahip olabilir miyim?


116

:beforeAynı öğe için birden fazla takma ad olabilir mi?

.circle:before {
    content: "\25CF";
    font-size: 19px;
}
.now:before{
    content: "Now";
    font-size: 19px;
    color: black;
}

Yukarıdaki stilleri jQuery kullanarak aynı öğeye uygulamaya çalışıyorum, ancak yalnızca en yeni olanı uygulandı, ikisi de asla.

Yanıtlar:


94

CSS2.1'de, bir eleman herhangi bir zamanda herhangi bir sözde elemandan en fazla birine sahip olabilir. (Bu araçlar bir eleman a ikisine de sahip olabilir :beforeve bir :aftersahte eleman - sadece her bir türden birden fazla olamaz.)

Sonuç olarak, :beforeaynı öğeyle eşleşen birden fazla kuralınız olduğunda , bunların tümü :before, normal bir öğede olduğu gibi tek bir sözde öğeye basamaklanır ve uygulanır . Örneğinizde, sonuç şuna benzer:

.circle.now:before {
    content: "Now";
    font-size: 19px;
    color: black;
}

Gördüğünüz gibi, yalnızca en contentyüksek önceliğe sahip bildirim (daha önce belirtildiği gibi, en son gelen) yürürlüğe girecektir - diğer CSS özelliklerinde olduğu gibi, bildirimlerin geri kalanı atılır.

Bu davranış BB2.1'in Seçiciler bölümünde açıklanmaktadır :

Sözde öğeler, aşağıda ve başka yerlerde açıklanan istisnalar dışında, CSS'deki gerçek öğeler gibi davranır .

Bu, sözde öğelere sahip seçicilerin normal öğeler için seçiciler gibi çalıştığı anlamına gelir. Aynı zamanda, kaskadın da aynı şekilde çalışması gerektiği anlamına gelir. Garip bir şekilde, CSS2.1 tek referans olarak görünmektedir; ne css3-selectors ne de css3-cascade bundan hiç bahsetmez ve gelecekteki bir spesifikasyonda açıklığa kavuşturulup açıklanmayacağı görülmeye devam etmektedir.

Bir öğe aynı sözde öğe ile birden fazla seçiciyle eşleşebiliyorsa ve hepsinin bir şekilde uygulanmasını istiyorsanız, tarayıcının bunlarda tam olarak ne yapması gerektiğini belirtebilmeniz için birleşik seçicilerle ek CSS kuralları oluşturmanız gerekecektir. vakalar. contentBurada özelliği içeren eksiksiz bir örnek veremem , çünkü örneğin sembolün mü yoksa metnin mi önce gelmesi gerektiği net değil. Ancak bu birleşik kural için ihtiyaç duyduğunuz seçici, ya .circle.now:beforeda .now.circle:before- hangisini seçerseniz seçin, kişisel tercihinizdir, çünkü her iki seçici de eşdeğerdir, yalnızca contentkendinizi tanımlamanız gereken özelliğin değeridir .

Hâlâ somut bir örneğe ihtiyacınız varsa, bu benzer soruya verdiğim cevaba bakın .

Eski css3 içerik belirtimi::before::after , CSS2.1 kademesiyle uyumlu bir gösterim kullanarak birden çok ve sözde öğenin eklenmesiyle ilgili bir bölüm içerir , ancak bu belgenin eski olduğunu unutmayın - 2003'ten beri güncellenmedi ve hiç kimse bu özelliği geçtiğimiz on yılda uyguladı. İyi haber şu ki, terk edilmiş belge aktif olarak css-content-3 ve css-pseudo-4 kisvesi altında yeniden yazılıyor . Kötü haber, çok sayıda sözde eleman özelliğinin her iki belirtimde de bulunmamasıdır, muhtemelen yine uygulayıcı ilgisinin olmamasından kaynaklanmaktadır.


12
Bir öğe hem sınıfa ait ise verilen durumda, circleve sınıfa now, iki kural da öğenin için geçerli :beforesözde elemanı, fakat normal CSS o sadece birini ima content(normal kaskad kurallarla) etkili olabilmesi ayarlarla. Mesele şu ki content, birikmiyor.
Jukka K. Korpela

Dışarı Dönüşler bu soruya birkaç ay sonra cevap verdi bu bir kopyası. O zamandan beri, @ Jukka'nın yukarıda söylediği her şeyi temelde genişleten diğer cevaptan gelen bilgilerin çoğunu, önce gelmenin yanı sıra çok daha fazla trafik alırken buna dahil ettim.
BoltClock

1
13 yılın ardından css-content-3 taslağı nihayet güncellendi . Sözde öğeler bölümü, birden fazla öğeye ::beforeveya ::aftersözde öğeye izin vermeyen css-sözde-4 lehine kesinlikle kaldırılmıştır .
Oriol

@Oriol: Aslında 12 yıl. css-pseudo-4'ün FPWD'si geçen yıl tanıtıldı ve bu sırada css-content-3 yeni spesifikasyona işaret edecek şekilde zaten güncellendi.
BoltClock

@BoltClock drafts.csswg.org adresindeki css-content-3 düzenleyici taslağı bir süre önce güncellendi, ancak w3.org'daki çalışma taslağı yakın zamana kadar hala 2003'teydi. Hâlâ bazı umutlarım vardı ...
Oriol

31

Ana öğenizin bazı alt öğeleri veya metni varsa, onu kullanabilirsiniz.

Ana öğenizi göreceli (veya mutlak / sabit) konumlandırın ve ikisini de kullanın: önce ve: mutlak konumlandırıldıktan sonra (benim durumumda mutlak olması gerekiyordu, sizinkini bilmiyorum).

Şimdi bir tane daha sözde eleman istiyorsanız, mutlak bir ekleyin: önce ana elemanın çocuklarından birine (eğer sadece metne sahipseniz, onu bir aralık içine koyun, şimdi bir elemanınız var), ki bu göreceli / mutlak / sabit değildir .

Bu öğe, sahibi ana unsurunuzmuş gibi davranmaya başlayacak.

HTML

<div class="circle">
    <span>Some text</span>
</div>

CSS

.circle {
    position: relative; /* or absolute/fixed */
}

.circle:before {
    position: absolute;
    content: "";
    /* more styles: width, height, etc */
}

.circle:after {
    position: absolute;
    content: "";
    /* more styles: width, height, etc */
}

.circle span {
    /* not relative/absolute/fixed */
}

.circle span:before {
    position: absolute;
    content: "";
    /* more styles: width, height, etc */
}

2
Seçilen cevap doğru olsa da, bu benim durumum için uygun bir çözümdü. DOM'a daha fazla düğüm eklemeye gerek kalmadan birden çok psuedo öğesinin simülasyonunu yapabildim!
matt.kauffman23

@ matt.kauffman23 peki, nasıl simüle ettiğinizi anlatır mısınız?
BbIKTOP

1
@BbIKTOP üzgünüm az önce yorumunuzu gördüm. Benim durumumda, her zaman çocuğu olan bir model üzerinde çalışıyordum, bu yüzden şöyle bir şey elde ettim:.modal:first-child:before { …
matt.kauffman23

@ matt.kauffman23 6 yıldan fazla bir süre sonra böyle bir detayı hatırlamak için harika bir hafızanız var!
ChrisOdney

1

Bunu kullanarak çözdüm:

.element:before {
    font-family: "Font Awesome 5 Free" , "CircularStd";
    content: "\f017" " Date";
}

Simge için "font awesome 5 free" yazı tipi ailesini kullanarak ve ardından, tekrar kullandığımız yazı tipini belirtmek zorundayız çünkü bunu yapmazsak, gezgin varsayılan yazı tipini (times new roman veya benzeri bu).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.