Le concept de feuille de style est présent dès l'origine du World Wide Web : le premier navigateur web (« WorldWideWeb », renommé par la suite « Nexus ») permet de mettre en forme les documents à l'aide de ce qui serait aujourd'hui considéré comme une « feuille de style utilisateur ». De même, les navigateurs Viola en 1992 et Harmony en 1993 recourent à un mécanisme similaire permettant de déterminer le rendu des polices de caractères, des couleurs ou de l'alignement du texte.
Il ne s'agit cependant pas de styles déterminés par l'auteur du document. Les premières implémentations HTML ne comportant pas non plus d'éléments de présentation, une pression croissante s'exerce alors pour que les navigateurs permettent aux auteurs de déterminer eux-mêmes la mise en forme des pages web, dans une démarche issue de la publication imprimée électronique. C'est dans ce contexte, en 1994-1995, que le tout nouveau Netscape Navigator introduit les premiers éléments HTML de présentation à l'initiative de Marc Andreessen, tandis qu'apparaissent concurremment les premières propositions de formats de styles externes : le « stylesheet proposal » de Pei Wei (créateur de Viola), les « Stylesheets for HTML » de Robert Raisch (O'Reilly), et enfin les « Cascading HTML Style Sheets » (CHSS) d'Håkon Wium Lie. L'apparition de CSS répond à une volonté de « proposer une alternative à l'évolution du HTML d'un langage de structuration vers un langage de présentation ».
Une troisième voie de développement est également ouverte à la même époque : le langage de transformation DSSSL des documents SGML, élaboré par James Clark, suggère la possibilité d'un format de styles qui ne soit pas seulement descriptif, et se rapproche d'un véritable langage de programmation. Cette voie est suivie par Netscape, qui propose en 1996 au W3C les « JavaScript-Based Style Sheets » (JSSS), implémentée par Netscape Navigator 4 en 1997.
Les origines des CSS sont donc liées à trois alternatives majeures :
La première proposition de Cascading HTML Style Sheets formulée par Håkon Wium Lie retient l'attention de Dave Raggett, qui est alors le principal éditeur du projet de spécification HTML3.0. Partisan d'un HTML purement structurel, il encourage la publication d'un document de travail CHSS, afin que celui-ci puisse être présenté et discuté à la seconde conférence internationale sur le WWW (Mosaic and the web', Chicago, 1994). Il modifie également avec Håkon Lie le navigateur Arena, afin de permettre de tester ce format, et en fait la démonstration lors de la troisième conférence WWW en 1995.
Parallèlement, Bert Bos, qui travaillait alors sur le navigateur Argo, et qui avait soumis au W3C son propre projet « Stream-based Style Sheet Proposal » (SSP), décide de joindre ses effets à ceux d'Håkon Lie. SSP ayant été développé avec l'idée d'être applicable non seulement à HTML, mais aussi à d'autres langages de balisage, Bert Bos et Håkon Lie reprennent cet objectif, et en font une des caractéristiques clés de ce qui devient alors CSS proprement dit.
Un autre aspect de CSS s'avère alors déterminant face aux alternatives existantes : CSS est le premier format à inclure l'idée de « cascade » (feuille de style en cascade), c'est-à-dire la possibilité pour le style d'un document d'être hérité à partir de plus d'une « feuille de style ». Cela permet d'arbitrer entre plusieurs sources concurrentes de mise en forme d'un élément, et répond donc à la nécessité de composer entre les préférences stylistiques des auteurs et des utilisateurs.
Le World Wide Web Consortium (W3C) devient opérationnel en 1995, et la liste de discussion www-style est alors créée. La même année se tient à Paris un « W3C style sheet workshop » décisif pour l'avenir des CSS. Y est notamment affirmée la volonté de conserver les feuilles de style sous une forme simple, ce qui exclut l'hypothèse JSSS de Netscape. Par ailleurs, Thomas Reardon (Microsoft) y annonce le support à venir de CSS dans les futures versions d'Internet Explorer : dès lors, lorsque le W3C crée à la fin de l'année l'« HTML Editorial Review Board » (HTML ERB) pour ratifier les futures spécifications HTML, DOM et CSS, Netscape, représenté par Lou Montulli, se rallie finalement au projet CSS mené par Bert Bos et Håkon Lie.
Contrairement aux logiciels, les spécifications CSS ne sont pas développées par versions successives, qui permettraient à un navigateur de se référer à une version en particulier. CSS est développé par « niveaux », ce qui contraint chaque nouveau niveau à intégrer le précédent, et chaque implémentation à être compatible avec la précédente : CSS1 est donc développé pour être un sous-ensemble de CSS2, qui est lui-même développé pour être un sous-ensemble de CSS3. Ceci explique en partie la lenteur de l'avancement normatif de CSS.
La spécification CSS1 finale est publiée le 17 décembre 1996, et définit une cinquantaine de propriétés. CSS1 se définit comme un « mécanisme de feuille de style simple, permettant aux auteurs et aux lecteurs d'attacher des styles (…) au document HTML ». Cette simplicité se traduit par le choix d'un langage qui peut être aisément lu et écrit directement par ses utilisateurs humains, et d'une terminologie conforme aux usages courants dans la publication informatique. Le choix éventuel d'exprimer CSS dans une syntaxe XML ou SGML, régulièrement évoquée pour éviter l'implémentation d'un nouveau mode d'analyse syntaxique, est donc définitivement écartée.
CSS1 ne décrit pas uniquement sa propre grammaire : ce premier niveau décrit en effet une grammaire destinée à permettre aux niveaux ultérieurs d'ajouter de nouvelles fonctionnalités, tout en autorisant la lecture de ces futures feuilles de styles par les implémentations d'origine. Ces nouvelles fonctionnalités ne seront pas comprises par les implémentations d'origine, mais pourront être identifiées en tant que telles, et ignorées. CSS garantit ainsi sa compatibilité ascendante.
CSS1 définit essentiellement les propriétés de rendu typographique du texte : fontes (polices), couleur, taille des caractères, graisse, espacements, bordures et gestion des marqueurs de liste. Il n'est donc pas encore question de « mise en page » : la propriété float
, qui sera par la suite massivement utilisée pour la mise en page CSS globale des designs web, n'est alors conçue que comme un moyen de placer localement, côte à côte, une portion réduite du contenu, tel qu'une image, et le reste du texte. Compte-tenu des implémentations problématiques de CSS1, le détournement de l'élément HTML table
pour gérer la mise en page globale reste dans l'immédiat la solution la plus couramment retenue par les auteurs de contenu web.
En 1996, Internet Explorer 3.0 est le premier navigateur commercial à implémenter partiellement CSS alors que celle-ci est encore en cours de formulation. Cette implémentation anticipée, menée par Chris Wilson ne correspond pas à la spécification finale. En 1997, Internet Explorer 4.0 voit la naissance d'un nouveau moteur de rendu, Trident, à l'origine du support croissant mais problématique de CSS dans les différentes versions de ce navigateur sous Windows, jusqu'à IE7 inclus.
Netscape Navigator 4.0 suit le mouvement en 1997, malgré ses réticences historiques vis-à-vis de CSS : dans le contexte de la guerre des navigateurs, il s'agit alors principalement d'éviter que Microsoft ne puisse s'affirmer comme le navigateur le plus conforme. Cependant, cette implémentation précipitée, basée sur des méthodes javascript internes, se révèle finalement peu exploitable par les producteurs de contenus. Netscape Navigator 4.0 apporte également une implémentation JSSS, qui restera sans lendemain. Il faudra attendre le nouveau moteur de rendu Gecko et son intégration dans Netscape 6 pour parvenir à une véritable implémentation de CSS1.
En 1998, alors que s'achève la guerre des navigateurs opposant Netscape et Microsoft, Opera 3.5, dont Håkon Lie est entre-temps devenu le directeur technique, parvient à une implémentation plus complète de CSS1, facilitée par la publication de la première « Test suite for Cascading Style Sheets (CSS) Level 1 » créée principalement par Eric Meyer pour le W3C. La présence de ces suites de test se révèle un atout majeur à la fois pour les implémentations dans les navigateurs et pour l'appropriation des techniques CSS par les auteurs (en fournissant des exemples détaillés des propriétés et de leurs valeurs).
Enfin, sous l'impulsion de Tantek Çelik, Internet Explorer 5.0 pour Macintosh lancé en mars 2000, basé sur Tasman, un moteur de rendu spécifique sans rapport avec Trident, est le premier navigateur à supporter complètement (à plus de 99 %) CSS1. Pour assurer la compatibilité avec les précédentes pratiques de codage propre à chaque implémentation (la « soupe de balises »), et permettre un affichage correct des documents web qu'ils soient respectueux ou non des standards CSS et HTML, il est également le premier à mettre en œuvre la technique du doctype switching. Adoptée par la suite par tous les navigateurs, celle-ci devient par la suite l'une des clés de l'implémentation progressive de CSS : elle permet en effet au navigateur de conserver d'anciennes implémentations propriétaires pour des raisons de compatibilité, tout en ayant la possibilité d'opter, en fonction de la syntaxe de la déclaration de type de document de la page, pour un mode de rendu conforme à de nouvelles implémentations standards.
Durant cette période de la fin des années 1990, la conception web est avant tout dépendante de l'utilisation d'HTML en tant que format de présentation. La défaite de Netscape à l'issue de la guerre des navigateurs, le renouveau qui s'en suit via le projet Mozilla, l'apparition d'IE5 Mac, et à un moindre titre l'évolution d'Internet Explorer Windows 5.x, amorcent cependant au début des années 2000 une nouvelle étape dans l'évolution des pratiques de conception des sites web par les auteurs : ces navigateurs permettent en effet de montrer que les pratiques historiques datant de l'époque de la guerre des navigateurs, mêlant structure et présentation, peuvent réellement être abandonnées au profit d'une démarche basée sur les feuilles de styles et le respect plus général des standards du web (au sens d'HTML et CSS). Jeffrey Zeldman, co-fondateur du Web Standards Project et fondateur d'A List apart en 1998, apparaît alors comme la figure emblématique de ce mouvement de promotion des standards. Il est également l'inspirateur d'une démarche de conception « hybride », tirant profit des techniques CSS tout en demeurant temporairement dans le cadre d'une mise en forme des documents basée sur les tableaux de présentation.
Pour répondre aux besoins que la première spécification CSS1 ne couvrait pas encore, CSS est attribué en 1997 à un nouveau groupe de travail au sein du W3C, présidé par Chris Lilley. En 2007, ce groupe comporte notamment des représentants d'Apple, Google, IBM, Microsoft, Adobe, de la Fondation Mozilla et d'Opera.
Publié comme une recommandation en mai 1998, le second niveau de CSS étend considérablement les possibilités théoriques des feuilles de styles en cascade, avec en particulier environ 70 propriétés supplémentaires. À la mise en forme typographique du texte initiée avec CSS1 s'ajoutent en effet notamment :
Cependant, cette richesse fonctionnelle ne rencontre qu'un écho limité dans ses implémentations :
Plusieurs causes sont évoquées pour expliquer ces difficultés et la lenteur des implémentations CSS2 :
Les retours d'implémentation de CSS2 conduisent le groupe de travail CSS du W3C à rédiger à partir de 2001 une version révisée CSS 2.1 (« CSS Level 2, Revision 1 »), sur la base de ce qui était effectivement adopté par les différents navigateurs. Les objectifs de cette révision sont :
- de maintenir la compatibilité avec les parties de CSS2 qui sont largement acceptés et mises en application.
- d'incorporer dans la norme tous les errata CSS2 déjà publiés.
- Lorsque les implémentations diffèrent profondément de la spécification CSS2, de modifier la spécification pour qu'elle soit en accord avec les pratiques généralement admises.
- de supprimer les dispositifs CSS2 qui ont été refusés par la communauté CSS, vu leur manque d'implémentation. CSS 2.1 vise à refléter les mécanismes CSS qui ont été raisonnablement et largement implémentés pour les langages HTML et XML en général (plutôt que pour un langage XML en particulier, ou pour HTML seul).
- de supprimer les mécanismes CSS2 qui seront rendus obsolètes par CSS3, et encourager ainsi l'adoption de mécanismes CSS3 à leur place.
- d'ajouter un (très) petit nombre de nouvelles valeurs de propriétés, lorsque l'expérience d'implémentation a montré qu'elles répondaient à un besoin pour la mise en application de CSS2.
CSS 2.1 corrige CSS2 sur de nombreux points de détail, en supprime certaines sections en tout ou partie (les styles vocaux défini sous le type de media « aural », les styles d'impression, les polices téléchargeables, dont les définitions plus probantes sont repoussées à la future CSS3), et l'explicite à partir des constats mis à jour lors des implémentations (la gestion avancée des blocs flottants via les « contextes de formatage »).
Après avoir connu 8 versions successives, CSS 2.1 est en juillet 2007 une recommandation candidate, c'est-à-dire le standard que doivent suivre les implémentations.
En 2007, aucun navigateur n'a en effet achevé l'intégration de CSS 2.1 : celle-ci serait implémentée à 56 % par Internet Explorer 7, 91 % par Firefox 2 et 94 % par Opera 9. Par ailleurs, seule une partie des navigateurs graphiques ont passé avec succès ou retenu comme objectif le test Acid2, lancé en 2005 par le Web Standards Project, à l'initiative d'Håkon Lie, pour favoriser notamment l'implémentation d'un choix de fonctionnalités CSS 2.1 considérées comme les principales avancées nécessaires : positionnement d'éléments lors de l'affichage, généralisation du modèle de rendu en tableau à tous les éléments, contenu généré via CSS. L'utilisation professionnelle de CSS reste donc limitée à un sous-ensemble arbitraire de celle-ci, déterminé par les implémentations communes.
Le développement du troisième niveau des feuilles de styles en cascade commence dès 1999, parallèlement à celui de CSS 2.1.
CSS3 devient « modulaire », afin de faciliter ses mises à jours, mais aussi son implémentation par des agents utilisateurs aux capacités et aux besoins de plus en plus variés (navigateurs graphiques, navigateurs pour mobiles, navigateurs vocaux). Les navigateurs peuvent ainsi implémenter des sous-ensembles de CSS3.
Dès lors, le degré d'avancement de CSS3 varie selon les modules et le degré de priorité qui leur a été donné par le groupe de travail CSS. En 2007, les modules les plus avancés (recommandations candidates) concernent la mise en forme des annotations ruby, la négociation de style entre serveurs et agents utilisateurs (« Media Queries »), le rendu web TV, la gestion des couleurs ou encore la prise en compte de la configuration de l'interface utilisateur. Dans d'autres cas, des modules peuvent atteindre le stade de recommandation candidate, mais être par la suite ramené au stade de document de travail en raison des difficultés mises à jour suite à l'appel à implémentation. C'est par exemple le cas du module de typographie « CSS Text ».
De même, les implémentations varient selon les stratégies et les besoins des différents navigateurs. Opera implémente par exemple les « Media Queries », qui répondent à ses besoins spécifiques de navigateur multiplate-forme embarqué sur des clients ayant des capacités d'affichage très variées. Firefox, davantage orienté vers le navigateur exploité en tant que plateforme, privilégie en revanche des modules appropriés à cet usage comme le module sélecteurs avancés.
Certains membres du groupe de travail CSS, ainsi que des développeurs web, ont soulevé le problème de la lenteur de l'avancement de CSS3 :
En 2008, aucun module n'est considéré comme terminé par le W3C, et l'implémentation dans les navigateurs est donc marginale, souvent à titre de test, comme les fonctions -moz-xxx du moteur Gecko, dont le préfixe limite l'utilisation aux seuls navigateurs basés sur Gecko.