CSSクラスは1つ以上の他のクラスを継承できますか?


736

私は長い間Webプログラマーであり、この質問への答えを知らなかったのでは馬鹿げています。 。

私の質問は、別のCSSクラス(または複数)から「継承」するCSSクラスを作成できるかどうかです。

たとえば、次のようにしたとします。

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

私がしたいことは次のようなものです:

.composite 
{
   .something;
   .else
}

「.composite」クラスはインラインで表示され、背景が赤になります。


3
継承ではなくカスケードについてもっと考えてください。ここでは適用されません
blu

回答:


427

LESSなどのツールがあります。これを使用すると、記述したものと同様の抽象化のより高いレベルでCSSを作成できます。

これらを「ミックス」と呼ぶことは少ない

の代わりに

/* 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;
}

あなたは言えた

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

#header {
  .rounded_corners;
}

#footer {
  .rounded_corners;
}

37
すごい、LESSは私が探しているまさにほとんどです...それは、それがネイティブにサポートされていないことを恥だし、それはRubyで書かれていることを(私はASP.NET MVCを使用しています)
ジョエル・マルティネス

1
ええ、私もASP.NETの世界にいるので、運用ワークフローに移動していません。
ラルセナル2009年

Lessは美しく魅力的です...しかし、同じワークフローでCSSEditを使用してあまりうまくいかなかったため、まだ完全に採用していません。
ライアンフローレンス

1
ええLESSはかなり甘いですね。は実際にここで.NETポートに取り組んでいます:nlesscss.codeplex.com
オーウェン

77
グーグル経由でこれに到達した場合:.Netポートがここにあります
Eonasdan

310

たとえば、単一のDOM要素に複数のクラスを追加できます。

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

後のクラス(またはより具体的なクラス)で指定されたルールはオーバーライドされます。したがって、fourthclassその例ではそのようなものが優勢です。

継承はCSS標準の一部ではありません。


12
最後のクラスと最初のクラスのどちらが優勢であるか、そしてブラウザ間での動作が安全かを知っていますか?レッツは、我々が持っていると言う.firstClass {font-size:12px;} .secondClass {font-size:20px;}、その後、最終的にはなりますfont-sizeこと12px20pxと、このクロスブラウザの安全ですか?
Marco Demaio、

27
セレクターの特異性が最も高いルールが優先されます。標準の特異性規則が適用されます。あなたの例では、「first」と「second」は同じ特異性を持っているため、CSSで後で宣言されたルールが優先されます。
Matt Bridges、

19
この問題を解決するために(LESSの代わりに)純粋なCSSを使用するというアイデアが気に入っています。
Alex

8
また、複数のクラスを何度も入力しないというアイデアも気に入っています。これはO(n ^ 2)の作業です:)
秘密の

3
サードパーティのlibを使用していて、それが提供するデザイン/ HTMLを変更したいが、そのlibに組み込まれているcssファイルを変更できない場合はどうなりますか?そこでは、CSSクラスにある種の継承が必要になります。
Shivam 2017

112

はい、ただしその構文では正確ではありません。

.composite,
.something { display:inline }

.composite,
.else      { background:red }

7
これはひどいですが、少なくとも私たちがこれを持っていてうれしいです!
パチェリエ

3
なんでそれが悪いの?とてもいいようです。コンマ記号とless.jsソリューションの違いを理解できません。
2013年

21
.somethingクラスと.elseクラスが異なるファイルにあり、それらを変更できない場合は、行き詰まっているからです。
AlexandreMélard2014年

8
純粋なCSS構文を使用して質問に答えたので、これは正しい答えでした。答えが少ない方がいいです。
raddevus

1
これは例外的な答えになるはずです。
eaglei22 2017年

66

共通の属性をまとめて、特定の(またはオーバーライドする)属性を再度割り当てます。

/*  ------------------------------------------------------------------------------ */   
/*  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
これは理想的な解決策に非常に近いので、票が少なかったからといって人々がそれを捨てないように願います。実際、「CSS継承」に関する最も困難な問題の1つは、通常、すでに作成された巨大なWebソフトウェア(eコマースやブログのPHP有名なソフトウェアなど)を入手し、ネイティブで使用できないPHPコードを使用することです。 t出力されるHTML要素に複数のクラスを追加します。これにより、ソースコードをいじって(後でアップグレードすると変更が失われ)、追加のクラスが出力されるようになります。このアプローチでは、代わりにCSSファイルを編集するだけです!
Dario Fumagalli 2014

3
これはまさに私が探していたものでした。この同じアプローチがCSSセレクターで機能することは何の価値もありませんか?指定する代わりに、次のように指定するh1, h2, etcこともできます.selector1, .selector2, .etc
JeffryHouser

これは、w3が推奨するデフォルトのHTMLスタイルシート[w3 CSS2]:w3.org/TR/CSS2/sample.htmlで使用されているアプローチであるとコメントしたいと思います。私はまた、CSSコードを整理する方法を理解しようとしていますが、典型的なオブジェクト指向の継承と比べてパラダイムが逆になっているようです:クラス(またはより一般的にはセレクター)を使用して、どの要素がどの属性を継承するかを指定します。ただし、属性継承し(少なくとも、これは階層が論理的に最も簡単に存在する方法です)、必要に応じて、より具体的なセレクターで属性をオーバーライドします。
Nathan Chappell、

51

要素は複数のクラスを取ることができます:

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

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

そして、それは残念ながらあなたが手に入れようとしていることとほぼ同じです。いつかこのクラスエイリアスと一緒にこの機能を見たいです。


45

いいえ、あなたは次のようなことはできません

.composite 
{
   .something;
   .else
}

これは、オブジェクト指向の意味での「クラス」名ではありません。.somethingそして.else何よりも、単にセレクタがあります。

ただし、要素に2つのクラスを指定できます。

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

または別の形の継承を調べるかもしれません

.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>

段落backgroundcolorとcolorは、.fooスタイル設定されている囲んでいるdivの設定から継承されます。正確なW3C仕様を確認する必要がある場合があります。inheritとにかくほとんどすべてのプロパティのデフォルトですが、すべてではありません。


1
うん、これ(最初の部分)は、20世紀にCSSを初めて聞いたときの期待でした...そしてまだありません。CSSが適用される直前に静的に構成されていても、動的なものでパフォーマンスを燃やしています変数(静的な「変数」)の必要性を置き換える
neu-rah

30

私はこれと同じ問題に遭遇し、JQueryソリューションを使用して、クラスが他のクラスを継承できるように見せかけました。

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

これにより、クラス「composite」を持つすべての要素が見つかり、クラス「something」および「else」が要素に追加されます。のよう<div class="composite">...</div>に何かがそうなるでしょう:
<div class="composite something else">...</div>


1
このソリューションの問題は、既存のすべてのコントロールに当てはまることです。この呼び出しの後にコントロールを作成すると、新しいクラスがなくなります。
LuisEduardoSP

27

この例のSCSSの方法は、次のようになります。

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

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

詳細は、sassの基本を確認してください


これに比べて付加価値は何ですか? .composite,.something { display:inline }および.composite,.else { background:red }
Pavel Gatnar 2015

2
@PavelGatnarあなたは、の定義は再利用でき.something、および.else他のCSS定義では。
Alter Lagos

16

あなたができる最善はこれです

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>


7

Cssファイル:

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

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

2
では、結果はどうなるのfont-sizeでしょうか?
abatishchev

「p.Title」のフォントサイズは、ファイル内の最初のフォントの後に定義されているため、12pxになります。最初のフォントサイズを上書きします。
YWE、2012年

@YWE:それは、宣言がこの回答で書かれているものと比較して、実際には反対であることを意味しますか(少なくとも例として説明したい場合)。定義された最後のものが優勢である場合、font-size: 16px缶は決して効きません、そうですか?
またはMapper 2015

@ORMapper-通常、最初に行われる宣言は、複数のページで共有される共通のcssファイルにあります。次に、2番目の宣言は2番目のcssファイルにあり、特定のページでのみ使用されます。そして、共通のcssファイルの後にインポートされます。したがって、これらのページは「最後に確認された」値を使用し12pxます。
ToolmakerSteve

7

この質問は非常に古いことに気づきましたが、ここでは何も起こりません!

ネイティブソリューションとして、複数のクラスのプロパティを意味する単一のクラスを追加することを意図している場合は、JavaScript / jQueryを使用することをお勧めします(jQueryは実際には必要ありませんが、確かに役立ちます)。

あなたが持っている場合、例えば.umbrellaClass、それは「継承」していて、すぐに起動するJavaScriptを持っている可能性が.baseClass1あり.baseClass2ます。

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

これで、のすべての要素が.umbrellaClass両方.baseClassののすべてのプロパティを持ちます。OOP継承と同様に、.umbrellaClass、独自のプロパティがある場合とない場合があります。

ここでの唯一の注意点は、このコードが起動したときに存在しない動的に作成される要素があるかどうかを検討することですが、その周りにも簡単な方法があります。

ただし、cssには、ネイティブの継承はありません。


1
このアプローチは、すでにDHooverの@に提案されてきた答えは 2013年から
ブライアン

6

完璧なタイミング:この質問から私のメールに行って、Lessに関する記事を見つけました、特にこれを実行するRubyライブラリである:

super よう 見えますfooterが、フォントが異なるため、Lessのクラスインクルードテクニック(ミックスインと呼ばれます)を使用して、これらの宣言も含めるように指示します。

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

LESSがもう私を驚かせることはできないと思ったとき...このような別のブロックからフォーマットをインポートできるとは思いもしませんでした。素晴らしいヒント。
Daniel Rippstein、2014年

4

残念ながら、CSSは、C ++、C#、Javaなどのプログラミング言語のように「継承」を提供しません。CSSクラスを宣言してから、それを別のCSSクラスで拡張することはできません。

ただし、マークアップのタグに複数のクラスを適用することができます。この場合、ブラウザによって適用される実際のスタイルを決定する高度なルールセットがあります。

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

CSSは、マークアップに基づいて適用できるすべてのスタイルを探し、それらの複数のルールのCSSスタイルを組み合わせます。

通常、スタイルはマージされますが、競合が発生した場合、後で宣言されたスタイルが一般的に優先されます(いずれかのスタイルで!important属性が指定されている場合を除きます)。また、HTML要素に直接適用されたスタイルは、CSSクラススタイルよりも優先されます。


あなたの答えは私のためのグーグルの最初の結果として浮かび上がって、役に立ちました。とは言っても、私にはヒントがあります。ソリューションを提供している場合は、否定的な文の開始を避けるのが最善です(残念ながら、CSSは継承を提供しません。)適切な忍耐力を持つ人なら誰でもあなたの素敵なソリューションを見つけるために読んでくれるでしょう。しかし、忍耐力が不足していて、自分のやろうとしていることが不可能であるという結論に急ぐ場合もあります。他の人を助ける最善のチャンスとして、「CSSには継承がありませんが、必要なことを達成することができます...」のようなものから始めることができます
egmfrs

4

SASSもあり、http: //sass-lang.com/にあります。@extendタグと、ミックスインタイプシステムがあります。(ルビー)

それはLESSの競争相手のようなものです。


4

CSSではそれは不可能です。

CSSでサポートされている唯一のものは、別のルールよりも具体的です。

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

クラス「myclass」のスパンには両方のプロパティがあります。

もう1つの方法は、2つのクラスを指定することです。

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

「else」のスタイルは「something」のスタイルをオーバーライド(または追加)します


1つのファイルのすべてのスタイルについて、CSSに継承のようなソリューションがあります。私の投稿を参照してください。
Pavel Gatnar 2015

3

このclass = "something other"のようなものによって、要素に複数のCSSクラスを適用できます


3

他の人が言ったように、要素に複数のクラスを追加できます。

しかし、それは本当の意味ではありません。継承についての質問を受け取ります。本当のポイントは、CSSの継承がクラスではなく、要素階層を通じて行われることです。したがって、継承された特性をモデル化するには、それらをDOMの要素のさまざまなレベルに適用する必要があります。


すべてのコンポジションクラスチェーンを使用するのではなく、継承のようなCSS定義を作成することをお勧めします。私の投稿を参照してください。
Pavel Gatnar 2015

2

私はクレイジーなものも探していましたが、別のことを試してみてそれを見つけました:P ...

composite.something, composite.else
{
    blblalba
}

それは突然私のために働きました:)


2

特定の状況では、「ソフト」継承を行うことができます。

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

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

これは、.compositeクラスを子要素に追加する場合にのみ機能します。.compositeで指定されていない値は明らかに継承されないため、これは「ソフト」継承です。「継承」の代わりに「インライン」と「赤」を書くだけでも、文字が少なくなることに注意してください。

プロパティのリストと、これらが自動的に実行されるかどうかを次に示します。https//www.w3.org/TR/CSS21/propidx.html


2

直接の継承は不可能ですが。

親タグにクラス(またはID)を使用し、CSSコンビネーターを使用して、子タグの動作を階層から変更することができます。

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>

例のように多くのスパンを使用することはお勧めしませんが、これは概念の証明にすぎません。この方法でCSSを適用しようとすると、まだ多くのバグが発生する可能性があります。(たとえば、テキスト装飾タイプの変更)。


2

LessとSassは、CSS言語を貴重な方法で拡張するCSSプリプロセッサです。それらが提供する多くの改善の1つは、あなたが探しているオプションにすぎません。Lessには非常に良い答えがいくつかあります。Sassソリューションを追加します。

Sassには、1つのクラスを別のクラスに完全に拡張できる拡張オプションがあります。この記事で読むことができる拡張の詳細



1

CSSはあなたが求めいることを実際には行いません。その複合的なアイデアを念頭に置いてルールを作成したい場合は、コンパスをチェックしてください。これは、すでに述べたLessに似たスタイルシートフレームワークです。

それはあなたがmixinとそのすべての良いビジネスをすることを可能にします。


上記に詳細を追加すると、Compass aka Sassは、Extend、PlaceHolders Mixins対Extendを介して実行します。PlaceHoldersの
Abhijeet

1

上記の(優れた)投稿に満足していない場合は、プログラミングスキルを使用して変数(PHPまたはいずれか)を作成し、複数のクラス名を格納できます。

それは私が思いつくことができる最高のハックです。

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

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

次に、クラス名自体ではなく、目的の要素にグローバル変数を適用します

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


1

css クラスをオブジェクト指向のクラスと考えないでください。それらは、html要素のスタイルを設定する属性クラスを指定するための他のセレクターの中での単なるツールと考えてください。中かっこの間のすべてを属性クラス考えます。左側のセレクタは、属性クラスから属性を継承するように選択した要素に指示します。例:

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

要素に属性が指定されているclass="foo"場合、それをクラス.fooから属性を継承するのではなく、属性クラスAおよび属性クラスBから継承すると考えると便利です。つまり、継承グラフは1レベルの深さであり、属性クラスから派生する要素と、エッジがどこに行くかを指定するセレクターと、競合する属性がある場合に優先順位を決定します(メソッド解決順序と同様)。

ここに画像の説明を入力してください

プログラミングの実際的な意味はこれです。上記のスタイルシート.bazがあり、と同じである新しいクラスを追加するとfont-size.fooます。素朴な解決策はこれです:

.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! */}

