Bir CSS sınıfı bir veya daha fazla sınıfı devralabilir mi?


736

Çok uzun süredir web programcısı olduğum için ve bu sorunun cevabını bilmediğim için aptal hissediyorum, aslında umarım bu mümkün ve cevap olduğunu düşündüğümden çok bilmiyordum (ki bu mümkün değil) .

Benim sorum, başka bir CSS sınıfından (veya birden fazla) "miras alan" bir CSS sınıfı oluşturmanın mümkün olup olmadığıdır.

Örneğin, diyelim ki:

.something { display:inline }
.else      { background:red }

Ne yapmak istiyorum böyle bir şey:

.composite 
{
   .something;
   .else
}

burada ".composite" sınıfı hem satır içi hem de kırmızı bir arka plana sahiptir


3
miras yerine basamaklı hakkında daha fazla düşün, burada geçerli değil
blu

Yanıtlar:


427

LESS gibi , tarif ettiğinize benzer şekilde daha yüksek bir soyutlama düzeyinde CSS oluşturmanıza izin veren araçlar vardır .

Daha azı bu "Mixins"

Onun yerine

/* CSS */
#header {
  -moz-border-radius: 8px;
  -webkit-border-radius: 8px;
  border-radius: 8px;
}

#footer {
  -moz-border-radius: 8px;
  -webkit-border-radius: 8px;
  border-radius: 8px;
}

Söyleyebilirdin

/* LESS */
.rounded_corners {
  -moz-border-radius: 8px;
  -webkit-border-radius: 8px;
  border-radius: 8px;
}

#header {
  .rounded_corners;
}

#footer {
  .rounded_corners;
}

37
Vay be, LESS tam olarak aradığım şey ... yerel olarak desteklenmemesi ve Ruby'de yazılmış olması utanç verici (ASP.NET MVC kullanıyorum)
Joel Martinez

1
Evet, ASP.NET dünyasındayım, bu yüzden üretim iş akışımın içine taşınmadım.
Larsenal

Daha az güzel ve cazip ... ama aynı iş akışında CSSEdit ile kullanmakta başarılı olamadım - bu yüzden henüz tam olarak benimsemedim.
Ryan Florence

1
Evet DAHA az tatlı, değil mi? Aslında burada bir .NET bağlantı noktası üzerinde çalışıyordum: nlesscss.codeplex.com .
Owen

77
buna google üzerinden ulaşmanız durumunda: .Net portu artık burada
Eonasdan

310

Tek bir DOM öğesine birden fazla sınıf ekleyebilirsiniz, ör.

<div class="firstClass secondClass thirdclass fourthclass"></div>

Daha sonraki sınıflarda verilen (veya daha spesifik olan) kurallar geçersiz kılınır. Yani fourthclassbu örnekte hüküm sürüyor.

Kalıtım CSS standardının bir parçası değildir.


12
hangi sınıfın, son sınıfların mı yoksa birinci sınıfların mı ve çapraz tarayıcı davranışının güvenli olup olmadığını biliyor musunuz? Diyelim ki .firstClass {font-size:12px;} .secondClass {font-size:20px;}son font-sizeolacak 12pxya 20pxda bu çapraz tarayıcı güvenli olacak mı?
Marco Demaio

27
Seçicide en yüksek özgüllüğe sahip olan kural kazanacaktır. Standart özgüllük kuralları geçerlidir; örneğinizde, "birinci" ve "ikinci" aynı spesifikliğe sahip olduğundan, CSS'de daha sonra açıklanan kural kazanacaktır.
Matt Bridges

19
Bu sorunu çözmek için saf CSS (LESS yerine) kullanma fikrini seviyorum.
Alex

8
Ayrıca birden fazla sınıf birden çok kez yazmama fikrini seviyorum - Hangi O (n ^ 2) iş :)
Gizli

3
Üçüncü taraf bir lib kullanıyorsam ve sağladığı tasarımı / HTML'yi değiştirmek istiyorsam, ancak bu lib'deki dahili css dosyalarını değiştiremezsem ne olur? Orada css derslerinde bir çeşit mirasa ihtiyacım olacaktı.
Shivam

112

Evet, ama tam olarak bu sözdizimiyle değil.

.composite,
.something { display:inline }

.composite,
.else      { background:red }

