CSS kalıtımını nasıl engellerim?


94

Kenar çubuğumda iç içe geçmiş listeleri (<ul> ve <li> etiketleri) kullanan hiyerarşik bir gezinme menüsüne sahibim. Liste öğeleri için halihazırda stilleri olan önceden hazırlanmış bir tema kullanıyorum, ancak üst düzey öğelerin stilini değiştirmek ama alt öğelere uygulanmasını istemiyorum. Stilleri üst düzey liste öğesi etiketine, bu stillerin alt öğe listesi öğelerine doğru basamaklandırılmasına sahip OLMADAN uygulamanın kolay bir yolu var mı? Alt öğelere açıkça geçersiz kılan stiller ekleyebileceğimi anlıyorum, ancak "bu stilleri bu sınıfa uygulayın ve basamaklandırmayın herhangi bir alt öğeye kadar onları ". İşte kullandığım html:

<ul id="sidebar">
  <li class="top-level-nav">
    <span>HEADING 1</span>
    <ul>
      <li>sub-heading A</li>
      <li>sub-heading B</li>
    </ul>
  </li>
  <li class="top-level-nav">
    <span>HEADING 2</span>
    <ul>
      <li>sub-heading A</li>
      <li>sub-heading B</li>
    </ul>
  </li>
</ul>

Dolayısıyla, CSS'nin zaten #sidebar ulve için stilleri var #sidebar ul li, ancak #sidebar .top-level-navalt alt öğelerine kadar GELİŞMEYEN ek stiller eklemek istiyorum . Bunu basitçe yapmanın bir yolu var mı yoksa tüm stilleri yeniden düzenlemem mi gerekiyor, böylece mevcut stillerin #sidebar ulartık belirli sınıflara özel olması gerekiyor mu?


2
Sitede benzer sorular aradım ve hiçbir şey bulamadım (yok demedim ama baktım). Ne olduğunu biliyorsanız, lütfen beni ona yönlendirir misiniz? Teşekkürler!

1
stackoverflow.com/questions/747308/breaking-css-inheritance | hemen hemen Matthew'un cevapladığını söylüyor.
JasonV

1
Bu yüzden, cevabın "hayır, bunu basitçe yapmanın bir yolu yok - alt öğedeki her stil ayarını manuel olarak geçersiz kılmanız gerekiyor" olarak alıyorum - bunu doğru mu yorumluyorum? Tekrar teşekkürler.

Yanıtlar:


38

Henüz üst öğe seçiciler (veya Shaun Inman'ın dediği gibi , nitelikli seçiciler ) yoktur, bu nedenle, üst liste öğelerindeki stilleri geçersiz kılmak için alt liste öğelerine stiller uygulamanız gerekecektir.

Basamaklama, Basamaklı Stil Sayfalarının tüm noktası, dolayısıyla adıdır.


13
Bu bilgiler, IE8'den beri güncel değildir. Silviu Postavaru'nun cevabına bakın. Lütfen çeki daha uygun yanıtla değiştirmeyi düşünün.
tmuecksch

lol, basamaklı olmanın öz olduğuna katılıyorum. Ancak, farklı olması amaçlanan belirli bir ebeveynden yayılmayı durdurmanın bir yolu olmalıdır.
Obay Abd-Algader

72

Ya çocuk seçiciyi kullanırsınız

Yani kullanarak

#parent > child

Stiller uygulanacak sadece birinci seviye çocukları yapacak. Maalesef IE6 çocuk seçiciyi desteklemiyor.

Aksi takdirde kullanabilirsiniz

#parent child child

Altta birden fazla düzey olan çocuklara başka belirli stiller ayarlamak için.


1
Bunu bana JSFiddle'da çalışırken gösterebilir misiniz? Satır içi blok görüntülenen bir div'i ortalamaya çalıştım, ancak yine de metni div içinde ortalar.
Calmarius

41

Denilen bir özellik vardır alliçinde CSS3 miras modülü . Şu şekilde çalışır:

#sidebar ul li {
  all: initial;
}

2016-12 itibariyle, IE / Edge ve Opera Mini dışındaki tüm tarayıcılar bu özelliği desteklemektedir.


4
@AndriusDobrotinas sonunda desteklenecek mi? Yorumunuzu tam olarak anlamış değilim. PostCSS kullanıyorsanız, bu özelliği sağlayan bir PostCSS eklentisi vardır: github.com/maximkoretskiy/postcss-initial
Boldewyn

1
@AndriusDobrotinas, Yorumunuz çok yapıcı değil. Cevap topluluğun iyiliği için gönderildi; yararını görmek için elinizden geleni yapın.
Cody

2
Şu an itibariyle, yalnızca IE ve Opera Mini desteklemiyor, diğer tüm büyük tarayıcılar destekliyor
Legends

@Boldewyn, bağlantılı w3
belgesinden anlaşılabildiği

@webeno cevabı yazdığımda vardı : w3.org/TR/2013/WD-css3-cascade-20130103/#all-shorthand Eski defaultile yeni arasında bazı ince farklar var gibi görünüyor unset, ama şu anda ben ' Daha fazla araştırma yapacak vaktim yok. Güncellemek için cevabı düzenlemekten çekinmeyin.
Boldewyn

26

