Je cherche un moyen de changer les règles CSS pour les sélecteurs de pseudo-classes (tels que: link,: hover, etc.) à partir de JavaScript.
Donc, un analogue du code CSS: a:hover { color: red }
dans JS.
Je n'ai pu trouver la réponse nulle part ailleurs. si quelqu'un sait que c'est quelque chose que les navigateurs ne supportent pas, ce serait également un résultat utile.
Vous ne pouvez pas styler une pseudo-classe uniquement sur un élément particulier, de la même manière que vous ne pouvez pas avoir une pseudo-classe dans un attribut inline style = "..." (car il n'y a pas de sélecteur).
Vous pouvez le faire en modifiant la feuille de style, par exemple en ajoutant la règle:
#elid:hover { background: red; }
en supposant que chaque élément que vous souhaitez affecter à un identifiant unique permettant de le sélectionner.
En théorie, le document que vous souhaitez utiliser est http://www.w3.org/TR/DOM-Level-2-Style/Overview.html , ce qui signifie que vous pouvez (à partir d'un fichier incorporé ou lié existant feuille de style) en utilisant une syntaxe comme:
document.styleSheets[0].insertRule('#elid:hover { background-color: red; }', 0);
document.styleSheets[0].cssRules[0].style.backgroundColor= 'red';
IE nécessite bien sûr sa propre syntaxe:
document.styleSheets[0].addRule('#elid:hover', 'background-color: red', 0);
document.styleSheets[0].rules[0].style.backgroundColor= 'red';
Les navigateurs plus anciens et mineurs ne prendront probablement en charge aucune des deux syntaxes. Il est rarement fait de falsifier une feuille de style dynamique, car il est assez ennuyeux d’être juste, rarement nécessaire et historiquement gênant.
J'ai jeté ensemble un petite bibliothèque pour cela car je pense qu'il existe des cas d'utilisation valables pour manipuler des feuilles de style dans JS. Les raisons étant:
Une fonction pour gérer le contenu inter-navigateur:
addCssRule = function(/* string */ selector, /* string */ rule) {
if (document.styleSheets) {
if (!document.styleSheets.length) {
var head = document.getElementsByTagName('head')[0];
head.appendChild(bc.createEl('style'));
}
var i = document.styleSheets.length-1;
var ss = document.styleSheets[i];
var l=0;
if (ss.cssRules) {
l = ss.cssRules.length;
} else if (ss.rules) {
// IE
l = ss.rules.length;
}
if (ss.insertRule) {
ss.insertRule(selector + ' {' + rule + '}', l);
} else if (ss.addRule) {
// IE
ss.addRule(selector, rule, l);
}
}
};
Mon astuce utilise un sélecteur d'attribut. Les attributs sont plus faciles à configurer en javascript.
css
.class{ /*normal css... */}
.class[special]:after{ content: 'what you want'}
javascript
function setSpecial(id){ document.getElementById(id).setAttribute('special', '1'); }
html
<element id='x' onclick="setSpecial(this.id)"> ...
Il suffit de placer le fichier css dans une chaîne de modèle.
const cssTemplateString = `.foo:[psuedoSelector]{prop: value}`;
Créez ensuite un élément de style, placez la chaîne dans la balise de style et associez-la au document.
const styleTag = document.createElement("style");
styleTag.innerHTML = cssTemplateString;
document.head.insertAdjacentElement('beforeend', styleTag);
La spécificité se chargera du reste. Ensuite, vous pouvez supprimer et ajouter des balises de style de manière dynamique. C'est une alternative simple aux bibliothèques et à la manipulation du tableau de feuilles de style dans le DOM. Bon codage!
Il y a une autre alternative. Au lieu de manipuler directement les pseudo-classes, créez des classes réelles qui modélisent les mêmes choses, comme une classe "survolée" ou une classe "visitée". Style les classes avec le "." Habituel. syntaxe, puis vous pouvez utiliser JavaScript pour ajouter ou supprimer des classes d’un élément lorsque l’événement approprié est déclenché.
Au lieu de définir directement des règles de pseudo-classes avec javascript, vous pouvez les définir différemment dans différents fichiers CSS, puis utiliser Javascript pour désactiver une feuille de style et en activer une autre. Une méthode est décrite à A List Apart (qv. Pour plus de détails).
Configurez les fichiers CSS en tant que,
<link rel="stylesheet" href="always_on.css">
<link rel="stylesheet" title="usual" href="preferred.css"> <!-- on by default -->
<link rel="alternate stylesheet" title="strange" href="alternate.css"> <!-- off by default -->
Et puis basculez entre eux en utilisant JavaScript:
function setActiveStyleSheet(title) {
var i, a, main;
for(i=0; (a = document.getElementsByTagName("link")<i>); i++) {
if(a.getAttribute("rel").indexOf("style") != -1
&& a.getAttribute("title")) {
a.disabled = true;
if(a.getAttribute("title") == title) a.disabled = false;
}
}
}
Comme déjà indiqué, ce n'est pas quelque chose que les navigateurs supportent.
Si vous ne proposez pas les styles de manière dynamique (c.-à-d. En les extrayant d'une base de données ou quelque chose du genre), vous devriez pouvoir contourner ce problème en ajoutant une classe au corps de la page.
Le css ressemblerait à quelque chose comme:
a:hover { background: red; }
.theme1 a:hover { background: blue; }
Et le javascript pour changer cela serait quelque chose comme:
// Look up some good add/remove className code if you want to do this
// This is really simplified
document.body.className += " theme1";
Commuter les feuilles de style est la meilleure façon de le faire. Voici une bibliothèque pour créer des feuilles de style de manière dynamique, vous permettant ainsi de définir des styles à la volée:
http://www.4pmp.com/2009/11/dynamic-css-pseudo-class-styles-with-jquery/