Uma classe CSS pode herdar uma ou mais outras classes?

eu me sinto burro por ter sido um programador da web por tanto tempo e não saber a resposta a esta pergunta, eu realmente espero que seja possível e eu apenas não sabia sobre o que eu acho que é a resposta (que é que não é possível).

a minha pergunta é se é possível fazer uma classe CSS que "herda" de outra classe CSS (ou mais de uma).

Por exemplo, digamos que tínhamos:
.something { display:inline }
.else      { background:red }
O que eu gostaria de fazer é algo assim:
.composite 
{
   .something;
   .else
}

onde o".a classe" composite " apareceria em linha e teria um fundo vermelho

 628
css
Author: CoderPi, 2009-06-30

28 answers

Existem ferramentas como LESS , que lhe permitem compor CSS num nível mais elevado de abstração semelhante ao que descreve.

Menos chama a estes "Mixins"

Em vez de

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

Pode-se dizer

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

#header {
  .rounded_corners;
}

#footer {
  .rounded_corners;
}
 380
Author: Larsenal, 2015-12-09 09:24:20

Pode adicionar várias classes a um único elemento DOM, por exemplo

<div class="firstClass secondClass thirdclass fourthclass"></div>
A herança não faz parte da norma CSS.
 258
Author: Matt Bridges, 2011-10-21 01:27:20
Sim, mas não exactamente com essa sintaxe.
.composite,
.something { display:inline }

.composite,
.else      { background:red }
 92
Author: mlouro, 2015-12-09 09:23:43

Um elemento pode ter várias classes:

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

<div class="classOne classTwo">
  <p>I'm bold and verdana.</p>
</div>
E isso é o mais próximo que vais chegar, infelizmente. Adorava ver este filme, juntamente com pseudónimos de classe, um dia.
 47
Author: Sampson, 2014-08-08 11:06:00

Mantenha os seus atributos comuns juntos e atribua atributos específicos (ou sobreponha) de novo.

