I feel dumb for having been a web programmer for so long and not knowing the answer to this question, I actually hope it's possible and I just didn't know about rather than what I think is the answer (which is that it's not possible).
My question is whether it is possible to make a CSS class that "inherits" from another CSS class (or more than one).
For example, say we had:
.something { display:inline }
.else { background:red }
What I'd like to do is something like this:
.composite
{
.something;
.else
}
where the ".composite" class would both display inline and have a red background
转载于:https://stackoverflow.com/questions/1065435/can-a-css-class-inherit-one-or-more-other-classes
There are tools like LESS, which allow you to compose CSS at a higher level of abstraction similar to what you describe.
Less calls these "Mixins"
Instead of
/* 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;
}
You could say
/* LESS */
.rounded_corners {
-moz-border-radius: 8px;
-webkit-border-radius: 8px;
border-radius: 8px;
}
#header {
.rounded_corners;
}
#footer {
.rounded_corners;
}
An element can take multiple classes:
.classOne { font-weight: bold; }
.classTwo { font-famiy: verdana; }
<div class="classOne classTwo">
<p>I'm bold and verdana.</p>
</div>
And that's about as close as you're going to get unfortunately. I'd love to see this feature, along with class-aliases someday.
You can apply more than one CSS class to an element by something like this class="something else"
You can add multiple classes to a single DOM element, e.g.
<div class="firstClass secondClass thirdclass fourthclass"></div>
Inheritance is not part of the CSS standard.
Perfect timing: I went from this question to my email, to find an article about Less, a Ruby library that among other things does this:
Since super
looks just like footer
, but with a different font, I'll use Less's class inclusion technique (they call it a mixin) to tell it to include these declarations too:
#super {
#footer;
font-family: cursive;
}
That's not possible in CSS.
The only thing supported in CSS is being more specific than another rule:
span { display:inline }
span.myclass { background: red }
A span with class "myclass" will have both properties.
Another way is by specifying two classes:
<div class="something else">...</div>
The style of "else" will override (or add) the style of "something"
As others have said, you can add multiple classes to an element.
But that's not really the point. I get your question about inheritance. The real point is that inheritance in CSS is done not through classes, but through element hierarchies. So to model inherited traits you need to apply them to different levels of elements in the DOM.
No you can't do something like
.composite
{
.something;
.else
}
This are no "class" names in the OO sense. .something
and .else
are just selectors nothing more.
But you can either specify two classes on an element
<div class="something else">...</div>
or you might look into another form of inheritance
.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>
Where the paragraphs backgroundcolor and color are inherited from the settings in the enclosing div which is .foo
styled. You might have to check the exact W3C specification. inherit
is default for most properties anyway but not for all.
In Css file:
p.Title
{
font-family: Arial;
font-size: 16px;
}
p.SubTitle p.Title
{
font-size: 12px;
}
Unfortunately, CSS does not provide 'inheritance' in the way that programming languages like C++, C# or Java do. You can't declare a CSS class an then extend it with another CSS class.
However, you can apply more than a single class to an tag in your markup ... in which case there is a sophisticated set of rules that determine which actual styles will get applied by the browser.
<span class="styleA styleB"> ... </span>
CSS will look for all the styles that can be applied based on what your markup, and combine the CSS styles from those multiple rules together.
Typically, the styles are merged, but when conflicts arise, the later declared style will generally win (unless the !important attribute is specified on one of the styles, in which case that wins). Also, styles applied directly to an HTML element take precedence over CSS class styles.
Actually what you're asking for exists - however it's done as add-on modules. Check out this question on Better CSS in .NET for examples.
Check out Larsenal's answer on using LESS to get an idea of what these add-ons do.
Don't forget:
div.something.else {
// will only style a div with both, not just one or the other
}
Yes, but not exactly with that syntax.
.composite,
.something { display:inline }
.composite,
.else { background:red }
There's also SASS, which you can find at http://sass-lang.com/. There's an @extend tag, as well as a mix-in type system. (Ruby)
It's kind of a competitor to LESS.
I was looking for that like crazy too and I just figured it out by trying different things :P... Well you can do it like that:
composite.something, composite.else
{
blblalba
}
It suddenly worked for me :)
I ran into this same problem and ended up using a JQuery solution to make it seem like a class can inherit other classes.
<script>
$(function(){
$(".composite").addClass("something else");
});
</script>
This will find all elements with the class "composite" and add the classes "something" and "else" to the elements. So something like <div class="composite">...</div>
will end up like so:<div class="composite something else">...</div>
Keep your common attributes together and assign specific (or override) attributes again.
/* ------------------------------------------------------------------------------ */
/* 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;
}
The SCSS way for the given example, would be something like:
.something {
display: inline
}
.else {
background: red
}
.composite {
@extend .something;
@extend .else;
}
More info, check the sass basics
The best you can do is this
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>
I realize this question is now very old but, here goes nothin!
If the intent is to add a single class that implies the properties of multiple classes, as a native solution, I would recommend using JavaScript/jQuery (jQuery is really not necessary but certainly useful)
If you have, for instance .umbrellaClass
that "inherits" from .baseClass1
and .baseClass2
you could have some JavaScript that fires on ready.
$(".umbrellaClass").addClass("baseClass1");
$(".umbrellaClass").addClass("baseClass2");
Now all elements of .umbrellaClass
will have all the properties of both .baseClass
s. Note that, like OOP inheritance, .umbrellaClass
may or may not have its own properties.
The only caveat here is to consider whether there are elements being dynamically created that won't exist when this code fires, but there are simple ways around that as well.
Sucks css doesn't have native inheritance, though.