7
Bu berbat, ama en azından buna sahip olduğumuz için mutluyum!
Pacerier

3
Neden berbat? çok iyi görünüyor. Virgül sembolü ile less.js çözümü arasındaki farkı anlayamıyorum.
Canlandırıcı

21
Çünkü .something ve .else sınıfları farklı dosyalardaysa ve bunları değiştiremezseniz, sıkışıp kalırsınız.
Alexandre Mélard

8
Bu doğru cevaptı çünkü soruyu saf CSS sözdizimi kullanarak yanıtladı. Ancak daha az cevap bilmek iyidir.
raddevus

1
Bu istisna cevap olmalıdır.
eaglei22

66

Ortak özniteliklerinizi bir arada tutun ve belirli öznitelikleri (veya geçersiz kılma) yeniden atayın.

/*  ------------------------------------------------------------------------------ */   
/*  Headings */ 
/*  ------------------------------------------------------------------------------ */   
h1, h2, h3, h4
{
    font-family         : myfind-bold;
    color               : #4C4C4C;
    display:inline-block;
    width:900px;
    text-align:left;
    background-image: linear-gradient(0,   #F4F4F4, #FEFEFE);/* IE6 & IE7 */
}

h1  
{
    font-size           : 300%;
    padding             : 45px 40px 45px 0px;
}

h2
{
    font-size           : 200%;
    padding             : 30px 25px 30px 0px;
}

2
Bu ideal bir çözüme çok yakın, umarım insanlar az oy aldığı için bunu atmazlar. Aslında, "CSS mirası" ile ilgili en zorlu konulardan biri, genellikle zaten yapılmış, büyük bir web yazılımı (örneğin, bir e-ticaret veya bir blog PHP ünlü yazılımı) almanız ve yerel olarak kazandıran PHP kodunu kullanmalarıdır. t Çıktıkları HTML öğelerine birden fazla sınıf eklemek. Bu, dolaşmaya ve kaynak koduyla uğraşmaya zorlar (daha sonra yükseltme yaparsanız değişiklikleri kaybedersiniz) ve bu ek sınıfların çıktısını almanızı sağlar. Bu yaklaşımla, sadece CSS dosyasını düzenlersiniz!
Dario Fumagalli

3
Tam da aradığım şey buydu. Aynı yaklaşımın CSS Seçicileri ile çalışacağı hiçbir şeye değmez mi? h1, h2, etcBelirtmek yerine.selector1, .selector2, .etc
JeffryHouser

Bunun tam olarak önerilen varsayılan html stil sayfalarında w3 tarafından kullanılan yaklaşım olduğunu söylemek istedim: [w3 CSS2]: w3.org/TR/CSS2/sample.html . Ben de nasıl css kodu düzenlemek için bir kavrama almak için çalışıyorum ve paradigma tipik nesne yönelmiş miras ile karşılaştırıldığında ters gibi görünüyor: hangi öğeleri hangi öznitelik devralan belirtmek için sınıfları (veya, daha genel seçiciler) kullanın ancak öznitelikleri miras alırsınız (en azından hiyerarşi mantıksal olarak en kolay şekilde bu şekilde olabilir), ardından gerektiğinde daha spesifik seçicilerdeki öznitelikleri geçersiz kılın.
Nathan Chappell

51

Bir öğe birden fazla sınıf alabilir:

.classOne { font-weight: bold; }
.classTwo { font-famiy:  verdana; }

<div class="classOne classTwo">
  <p>I'm bold and verdana.</p>
</div>

Ve bu ne yazık ki alacağınız kadar yakın. Bir gün sınıf takma adlarıyla birlikte bu özelliği görmek isterim.


45

Hayır böyle bir şey yapamazsın

.composite 
{
   .something;
   .else
}

Bu, OO anlamında "sınıf" adları değildir. .somethingve .elsesadece seçiciler değiller.

Ancak bir öğe üzerinde iki sınıf belirtebilirsiniz

<div class="something else">...</div>

ya da başka bir kalıtım biçimine bakabilirsiniz

.foo {
  background-color: white;
  color: black;
}

.bar {
  background-color: inherit;
  color: inherit;
  font-weight: normal;
}
<div class="foo">
  <p class="bar">Hello, world</p>
</div>

Paragrafların arka plan rengi ve rengi, ekteki div içindeki .foostil ayarlarından miras alınır . Tam W3C spesifikasyonunu kontrol etmeniz gerekebilir. inherityine de çoğu özellik için varsayılan değerdir ancak tümü için geçerli değildir.


1
Evet, bu (ilk bölüm) CSS'yi 20. yüzyılda ilk duyduğumda beklentimdi ... ve hala sahip değiliz, css uygulanmadan hemen önce statik olarak oluşturulabilirken bazı dinamik şeyler üzerinde performans yakıyorlar ve değişken ihtiyacının yerini alır (statik "değişkenler")
neu-rah

30

Ben aynı sorunla karşılaştı ve bir sınıf diğer sınıfları devralabilir gibi görünmesini sağlamak için bir JQuery çözümü kullanarak sona erdi.

<script>
    $(function(){
            $(".composite").addClass("something else");
        });
</script>

Bu, "bileşik" sınıfındaki tüm öğeleri bulur ve öğelere "bir şey" ve "başka" sınıflarını ekler. Yani böyle bir şey şöyle <div class="composite">...</div>sonuçlanacak:
<div class="composite something else">...</div>


1
Bu çözümle ilgili sorun, varolan tüm denetimler için geçerli olmasıdır, bu çağrıdan sonra denetimi oluşturursanız, yeni sınıfa sahip olmaz.
LuisEduardoSP

27

SCSS verilen örneğin yolu, gibi bir şey olacaktır:

.something {
  display: inline
}
.else {
  background: red
}

.composite {
  @extend .something;
  @extend .else;
}

Daha fazla bilgi, sass temellerini kontrol edin


Buna kıyasla katma değer nedir? .composite,.something { display:inline }ve.composite,.else { background:red }
Pavel Gatnar

2
@PavelGatnar Sen tanımlarını yeniden verebilecek .somethingve .elsebaşka css tanımlarında.
Alter Lagos

16

Yapabileceğiniz en iyi şey bu

CSS

.car {
  font-weight: bold;
}
.benz {
  background-color: blue;
}
.toyota {
  background-color: white;
}

HTML

<div class="car benz">
  <p>I'm bold and blue.</p>
</div>
<div class="car toyota">
  <p>I'm bold and white.</p>
</div>

12

Unutmayın:

div.something.else {

    // will only style a div with both, not just one or the other

}

1
im arıyorum değil, ama bu benim için yapıcı n__n
AgelessEssence

7

Css dosyasında:

p.Title 
{
  font-family: Arial;
  font-size: 16px;
}

p.SubTitle p.Title
{
   font-size: 12px;
}

2
Peki sonuç ne olacak font-size?
abatishchev

Yazı tipi boyutu "p.Title" için 12 piksel olacaktır, çünkü dosyadaki ilk dosyadan sonra tanımlanmıştır. ilk yazı tipi boyutunu geçersiz kılar.
YWE

@YWE: Bu, bu cevapta yazılanlarla karşılaştırıldığında bildirimlerin aslında başka bir yol olması gerektiği anlamına mı geliyor (en azından açıklayıcı olmak istiyorsak)? En son tanımlanan geçerli olursa font-size: 16px, asla etkili olamaz, değil mi?
VEYA Haritacı

@ ORMapper - genellikle olan ilk bildirim, birden çok sayfa tarafından paylaşılan ortak bir css dosyasındadır. Daha sonra ikinci bildirim yalnızca belirli sayfalarda kullanılan ikinci bir css dosyasında bulunur. Ve ortak css dosyasından sonra içe aktarılır . Bu sayfalar, "son görülme" değerini kullanır 12px.
ToolmakerSteve

7

Bu sorunun artık çok eski olduğunu anlıyorum ama işte burada hiçbir şey yok!

Amaç, yerel bir çözüm olarak birden çok sınıfın özelliklerini ima eden tek bir sınıf eklemekse, JavaScript / jQuery kullanmanızı öneririm (jQuery gerçekten gerekli değil ama kesinlikle yararlıdır)

Eğer varsa, örneğin .umbrellaClass"devralır" o .baseClass1ve .baseClass2bazı JavaScript hazır o yangınlar olabilir.

$(".umbrellaClass").addClass("baseClass1");
$(".umbrellaClass").addClass("baseClass2");

Şimdi tüm unsurları .umbrellaClassher ikisinin de tüm özelliklerine sahip olacaktır .baseClass. OOP mirası gibi .umbrellaClass, kendi özelliklerine sahip olabileceğini veya olmayabileceğini unutmayın.

Buradaki tek uyarı, bu kod tetiklendiğinde var olmayacak dinamik olarak oluşturulan öğeler olup olmadığını düşünmektir, ancak bunun çevresinde de basit yollar vardır.

Berbat css yerel mirasa sahip değil.


1
Bu yaklaşım zaten ileri sürülmüştür @ DHoover en cevabı 2013 den
Bryan

6

Mükemmel zamanlama : Bu sorudan e-postalarıma gittim, Less , Ruby kütüphanesi hakkında başka şeyler de yapan bir makale bulmak için :

Yana super tıpkı görünüyor footer, ancak farklı bir yazı tipiyle, ben (onlar mixin diyoruz) bunları da beyanlarını eklemeyi söylemek için daha az sınıf içerme tekniğini kullanacağız:

#super {
  #footer;
  font-family: cursive;
}