/*  ------------------------------------------------------------------------------ */   
/*  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;
}
 46
Author: user2990362, 2015-12-09 09:26:16
Não, Não podes fazer algo como ...
.composite 
{
   .something;
   .else
}
Isto não são nomes de classe no sentido OO. .something e .else são apenas selectores nada mais.

Mas pode especificar duas classes num elemento

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

Ou podes olhar para outra forma de herança

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

Onde os parágrafos backgroundcolor e cor são herdados das configurações do div que é .foo estilizado. Talvez tenha de verificar a especificação exacta do W3C. inherit é o valor por omissão para a maioria das propriedades, mas não para todas.

 38
Author: jitter, 2015-12-09 09:25:04
Encontrei o mesmo problema e acabei usando uma solução JQuery para fazer parecer que uma classe pode herdar outras classes.
<script>
    $(function(){
            $(".composite").addClass("something else");
        });
</script>

Isto vai encontrar todos os elementos com a classe "compósito" e adicionar as classes "algo" e "outro" aos elementos. Então algo como <div class="composite">...</div> vai acabar assim:
<div class="composite something else">...</div>

 24
Author: DHoover, 2013-10-23 21:52:06

A maneira de SCSS para o exemplo dado, seria algo como:

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

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

Mais informações, verifique as noções básicas de

 13
Author: Alter Lagos, 2016-02-05 19:59:11
Não te esqueças.:
div.something.else {

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

}
 10
Author: Ryan Florence, 2015-12-09 09:26:34

O melhor que podes fazer é isto

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>
 10
Author: electricalbah, 2016-02-05 19:58:53

No ficheiro Css:

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

p.SubTitle p.Title
{
   font-size: 12px;
}
 8
Author: pedrofernandes, 2015-12-09 09:26:27

Timing perfeito: Eu fui desta pergunta para o meu e-mail, para encontrar um artigo sobremenos , uma biblioteca de Ruby que entre outras coisas Faz isto:

desde super parece que footer, mas com um tipo de letra diferente, eu vou usar a técnica de inclusão de classe de Less (eles chamam de mixin) para dizer-lhe para incluir estas declarações também:

#super {
  #footer;
  font-family: cursive;
}
 7
Author: RichieHindle, 2015-12-09 09:26:47
Eu sei que esta pergunta é muito antiga, mas aqui vai nada!

Se a intenção é adicionar uma única classe que implica as propriedades de várias classes, como uma solução nativa, eu recomendaria usar JavaScript/jQuery (jQuery não é realmente necessário, mas certamente útil)

Se você tem, por exemplo .umbrellaClass que "herda" de .baseClass1 e .baseClass2 você pode ter algum JavaScript que dispara pronto.

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

Agora todos os elementos de .umbrellaClass terão todas as propriedades de ambos .baseClassS. Note que, como a herança de OOP, .umbrellaClass pode ou não ter as suas próprias propriedades.

A única ressalva aqui é considerar se existem elementos criados dinamicamente que não existirão quando este código disparar, mas também existem maneiras simples de contornar isso. É uma treta que a css não tenha herança nativa.
 7
Author: John Carrell, 2016-11-18 14:13:24

Infelizmente, o CSS não fornece 'herança' da mesma forma que linguagens de programação como C++, C# ou Java. Você não pode declarar uma classe CSS e depois estendê-la com outra classe CSS.

No entanto, pode aplicar mais do que uma única classe a uma etiqueta na sua marcação ... nesse caso, há um conjunto sofisticado de regras que determinam quais estilos reais serão aplicados pelo navegador.
<span class="styleA styleB"> ... </span>

O CSS irá procurar todos os estilos que podem ser aplicados com base no que o seu formatação, e combinar os estilos CSS dessas múltiplas regras juntos.

Tipicamente, os estilos são fundidos, mas quando os conflitos surgem, o estilo declarado mais tarde vai geralmente ganhar (a menos que o !atributo importante é especificado em um dos estilos, em que caso que ganha). Além disso, os estilos aplicados diretamente a um elemento HTML têm precedência sobre os estilos de classe CSS.

 4
Author: LBushkin, 2009-06-30 19:20:55

Você pode aplicar mais de uma classe CSS a um elemento por algo como esta classe= "algo mais"

 3
Author: Pete, 2009-06-30 19:13:07
Como outros já disseram, Você pode adicionar várias classes a um elemento. Mas a questão não é essa. Percebo a tua pergunta sobre herança. O ponto real é que a herança em CSS é feita não através de classes, mas através de hierarquias de elementos. Então para modelar traços herdados você precisa aplicá-los a diferentes níveis de elementos no DOM.
 3
Author: Assaf Lavie, 2009-06-30 19:18:56

Há também o SASS, que você pode encontrar em http://sass-lang.com/. existe uma marca @extend, assim como um sistema de tipo mix-in. (Ruby)

É uma espécie de concorrente de menos.
 3
Author: chug2k, 2011-04-27 07:40:35
Isso não é possível na CSS.

A única coisa suportada no CSS é ser mais específica do que outra regra:

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

Um espaço com classe "myclass" terá ambas as propriedades.

Outra forma é especificando duas classes:

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

O estilo de "else" irá sobrepor (ou adicionar) o estilo de "algo"

 3
Author: Philippe Leybaert, 2015-12-09 09:27:45
Também andava à procura disso como uma louca e descobri-o ao tentar coisas diferentes... Bem, podes fazê-lo assim.
composite.something, composite.else
{
    blblalba
}
De repente funcionou para mim.
 2
Author: BiBi, 2015-12-09 09:27:05

Na verdade o que você está pedindo existe - no entanto é feito como módulos adicionais. Confira esta pergunta em Melhor CSS em. Net para exemplos.

Vê a resposta do Larsenal ao usar menos para ter uma ideia do que estes add-ons fazem.

 1
Author: Gavin Miller, 2017-05-23 12:03:02

O CSS não faz realmente o que estás a pedir. Se você quiser escrever regras com essa ideia composta em mente, você pode querer verificar bússola . É uma estrutura de stylesheet que parece semelhante ao já mencionado menos.

Deixa-te fazer mixins e todo esse bom negócio.
 1
Author: Zack The Human, 2009-06-30 19:43:47

Para aqueles que não estão satisfeitos com os posts mencionados (excelentes), você pode usar suas habilidades de programação para fazer uma variável (PHP ou qualquer outro) e tê-lo armazenar os nomes de várias classes.

Foi o melhor golpe que consegui arranjar.
<style>
.red { color: red; }
.bold { font-weight: bold; }
</style>

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

Depois aplicar a variável global ao elemento que deseja, em vez dos próprios nomes das classes

<span class="<?=DANGERTEXT?>"> Le Champion est Ici </span>
 1
Author: Shakir, 2015-04-18 07:59:17

Em circunstâncias específicas podes fazer uma herança "suave":

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

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

Isto só funciona se você estiver adicionando o .classe composta para um elemento criança. É herança "suave" porque quaisquer valores não especificados em .o composto não é herdado, obviamente. Tenha em mente que ainda seriam menos personagens para simplesmente escrever "inline" e "vermelho"em vez de "herdar".

Aqui está uma lista de propriedades e se eles fazem ou não isto automaticamente: https://www.w3.org/TR/CSS21/propidx.html

 1
Author: hydrix, 2016-03-17 23:52:19

Embora a herança directa não seja possível.

É possível usar uma classe (ou id) para uma etiqueta-mãe e, em seguida, usar combinadores CSS para alterar o comportamento de etiqueta-criança a partir da sua heirarquia.

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>
Eu não sugeriria usar tantos horizontes como o exemplo, no entanto é apenas uma prova de conceito. Ainda existem muitos bugs que podem surgir ao tentar aplicar CSS desta forma. (Por exemplo, alterando tipos de texto-decoração).
 1
Author: Stryderunknown, 2016-09-14 16:58:29

Se quiser um pré-processador de texto mais poderoso do que menos, veja o PPWizard:

Http://dennisbareis.com/ppwizard.htm

Avisar que o site é realmente hediondo e há uma pequena curva de aprendizagem, mas é perfeito para construir tanto CSS quanto HTML através de macros. Nunca percebi porque é que mais programadores da web não o usam.
 0
Author: BloDoe, 2010-11-28 23:32:31

Você pode conseguir um comportamento como herança desta forma:

.p,.c1,.c2{...}//parent styles
.c1{...}//child 1 styles
.c2{...}//child 2 styles

Ver http://jsfiddle.net/qj76455e/1/

A maior vantagem desta abordagem é a modularidade - você não cria dependências entre classes (como você faz quando "herda" uma classe usando um pré-processador). Assim, qualquer pedido de alteração em relação ao CSS não requer nenhuma análise de impacto.

 0
Author: Pavel Gatnar, 2015-09-11 19:49:50

Less and SAS are CSS pre-processors which extend CSS language in valuable ways. Apenas uma das muitas melhorias que eles oferecem é apenas a opção que você está procurando. Há algumas respostas muito boas com menos e eu vou adicionar solução Sass.

O SAS tem uma opção de extensão que permite que uma classe seja completamente estendida para outra. Mais informações sobre extend você pode ler neste artigo

 0
Author: Nesha Zoric, 2018-03-13 10:35:17

Podes alcançar o que quiseres se pré-processares o teu .ficheiros css através do php. ...

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

...

 -5
Author: john, 2014-08-04 16:23:58