ここに画像の説明を入力してください

私は何かを2回入力しなければならないときはいつでも、私はとても怒っています!だけでなく、私はそれを2回記述する必要があります、今私はプログラム的にことを示す方法はありません.fooし、.baz同じを持つべきfont-size、と私が作成した隠された依存関係を! 上記のパラダイムはfont-size属性クラスAから属性を抽象化する必要があることを示唆しています。

.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 */}

ここに画像の説明を入力してください

ここでの主な不満は、属性クラスAからすべてのセレクターを再入力して、選択する必要がある要素も属性基本クラスAから属性を継承するように指定する必要があることです。それでも、代替手段は、何かが変更されるたびに隠された依存関係があるすべての属性クラスを編集することを忘れないようにするか、サードパーティのツールを使用することです。最初のオプションは神を笑わせ、2番目のオプションは私を自殺したくなります。


0

LESSよりも強力なテキストプリプロセッサが必要な場合は、PPWizardを確認してください。

http://dennisbareis.com/ppwizard.htm

ウェブサイトは本当に恐ろしいものであり、学習曲線はわずかですが、CSSとHTMLの両方をマクロで構築するのに最適です。なぜより多くのウェブコーダーがそれを使わないのか私には理解できませんでした。


11
ウェブサイト本当に恐ろしいです。
nanofarad

htmlプロセッサのWebサイトにある皮肉なことです。
Ben Thurley、2012年

2
はい、ウェブサイトは恐ろしいですが、それだけではありません。読みづらくて頭も痛い!
ArtOfWarfare 2013

1
Windows 3.1からXPと互換性があるのは良いことですlol
Alter Lagos

奇妙な非標準のツールです。
berkus

-6

phpを介して.cssファイルを前処理すれば、希望どおりの結果を得ることができます。...

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

...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.