LESS'in beni daha fazla şaşırtamayacağını düşündüğümde ... Biçimlendirmeyi böyle bir bloktan içe aktarabileceğimi bilmiyordum. Harika bir ipucu.
Daniel Rippstein

4

Ne yazık ki, CSS, C ++, C # veya Java gibi programlama dillerinin yaptığı şekilde 'kalıtım' sağlamaz. Bir CSS sınıfını bildiremez ve başka bir CSS sınıfıyla genişletemezsiniz.

Bununla birlikte, işaretlemenizdeki bir etikete tek bir sınıftan fazlasını uygulayabilirsiniz ... bu durumda tarayıcı tarafından hangi gerçek stillerin uygulanacağını belirleyen karmaşık bir kurallar kümesi vardır.

<span class="styleA styleB"> ... </span>

CSS, işaretlemenize göre uygulanabilecek tüm stilleri arayacak ve bu çoklu kurallardan CSS stillerini bir araya getirecektir.

Tipik olarak stiller birleştirilir, ancak çakışmalar ortaya çıktığında, daha sonra bildirilen stil genellikle kazanır (stillerden birinde!! Önemli özniteliği belirtilmedikçe, bu durumda kazanır). Ayrıca, doğrudan bir HTML öğesine uygulanan stiller, CSS sınıfı stillerine göre önceliklidir.


