Scriptorama.nl

Header image showing a keyboard, mouse, laptop and books on design patterns

Voorstel voor CSS Variables

Een van de dingen die mist in CSS is toch wel de mogelijkheid om variabelen te hebben. Sure, met Search & Replace kom je een heel eind maar een naam als logoKleurOranje is toch een stukje duidelijker dan #FF6600. Daarbij is het handig dat als je het wilt wijzigen, je het maar op 1 plek zou hoeven te doen.

Daniel Glazman (de ontwikkelaar van NVU) en David Hyatt, een van de hoofdontwikkelaars op Apple Safari (en dus WebKit) hebben gister een eerste voorstel voor CSS Variables als uitbreiding op de CSS 2.1 standaard gepubliceerd:

Since the release of CSS Level 2 Recommendation ten years ago in may 1998, the Web authors' community has been requesting a way of defining variables in CSS. Variables allow to define stylesheet-wide values identified by a token and usable in all CSS declarations. If a value is often used in a stylesheet - a common example is the value of the color or background-color properties - it's then easy to update the whole stylesheet statically or dynamically modifying just one variable instead of modifying all style rules applying the property/value pair.

Het voorstel dat ze doen introduceert 2 nieuwe soorten CSS regels. Een @variables blok om variabelen in te definieren en een var() functie om de variabelen weer mee uit te lezen:

CSS:
  1. @variables {
  2.   CorporateLogoBGColor: #fe8d12;
  3. }
  4.  
  5. div.logoContainer {
  6.   background-color: var(CorporateLogoBGColor);
  7. }

Het idee is dat variabelen over verschillende stylesheets binnen 1 pagina bruikbaar zijn maar dat variabelen gedefinieerd in verschillende media-selectors (print/screen/etc) wel op zichzelf staan.

Ben benieuwd of we dit binnen afzienbare tijd in browsers mogen verwelkomen!

Reageer ook!

Het klinkt in ieder geval veelbelovend.

Vet, al ben ik bang dat het pas bij IE10 geïmplementeerd gaat worden, mocht dit voorstel er ooit door komen.

Dat is zeker handig. :)

Maar is het ook voor andere dingen dan kleuren wel handig?
En wat als je een kleuren variabele in een width property gooit?

Maar ik ben zeker benieuwd!

Ook al zou het pas in IE10 geïmplementeerd worden, het is natuurlijk ontzettend makkelijk om dit server-sided te parsen voordat je het naar de browser stuurt.

Dan maak je toch iets met PHP die de CSS files verwerkt :)

Ruby On Rails heeft dit al, en ik ben van plan het in de volgende versie mijn Framework te gaan ondersteunen.

Probleem zal worden met DW, omdat de CSS volgens hem niet geldig is kan je het nog niet gebruiken zonder dat hij moeilijk gaat doen...

@Joost: Wie weet, MS kan dit soort dingen aangrijpen om more-appealing te zijn voor developers.

@daniel: De variabele heeft geen context, je kunt elke waarde aan zo'n CSS variabele toekennen en vervolgens gebruiken.

@Sebastian: Het is nu al inderdaad mogelijk, en voor nu is het de enige oplossing, maar waarom de server belasten met iets als de browser het zou kunnen?

Kennelijk door een programmeur voorgesteld.
Ik zou zelf iets voorstellen in de lijn van zoals css er uit ziet.
Dus een of ander teken voor de definitie dat ooo bij het gebruik gebruikt wordt. En waarom dan niet ons bekende dollarteken.

$LogoKleur{#129386}

.logoblok{color:$LogoKleur}

Of is dat teken al gereserveerd of al vrij beschikbaar voor namen?

@chris: dit is juist enorm in de lijn van CSS:

Je definieert variabelen blokken vrijwel hetzelfde als een media blok:

CSS:
  1. @media print {
  2.   BODY { font-size: 10pt }
  3. }
  4.  
  5. // vs
  6.  
  7. @variables {
  8.   logoFG: #FF6600;
  9. }

En je leest variabelen uit met een soort 'functie', op dezelfde manier dat je deze al gebruikt om URLs op te geven:

CSS:
  1. background-image: url(../logos/scriptorama.gif);
  2.  
  3. //vs
  4.  
  5. color: var(logoFG);

Een dollar teken is slechts bij enkele talen (o.a. PHP, Perl) een indicatie van een variabele, dus dat zou niet voor iedereen logisch zijn :)

@Tom-Eric,

Mee eens, maar dat kan nu ook al. Het gaat er juist over dat dit in de CSS zelf staat. Mijn punt is dus meer: als het pas in IE10 wordt doorgevoerd, kunnen wij de komende x jaar tot IE10 uitkomt + 2 jaar totdat iedereen hem ook daadwerkelijk heeft hier nog geen gebruik van maken.

(verder blijft het natuurlijk speculeren of dit pas in IE10 wordt geïmplementeerd)

Tom-Eric heeft wel een goed punt denk ik. Als het al zover komt dat Firefox, Opera, Safari, etc dit zouden gaan ondersteunen en IE niet. Dan kan je het nog altijd serverside parsen maar wel op dezelfde manier opbouwen.

"@Sebastian: Het is nu al inderdaad mogelijk, en voor nu is het de enige oplossing, maar waarom de server belasten met iets als de browser het zou kunnen?"

Caching ;)
Zo wie zo worden de CSS nu al ge minifyd en met CSSTidy netjes gemaakt (optimised) als dat gedaan is doet hij ze cachen en pas bijwerken als het bron bestand veranderd is de cache bijwerken!

Werkt als een trein, en met mijn framework krijg ik nu een A (100) bij Yslow :D

Zou zeker een goede aanvulling zijn zeker ook met betrekking tot variable paths etc.

En idd het is een oplossing om er gewoon met PHP een CSS bestand te laten genereren. Maar het CSS is dan voor de gebruiker nooit te bereiken... Caching is nu idd de netste oplossing.

[...] het voorstel van David Glazman en David Hyatt voor CSS variabelen, heeft David Hyatt met enkele collega's van Apple nog 3 voorstellen tot uitbreiding van CSS [...]

Er is toch ook niks mis met;

a {
text-decoration: none;
color: ;
}

Gaat al jaren goed

Leave a comment
Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>