Alt stilleri varsayılana döndürmek için * seçiciyi kullanabilirsiniz

misal

#parent {
    white-space: pre-wrap;
}

#parent * {
    white-space: initial;
}

1
Bu çok güzel bir çözüm - özellikle ebeveynin sınıfını bilmiyorsanız.
BurninLeo

Sanırım bunun cevabını biliyorum ama bunu satır içi olarak ayarlamanın bir yolu var mı? <div id="parent" style="white-space:pre-wrap;*white-space:initial;"/>
1.21 gigawatt

11

İframe ile sarma, üst css'yi geçersiz kılar.


2
Bunun en kötü yapılmış cevap olması komik çünkü teknik olarak CSS kalıtımını durdurmanın tek fiziksel yolu bu. Bunu bu şekilde kullanmanız gerektiğini savunduğumdan değil.
davidelrizzo

2
CSS ile fizikselleşmemeyi öneririm, ait olduğu sanal dünyada bırakın!
michaelward82

Aslında eklemek iframealt bileşenimi görünmez yaptı. Düşünceler?
Kevin Ghaboosi

5

Kısa cevap: Hayır, CSS kalıtımını önlemek mümkün değildir. Yalnızca üst öğe üzerinde ayarlanan stilleri geçersiz kılabilirsiniz. Spesifikasyona bakın:

Bir HTML belgesindeki her öğe, bir üst öğesi olmayan kök öğe ( html) dışında, kendi üst öğesinden devralınabilir tüm özellikleri devralır . - W3C

Miras alınan her bir mülkü geçersiz kılmak dışında. Ayrıca initialanahtar kelime de kullanabilirsiniz , örn color: initial;. Ayrıca all, örneğin all: initial;tüm özellikleri bir kerede sıfırlayacak şekilde birlikte kullanılabilir . Misal:

.container {
  color: blue;
  font-style: italic;
}
.initial {
  all: initial;
}
<div class="container">
  The quick brown <span class="initial">fox</span> jumps over the lazy dog
</div>

Kullanabilir miyim? E göre tarayıcı destek tabloları

  • all (Şu anda hem IE hem de Edge'de destek yok, diğerleri iyidir)
  • initial (Şu anda IE'de destek yok, diğerleri iyi)

Bazı durumlarda doğrudan çocuk seçiciyi> kullanarak bunu yararlı bulabilirsiniz . Misal:

.list > li {
  border: 1px solid red;
  color: blue;
}
<ul class="list">
  <li>
    <span>HEADING 1</span>
    <ul>
      <li>sub-heading A</li>
      <li>sub-heading B</li>
    </ul>
  </li>
  <li>
    <span>HEADING 2</span>
    <ul>
      <li>sub-heading A</li>
      <li>sub-heading B</li>
    </ul>
  </li>
</ul>

Sınır stili, miras alınmayan bir özellik olduğu <li>gibi yalnızca doğrudan alt öğelere uygulanmıştır border. Ancak metin rengi, colormiras alınan bir özellik olarak tüm alt öğelere uygulanmıştır .

Bu nedenle, >kalıtımın engellenmesi söz konusu olduğunda , seçici yalnızca miras alınmayan özelliklerde yararlı olacaktır.


2

Bu davranışı "devre dışı bırakmak" için jQuery gibi bir şey kullanabilirsiniz, ancak css ve javascript'te görüntüleme mantığını elde ettiğiniz için bunun iyi bir çözüm olduğunu düşünmüyorum. Yine de, gereksinimlerinize bağlı olarak, jQuery'nin css araçlarının, özellikle IE6 için çalışmasını sağlamaya çalışıyorsanız, hayatı sizin için hacky css'i denemekten daha kolay hale getirdiğini görebilirsiniz.


2

Örneğin, XHTML belgesinde iki div'iniz varsa.

<div id='div1'>
    <p>hello, how are you?</p>
    <div id='div2'>
        <p>I am fine, thank you.</p>
    </div>
</div>

Sonra bunu CSS'de deneyin.

#div1 > #div2 > p{
    color: red;
}

yalnızca 'div2' paragrafını etkiler.

#div1 > p {
    color: red;
} 

yalnızca 'div1' paragrafını etkiler.


2

E'ler için sınıf referansına ihtiyacınız yok li. CSS beğenisine sahip olmak yerine

li.top-level-nav { color:black; }

Yazabilirsin

ul#sidebar > li { color:black; }

Bu, stili yalnızca likenar çubuğundan hemen inen e-postalara uygulayacaktır ul.


0

"#sidebar ul li" seçicisinde bunları varsayılan değerlerine geri döndürmeniz yeterlidir


Cevap için teşekkürler. Evet, onları alt öğenin tarzına geri getirebileceğimi anlıyorum, ancak bundan kaçınmaya çalışıyorum çünkü kendi oluşturmadığım bir tema kullanıyorum ve bir sürü zaman kazanabilir miyim diye merak ediyorum Her yere dağılmış ul'ler ve li'ler için tüm farklı stilleri bulmak ve ardından sitenin diğer alanlarındaki istenmeyen sonuçlar hakkında endişelenmek yerine, yalnızca bir "basamaklama: doğru" kuralı veya bunun gibi bir şey kullanarak .
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.