Toutes les notes

Par pitié, Saint W3C, donnez-nous des sélecteurs de parents en CSS !

Cette question a été soulevée de nombreuses fois, mais pour de supposés problèmes de performances, aucune solution n’a encore vu le jour.

Shaun Inman avait proposé en 2008 les « qualified selectors », qui permettent de changer le « sujet » d’un sélecteur CSS, par exemple :

a< img { background: none; }

Merveilleux, n’est-il pas ?

Malheureusement, dans l’un des commentaires, Dave Hyatt (responsable du développement de Webkit, éditeur de la spécification HTML5) avait immédiatement pointé les problèmes de performances que cette solution pouvait poser. Il en profite d’ailleurs pour signaler que la majorité des sélecteurs CSS3 ne devraient pas être utilisés du tout, si l’on se préoccupe réellement des performances de nos pages. Ahem.

Aujourd’hui, Remy Sharp vient de proposer une nouvelle solution, en essayant de prendre en compte les différents problèmes de performances pointés par les implémenteurs. En partant du principe que les sélecteurs sont évalués de la droite vers la gauche, il s’agit d’utiliser un pseudo sélecteur :parent sur un élément, pour indiquer qu’il faut remonter sur l’élément parent.

Ce qui donnerait :

a img:parent { background: none; }

Évidemment, cette solution est plus limitée que la précédente, et peut-être un peu moins claire. Mais on s’en contenterait, non ?

Pour ma part, je pense qu’avec les progrès fantastiques effectués ces dernières années en termes de performances par l’ensemble des navigateurs, nous devrions pouvoir implémenter ce genre de solutions sans pour autant plomber complètement la vitesse d’affichage d’une page. N’oublions pas que l’auteur d’une page est également responsable de la bonne utilisation des technologies qu’il utilise : il est très simple de bloquer un navigateur en JavaScript par exemple. Finalement, le problème vient peut-être du fait que CSS n’étant pas un langage de développement, le W3C à tendance à partir du principe qu’un utilisateur de CSS n’a pas à se préoccuper des performances des sélecteurs qu’il va utiliser, ce qui est complètement illusoire.

Allez, je retourne mettre ma petite classe « img-link » en attendant CSS4.

6 commentaires

Poster un commentaire

Flux RSS des commentaires de cet article

un bon vieux débat : faut il donner beaucoup de puissance potentiellement destructrice en échange d’un peu plus de confort (honnêtement, :parent, ça fait rêver)

Ca marche aussi pour le nucléaire en fait, sauf que ça ne fait pas pousser des bras en plus.
Le problème c’est qu’il est extrêmement difficile de débusquer des problèmes de performances CSS sur une page.
D’un autre côté, il suffit qu’un outil facilitant l’accès à cette info sorte, puis qu’il soit évident pour la majorité des codeurs CSS que certaines choses sont à éviter pour que le W3 change finalement d’avis

Et quoi qu’en dise des développeurs web comme remy sharp, le W3 est composé de ceux qui implémentent dans les navigateurs ce genre d’amusement, donc si ils parlent de problèmes de perfs, ils savent ce qu’ils disent :)

Perso je suis quand même pour sortir ce genre de spec dans CSS3 : elle ne sera de toute manière pas vraiment utilisée puisqu’il n’y a aucune rétro-compatibilité, et d’ici à ce que … IE9 disparaisse, les machines et les navigateurs seront tellement surpuissants que cette question de perfs ne se posera probablement plus

Le 11 Oct. 2010 à 15h05 par jpvincent

Je ne peux que cautionner cette demande. Ce sélecteur semble comme naturel. Un sélecteur permet de sélectionner une balise en fonction de son contexte. Pourquoi alors se limiter au contexte parent ?

Je pense qu’il n’est pas bon que les personnes qui remplissent la liste de noël soient aussi celles qui vont sortir l’argent pour acheter les cadeaux. En d’autres mots, la technique ne doit pas être un frein ni aux idées ni aux usages !

Bonne continuation,
Thomas.

Le 11 Oct. 2010 à 15h20 par Thomas

C’est une proposition intéréssante ;
jQuery nous a effectivement habitué a manipuler le DOM avec une facilité déconcertante, (bien que ce ne soit pas a l’aide des sélecteurs que jQuery nous permette de sélectionner les éléments parents) qu’on se retrouve presque frustré devant la feuille de style !

Peut être que des scripts type http://selectivizr.com/ , tant qu’a faire dans le « moins de performance » pourraient subvenir aux plus pressés d’entre nous pour l’implémentation de cette possibilité !?

Le 11 Oct. 2010 à 15h38 par korvus

Comment peut-on parler de problème de performances sur des technos comme CSS, xml, HTML etc. ?
Alors que le net actuel est bourré de flash, et bibliothèque Javascript et d’effets parfois simple mais tout de même très lourd…pouvant faire ramer nos bécanes survitaminées.

L’excuse du surf par téléphone mobile (très en vogue en ce moment) ne tient pas : ces petites bécanes supportent Flash (Android notamment, mais pas l’iPhone ), les mobiles sont de plus en plus puissant et comme l’a dit Thomas un peu plus haut, les limitations techniques ne peuvent pas être un frein à la créativité : surtout avec l’importance du net aujourd’hui, arguer de limitations techniques ce n’est pas acceptable.

Bref, un sélecteur supplémentaire pour se « promener » dans le DOM, ne devrait pas poser problème, sinon ça voudrait dire que la techno est mal faite, non ?

Le 12 Oct. 2010 à 10h56 par mrjay42

Oui la techno du DOM est contre-performante
pour la faire courte : on fait des applications avec des technos qui sont faites à la base pour afficher du texte et le rendre un peu joli, donc les navigateurs se battent pour essayer de suivre, et ça se joue même en CSS.

mais on n’a rien d’autre à se mettre sous la dent pour faire tourner des applis sur un navigateur, à moins que tu ne veuilles faire du flash, du silverlight, ou adopter le modèle des applications façon Apple Store ?

Le 12 Oct. 2010 à 11h12 par jpvincent

Publiez un commentaire en remplissant les champs ci-dessous.
Les champs marqués d'une astérisque (*) sont obligatoires.

Les commentaires peuvent utiliser HTML ; seuls ces éléments sont autorisés : <a href="" title=""> <abbr title=""> <blockquote cite=""> <cite> <code> <em> <q cite=""> <s> <strong> <pre>