7 votes

Analyseur/abstracteur CSS ? Comment convertir une feuille de style en objet ?

Existe-t-il une méthode standard ou fiable permettant à un framework javascript tel que jquery d'analyser une feuille de style en un objet ?

Je m'interroge pour deux raisons :

  1. J'ai vu quelques questions où quelqu'un voulait savoir comment obtenir l'attribut de style qui a été défini par la feuille de style pour un sélecteur, et non pas ce dont le sélecteur a hérité par la suite.

  2. Si Grésillements fait ce qu'il est censé faire, cela pourrait être une solution pour s'assurer qu'une feuille de style est rendue correctement entre les navigateurs. En gros, jquery analyse la feuille de style et définit tous les attributs manuellement (peut-être en fonction du navigateur ou de sélecteurs connus non implémentés). De cette façon, les concepteurs/développeurs n'ont qu'à écrire une feuille de style CSS3 qui est compatible avec l'avenir et à laisser jquery/sizzle faire le travail que le navigateur ne fait pas.

Le seul inconvénient que je vois est que cela n'implémente toujours pas les attributs CSS3, mais c'est un début.

11voto

Inaimathi Points 5558

Côté client, une feuille de style est déjà un objet ; elle est analysée dans un arbre lors du chargement de la page.

Supposons que vous ayez une page HTML commençant par

<html xmlns="http://www.w3.org/1999/xhtml"> 
  <head> 
    <link href="http://stackoverflow.com/styles/global.css" rel="stylesheet" type="text/css" media="screen"/> 
    <link href="http://stackoverflow.com/styles/catalog.css" rel="stylesheet" type="text/css" media="screen"/> 
    <link href="http://stackoverflow.com/styles/banner.css" rel="stylesheet" type="text/css" media="screen"/> 

y global.css contient les lignes

#page { background-color: #fff; margin-top: 20px; margin-bottom: 20px; text-align: left; width: 100%; margin-top: 20px; padding: 0px; min-width: 900px; border: none; }
#header { background-color: transparent; }
#main { background-color: transparent; margin-left: 10px; margin-right: 10px; padding: 8px 0px 8px 0px;}
#sidebar { margin-right: 12px; }

Ensuite, afin de trouver ce qui est prévu pour les background-color de #page vous devez écrire document.styleSheets[0].cssRules[0].style.backgroundColor qui renverrait #fff (ou rgb(255, 255, 255) sur certains navigateurs, je crois).

D'autres éléments utiles sont à prendre en compte dans les fiches susmentionnées :

document.styleSheets[0].cssRules[3].cssText //"#sidebar { margin-right: 12px; }"
document.styleSheets[0].cssRules[2].selectorText //"#main"

Si vous aviez un sélecteur plus complexe, comme #main div.header a, #main div.header a:visited alors la propriété textuelle du sélecteur renvoie l'intégralité du texte, et pas seulement la première partie.

Votre question spécifique est "Comment puis-je savoir ce qui est défini dans la feuille de style pour un sélecteur donné". Voici une façon de l'approcher :

function findProperty(selector) {
   rules = document.styleSheets[0].cssRules
   for(i in rules) {
      if(rules[i].selectorText==selector) return rules[i].cssText;
   }
   return false;
}

findProperty('#sidebar'); //returns "#sidebar { margin-right: 12px; }"

Le fait est que l'arbre CSS auquel vous avez accès de cette manière a déjà été analysé par le navigateur (d'où le terme "approximatif" ci-dessus). Si vous êtes dans Firefox, vous ne verrez pas de -webkit parce que Mozilla les laisse tomber. Les différents navigateurs ont également tendance à avoir leur propre façon d'afficher les couleurs (comme ci-dessus ; si votre fichier .css actuel a une couleur donnée fixée à #fff et que vous le vérifiez en JavaScript après qu'il ait été analysé, vous pourriez obtenir le résultat suivant #fff , #ffffff o rgb(255, 255, 255) ).

Si vous voulez savoir quels caractères ascii spécifiques étaient contenus dans le fichier .css initial, le seul moyen fiable est de consulter le fichier lui-même, AFAIK.

Une référence pour l'objet feuille de style est disponible aquí .

0voto

mre Points 937

Question intéressante. Il existe un analyseur jquery sur le site de Daniel Wachsstock. http://bililite.com/blog/2009/01/16/jquery-css-parser/

Malheureusement, ce n'est peut-être pas ce que vous cherchez... mais cela vaut la peine d'essayer. La description suivante est extraite de son site :

Dans jQuery, vous appelez $(selector).parsecss(callback)

qui analyse tous les éléments de $(selector) ou de ses descendants, analyse chacun d'entre eux et transmet un objet (détails ci-dessous) à la fonction de rappel.

Créez par exemple un fichier CSS :

.gallery a {
  -jquery-lightbox: {overlayBgColor: '#ddd'}
}

et vous obtenez

$('.gallery a').lightbox({overlayBgColor: '#ddd'});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X