Cevabınız benim için Google'da ilk sonuç olarak geldi ve yardımcı oldu. Bununla birlikte, sizin için bir ipucum var - bir çözüm sunuyorsanız, cümlelere olumsuz bir şekilde başlamaktan kaçınmak en iyisidir (Maalesef, CSS kalıtım sağlamaz ..) Uygun sabrınız olan herkesin güzel çözümünüzü keşfetmek için okuyacağını biliyorum. ancak bazen insanlar sabrınız azalır ve yapmaya çalıştıkları şeyin imkansız olduğu sonucuna varırlar. Başkalarına yardım etmenin en iyi şansı için, "CSS'nin mirası olmasa da, ihtiyacınız olan şeyi ..." ile
başarabilirsiniz.


4

Bu CSS'de mümkün değil.

CSS'de desteklenen tek şey başka bir kuraldan daha spesifik olmaktır:

span { display:inline }
span.myclass { background: red }

Sınıf "myclass" olan bir span her iki özelliğe de sahip olacaktır.

Başka bir yol da iki sınıf belirtmektir:

<div class="something else">...</div>

"Else" stili, "bir şey" stilini geçersiz kılar (veya ekler)


1 dosyadaki tüm stiller için CSS'de kalıtım benzeri bir çözüm var, yazıma bakın.
Pavel Gatnar

3

Bir öğeye bu sınıf = "başka bir şey" gibi bir öğeye birden fazla CSS sınıfı uygulayabilirsiniz


3

Diğerlerinin söylediği gibi, bir öğeye birden çok sınıf ekleyebilirsiniz.

