Accueil > weblog
- Lire le billet précédent - Lire le billet suivant -
Par Laurent Denis, le 17 novembre 2004.
Comme je n'ai pas pu m'empêcher de jeter un oeil dans mon Feed Deemon ce matin, un billet de Dive the Web m'a fait sursauter :
Le language CSS est sensible à la casse. Du moins, c'est ce que je croyais.
Et bien, me voici toute ébaubie, je découvre qu'il ne l'est pas. J'ai défini une class
smallTxtet j'ai fait une faute de frappe en oubliant de capitaliser le t... et ça marche. Je m'étonne, je crois d'abord faire face à un bug du navigateur. Je teste dans FireFox 1.0 et IE6. J'ai ensuite essayé le coup avecSMALLTxtetSmALLtxt... Même résultat: le style est toujours appliqué.Je vérifie donc sur quelques sites et j'ai la confirmation que je cherchais: le CSS n'est pas sensible à la casse.
En fait, selon le principe d'orthogonalité, CSS2.0 est insensible à la casse pour ce qui dépend d'elle-même... mais laisse les autres normes concernées décider pour le reste :
Toutes les feuilles de style CSS sont insensibles à la casse, sauf leurs parties qui ne sont pas régies par CSS. Ainsi celles qui sont sensibles à la casse, comme les valeurs des attributs de HTML "
id" et "class", les noms des polices et les URIs qui sont hors du cadre de cette spécification. Noter en particulier que les noms des éléments ne sont pas dépendants de la casse pour HTML, alors qu'en XML ils le sont.
La sensibilité à la casse des noms de classes est donc régit non par CSS2.0, mais par HTML4.01, qui est on ne peut plus explicite à ce sujet :
class = liste-de-valeurs-cdata [CS]
Mais si... c'est explicite : suivez le lien sur la mention [CS]
:
Chaque définition d'attribut contient des informations concernant la sensibilité à la casse pour les valeurs qu'il admet. L'information de casse est présentée selon les clés suivantes :
- CS
- La valeur est sensible à la casse (i.e., l'agent utilisateur interprète « a » et « A » différemment).
De fait, le simple code suivant atteste du respect de la norme en la matière par les navigateurs :
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-style-type" content="text/css">
<title>Test</title>
<style type="text/css">
<!--
.smallTxt {
color: red;
}
.smalltxt {
color: green;
}
.SMALLtxt {
color: blue;
}
-->
</style>
</head>
<body>
<p class="smallTxt">Ceci devrait être rouge</p>
<p class="smalltxt">Ceci devrait être vert</p>
<p class="SMALLtxt">Ceci devrait être bleu</p>
</body>
</html>
Et pourtant, le billet cité ci-dessus est bien exact, dans les conditions où son auteur a réalisé ses tests... Alors ?
L'intéressant ici, je crois, c'est le comportement du développeur :
A aucun moment, on ne voit ce qui devrait être un réflexe immédiat, AMHA : consulter la spec qui est précisément là pour définir le comportement normalisé des navigateurs, ce que les auteurs peuvent en attendre, et ce dont ils doivent donc tenir compte avant tout. S'il y avait une éventuelle erreur d'implémentation, elle devait être cherchée à partir de là. En l'occurence, il n'y en a pas.
Mais ne jetons pas la pierre à notre développeur, car le problème reste entier : si la spec dit blanc, et que mes navigateurs disent unanimement noir avec ma page de test... je suis perdu !
Sauf que... la page de test de Dive the Web faisait intervenir un autre paramètre, qui faisait que le problème échappait totalement aux questions de comportement normalisé : supprimez en effet la DTD de l'exemple de code ci-dessus, et vous verrez qu'en effet, dans ce cas, tous nos navigateurs deviennent soudain indifférents à la casse des noms de classe.
Que s'est-il passé ? En supprimant cette DTD, nous avons fait basculer nos navigateurs dans un mode d'interprétation non standard, et donc a priori imprévisible. Dans ce mode Quirks, Opera, Firefox, Mozilla, IE6, etc. ne respectent plus la règle HTML de sensibilité à la casse des noms de classe. Chacun, à vrai dire, déclare de ce fait adopter le comportement de son choix, en toute imprévisibilité. De manière accidentelle, notre développeur avait sans doute basculé ses pages de test dans ce mode.
La rédaction de cette spécification tient compte de deux types de lecteurs : les auteurs de feuilles de style et les personnes chargées de leur implémentation. Nous espérons que la spécification fournira aux auteurs les moyens d'écrire des documents efficaces, attractifs et accessibles, sans pour autant les noyer dans le détail de la mise en œuvre des CSS., À propos de la spécification CSS2 - Lire la spécification) ;
Les trackbacks pour ce billet sont temporairement fermés en raison d'une série d'attaques de spam.
Commentaires
Moz, le 17 novembre 2004
"Le doctype switching est une mauvaise réponse obligée à une mauvaise question" : je croyais pourtant t'avoir entendu dire un jour que le modèle de boîte quirks était plus logique que le modèle standards ?
Monique, le 17 novembre 2004
Bonjour,

Hum... De(e)mon = tentation = ...
Je viens encore d'apprendre quelque chose !
En fait mon aversion pour les majuscules en dehors de leur usage classique (début de phrase ou de nom propre, sigle), un vestige indélébile de l'apprentissage de la lecture par la méthode globale, m'a toujours préservée de ce type d'erreur.
Amicalement,
Monique
Laurent Denis, le 19 novembre 2004
Dans un ordre d'idée similaire, et pour mémoire, une superbe typo dans la spécification HTML4.01 : .
Il faut lire en fait une correspondance insensible à la casse, conformément à la définition de l'attribut
media, au lien présent dans le texte litigieux, et à la cohérence nécessaire avec les types de médias définis par ailleurs dans CSS2. Bref, les descripteurs de medias (screen,print, etc.) sont insensibles à la casse.Igor, le 08 janvier 2005
Bonsoir Laurent,
Je m'appretaîs à répondre à un message sur Alsacréations sur la sensibilité à la casse de font color="XXccXX" par rapport à font color="xxccxx", plutôt sur un ton badin, du genre "depuis que je j'ai découvert css, la casse des font color dans html m'importe peu" dans l'idée de citer ce billet sur la casse que j'ai lu trop brièvement lors de sa parution.
Et je m'aperçois en le relisant avant de poster qu'il y a un terme et même un principe que je ne comprend pas du tout: *orthogonalité*.
Pourrais-tu m'éclairer sur cette formulation, que mon Petit Robert ne défriche pas suffisament pour moi.
Laurent Denis, le 09 janvier 2005
La récente recommandation Architecture du World Wide Web définit le principe d'orthogonalité :
Dans notre cas, par exemple : les noms d'éléments sont insensibles à la casse en HTML, mais pas en XHTML. Si CSS avait régit ce point au lieu d'en laisser le soin aux normes concernées, le passage à XHTML aurait été problématique...
Les commentaires pour ce billet sont temporairement fermés en raison d'une série d'attaques de spam.