W3C home > Mailing lists > Public > www-style@w3.org > October 2002

Proposal: inheritance of styles -in the stylesheet itself-

From: Brent Boyer <brentboyer@hotmail.com>
Date: Sat, 12 Oct 2002 22:42:02 +0200
To: www-style@w3.org
Message-Id: <200210122242.02888.brentboyer@hotmail.com>

A lot of style sheets have styles with much duplication.  For instance,
 you may have something like:

	.normalText {
		text-align: left;
		text-decoration: none;
		vertical-align: baseline;

		font-family: "Times New Roman", "Times", serif;
		font-size: 1em;
		font-style: normal;
		font-weight: normal;

		color: inherit;
		background-color: inherit;
	}

	.large1Text {
		text-align: left;
		text-decoration: none;
		vertical-align: baseline;

		font-family: "Times New Roman", "Times", serif;
		font-size: 1.2em;
		font-style: normal;
		font-weight: normal;

		color: inherit;
		background-color: inherit;
	}

	.large2Text {
		text-align: left;
		text-decoration: none;
		vertical-align: baseline;

		font-family: "Times New Roman", "Times", serif;
		font-size: 1.44em;
		font-style: normal;
		font-weight: normal;

		color: inherit;
		background-color: inherit;
	}

In the above, everything is duplicated except the font-size. 
 Duplication like this is generally bad on several levels:
--takes up a lot of extra space
--if want to make a common change to several related styles, you have
 to go in and change all of them individually; this is especially bad
 if the styles are defined in several files
--it fundamentally reflects the fact that current css style sheet
 syntax offers no way to express parent-child relationships among
 styles

What I propose for CSS is that it allow inheritance of styles -on the
stylesheet itself-.  (I am well aware of how styles inherit down the
document structure hierarchy; that is a separate issue; the discussion
 below will also touch on it.)

Specificly, you should be able to define a parent style, and have child
styles of that parent inherit all its properties unless explicitly
overriden.  The mechanism that I am proposing is simply that which is
 done in Object Oriented programming.

I propose that every style be allowed to extend from from one parent
 (single inheritance, just as in Java).  So, the above could be
 condensed to:

	.normalText {
		text-align: left;
		text-decoration: none;
		vertical-align: baseline;

		font-family: "Times New Roman", "Times", serif;
		font-size: 1em;
		font-style: normal;
		font-weight: normal;

		color: inherit;
		background-color: inherit;
	}

	.large1Text extends normalText {
		font-size: 1.2em;
	}

	.large2Text extends normalText {
		font-size: 1.44em;
	}

Unless I have missed something in the CSS spec (or a new proposal),
 there is currently no way to achieve the above.




Before submitting this proposal, I first went onto Usenet and started a
discussion; for details, see:
	http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&threadm=6221807f.02
09201302.6ac39f93%40posting.google.com&rnum=1&prev=/groups%3Fq%3DCan%2B
inheritance%2Bof%2Bstyles%2Bbe%2Bachieved%2Bin%2Bthe%2Bstylesheet%2Bits
elf%253F%26hl%3Den%26lr%3D%26ie%3DUTF-8%26selm%3D6221807f.0209201302.6a
c39f93%2540posting.google.com%26rnum%3D1

The most relevant suggestions, along with my rebuttals below, are:

1) As far as I am aware, there is no way, and it does seem a strange
omission. The way I get round it is to encode what you call the "parent
styles" as macros, then call those macros in the "child styles".  I've
written a macro processor similar to the C preprocessor, and it's what
 I use to handle all the repetitive bits of my site, including chunks
 of CSS. ----------
A macro processor as in C could do a lot of powerful stuff, but can
 also add much complexity (as it sometimes does in C).  For the
 purposes defined here, the proposed inheritance mechanism is much
 cleaner and clearer; it really does allow you to define parent-child
 relationships


2) You probably want something like this:
	p                                     { font-family: Arial, serif; }
	.large, .large-i, .large-b, .large-br { font-size: 200%; }
	.large-b, .large-br                   { font-weight: bold; }
	.large-i                              { font-style: italic; }
	.large-br                             { color: red; }
----------
That multi-line definition syntax strikes me as horrible, and I am
 puzzled as to why it was ever allowed in CSS in the first place.  It
 says that it is valid to define a style in multiple and obscure places
 all over your style sheet.  I cannot imagine how this is a robust way
 of doing things in any but trivial examples, like the above, where the
 author was nice enough to define related things in one spot.  But
 imagine that you have a more complex style sheet, and somebody else
 started adding features to your style in different parts of the sheet,
 and then a third person had to come along and debug why things were
 not working.  So, I argue that it is an unscalable approach.  It also
 is not actually defining parent-child relationships among the styles.


3) Use the parents to manipulate the children [i.e. use document
 structure, since styles inherit down the chain?]
----------
If I understood the poster correct, he was suggesting something like:

	[in style sheet:]
	  .style1 {...[some base styles]...}
	  .style2 {...[some additional styles]...}

	[in html file:]
	  <div class="style1">
		<div class="style2">
		  blah blah blah...
		</div>
	  </div>

so that document structure is used to accumulate styles on content.  I
strenuously object to corrupting document structure (which should only
 have semantic meaning) to support styles.  As far as I am concerned,
 it is a hack in CSS of low moral equivalence to all the table
 manipulation crap in old style html documents.




_________________________________________________________________
MSN Photos is the easiest way to share and print your photos:
http://photos.msn.com/support/worldwide.aspx
Received on Saturday, 12 October 2002 16:42:05 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Monday, 27 April 2009 13:54:16 GMT