Ama asıl mesele bu değil. Kalıtım hakkında sorunuzu alıyorum. Asıl mesele CSS'deki miras yapılmasıdır değil sınıfları aracılığıyla, ancak eleman hiyerarşileri yoluyla. Bu nedenle, devralınan özellikleri modellemek için bunları DOM'daki farklı düzeylerde öğelere uygulamanız gerekir.


Tüm kompozisyon sınıfı zincirini kullanmak yerine kalıtım benzeri CSS tanımları oluşturmak daha iyidir, yazıma bakın.
Pavel Gatnar

2

Ben de bunu deli gibi arıyordum ve sadece farklı şeyler deneyerek anladım: P ... Peki bunu şöyle yapabilirsiniz:

composite.something, composite.else
{
    blblalba
}

Aniden benim için çalıştı :)


2

Belirli durumlarda "yumuşak" bir miras yapabilirsiniz:

.composite
{
display:inherit;
background:inherit;
}

.something { display:inline }
.else      { background:red }

Bu yalnızca .composite sınıfını bir alt öğeye ekliyorsanız çalışır. .Composite içinde belirtilmeyen hiçbir değer açıkça miras alınmadığından "yumuşak" kalıtımdır. "Inherit" yerine "inline" ve "red" yazmanın daha az karakter olacağını unutmayın.

İşte özelliklerin listesi ve bunu otomatik olarak yapıp yapmadıkları: https://www.w3.org/TR/CSS21/propidx.html


2

Doğrudan miras mümkün olmasa da.

Bir üst etiket için bir sınıf (veya id) kullanmak ve daha sonra alt etiket davranışını heirarchy'sinden değiştirmek için CSS birleştiricileri kullanmak mümkündür.

p.test{background-color:rgba(55,55,55,0.1);}
p.test > span{background-color:rgba(55,55,55,0.1);}
p.test > span > span{background-color:rgba(55,55,55,0.1);}
p.test > span > span > span{background-color:rgba(55,55,55,0.1);}
p.test > span > span > span > span{background-color:rgba(55,55,55,0.1);}
p.test > span > span > span > span > span{background-color:rgba(55,55,55,0.1);}
p.test > span > span > span > span > span > span{background-color:rgba(55,55,55,0.1);}
p.test > span > span > span > span > span > span > span{background-color:rgba(55,55,55,0.1);}
p.test > span > span > span > span > span > span > span > span{background-color:rgba(55,55,55,0.1);}
<p class="test"><span>One <span>possible <span>solution <span>is <span>using <span>multiple <span>nested <span>tags</span></span></span></span></span></span></span></span></p>

Örnek gibi çok sayıda açıklık kullanmanızı tavsiye etmem, ancak bu sadece bir kavram kanıtıdır. CSS'yi bu şekilde uygulamaya çalışırken ortaya çıkabilecek birçok hata var. (Örneğin, metin süsleme türlerini değiştirme).


2

Less ve Sass, CSS dilini değerli şekillerde genişleten CSS ön işlemcileridir. Sundukları pek çok iyileştirmeden sadece aradığınız seçenek. Less ile çok iyi cevaplar var ve Sass çözümünü ekleyeceğim.

Sass, bir sınıfın diğerine tam olarak genişletilmesini sağlayan genişletme seçeneğine sahiptir. Bu makalede okuyabileceğiniz uzatma hakkında daha fazla bilgi



1

CSS gerçekten değil yapmak ne istediğini. Kompozit fikri akılda tutarak kurallar yazmak istiyorsanız, pusulayı kontrol etmek isteyebilirsiniz . Daha önce bahsedilen Daha Az'a benzeyen bir stil sayfası çerçevesi.

Mixins ve tüm bu iyi iş yapmanızı sağlar.


Yukarıda daha fazla ayrıntı ekleme, Pusula Sass tutucular uzatın gelmez aracılığıyla aka Katmalar vs uzatın hakkında daha detaylı bilgi yer tutucuları
Abhijeet

1

Bahsedilen (mükemmel) yayınlardan memnun olmayanlar için, programlama becerilerinizi bir değişken (PHP veya hangisi) yapmak ve birden fazla sınıf adını depolamasını sağlamak için kullanabilirsiniz.

Bu benim karşılaşabileceğim en iyi kesmek.

<style>
.red { color: red; }
.bold { font-weight: bold; }
</style>

<? define('DANGERTEXT','red bold'); ?>

Ardından, global değişkeni sınıf adlarından ziyade istediğiniz öğeye uygulayın

<span class="<?=DANGERTEXT?>"> Le Champion est Ici </span>


1

Css sınıflarını nesne yönelimli sınıflar olarak düşünmeyin, bunları bir html öğesinin hangi nitelik sınıflarına göre biçimlendirildiğini belirtmek için diğer seçiciler arasında yalnızca bir araç olarak düşünün . Parantezler arasındaki her şeyi öznitelik sınıfı olarak düşünün ve sol taraftaki seçiciler , öznitelik sınıfından öznitelikleri miras almak için seçtikleri öğelere söyler . Misal:

.foo, .bar { font-weight : bold; font-size : 2em; /* attribute class A */}
.foo { color : green; /* attribute class B */}

Bir öğeye öznitelik verildiğinde, öğeyi class="foo"sınıftan miras alan nitelikler olarak .foodeğil, A sınıfı öznitelik ve B sınıfı öznitelik olarak düşünmek yararlıdır . Yani, kalıtım grafiği bir seviye derinliktedir, unsurlar nitelik sınıflarından türetilir ve seçiciler kenarların nereye gittiğini belirtir ve rakip nitelikler olduğunda (yöntem çözünürlük sırasına benzer) önceliği belirler.

resim açıklamasını buraya girin

Programlamanın pratik anlamı şudur. Yukarıda verilen stil sayfası var ki, ve yeni bir sınıf eklemek istediğiniz .bazaynı olmalıdır, font-sizeolarak .foo. Saf çözüm şu olurdu:

.foo, .bar { font-weight : bold; font-size : 2em; /* attribute class A */}
.foo { color : green; /* attribute class B */}
.baz { font-size : 2em; /* attribute class C, hidden dependency! */}

resim açıklamasını buraya girin

Ne zaman iki kere bir şeyler yazmak zorunda her zaman çok kızıyorum! Sadece iki kez yazmak zorunda mı, şimdi programlama belirten bir yolu yoktur .foove .bazaynı olmalıdır font-sizeve bir oluşturduk gizli bağımlılık! Yukarıdaki paradigmam, A sınıfıfont-size öznitelik özniteliğini özetlemem gerektiğini önerir :

.foo, .bar, .baz { font-size : 2em; /* attribute base class for A */}
.foo, .bar { font-weight : bold; /* attribute class A */}
.foo { color : green; /* attribute class B */}

resim açıklamasını buraya girin

Buradaki ana şikayet, şimdi seçmeleri gereken öğelerin de öznitelik taban sınıfı A'dan öznitelikleri miras alması gerektiğini belirtmek için A özniteliğinden her seçiciyi yeniden yazmam gerektiğidir . Yine de alternatifler, her şey değiştiğinde gizli bağımlılıkların olduğu her öznitelik sınıfını düzenlemeyi veya bir üçüncü taraf aracını kullanmayı hatırlamak zorundadır . İlk seçenek tanrıyı güldürüyor, ikincisi kendimi öldürmek istiyor.


0

LESS'ten daha güçlü bir metin ön işlemcisi istiyorsanız, PPWizard'a göz atın:

http://dennisbareis.com/ppwizard.htm

Web sitesini uyarmak gerçekten iğrenç ve küçük bir öğrenme eğrisi var, ancak makrolar aracılığıyla hem CSS hem de HTML kodu oluşturmak için mükemmel. Daha fazla web kodlayıcısının neden kullanmadığını hiç anlamadım.


11
Web sitesi olan gerçekten iğrenç.
nanofarad

Bir html işlemci için bir web sitesinde bir tür ironik!
Ben Thurley

2
Evet, web sitesi iğrenç, ama bundan daha fazlası. Okumak zor ve kafam da ağrıyor!
ArtOfWarfare

1
Windows 3.1 - XP, lol ile uyumlu iyi bir şey
Alter Lagos

Tuhaf, standart dışı bir araç, hoşuna gitmiyor.
berkus

-6

Eğer php üzerinden .css dosyalarınızı önişlemek istediğinizi elde edebilirsiniz. ...

$something='color:red;'
$else='display:inline;';
echo '.something {'. $something .'}';
echo '.else {'. $something .'}';
echo '.somethingelse {'. $something  .$else '}';

...

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.