Existe-t-il un moyen de sélectionner / manipuler des pseudo-éléments CSS tels que ::before
et ::after
(et l'ancienne version avec un point-virgule) en utilisant jQuery?
Par exemple, ma feuille de style a la règle suivante:
.span::after{ content:'foo' }
Comment puis-je changer 'foo' en 'bar' en utilisant jQuery?
javascript
jquery
css
jquery-selectors
pseudo-element
JBradwell
la source
la source
Réponses:
Vous pouvez également transmettre le contenu au pseudo-élément avec un attribut de données, puis utiliser jQuery pour manipuler cela:
En HTML:
Dans jQuery:
En CSS:
Si vous souhaitez empêcher l'affichage de «l'autre texte», vous pouvez combiner cela avec la solution de seucolega comme ceci:
En HTML:
Dans jQuery:
En CSS:
la source
attr
fonction contre lacontent
propriété? Je suis surpris de n'avoir jamais entendu parler de ça ...attr()
, dommage que je n'ai pas pu l'utiliser avec d'autres propriétés quecontent
. Démoattr()
au-delà de CSS2, alors que dans CSS2 lui-mêmeattr()
n'a été défini que pour lacontent
propriété.:before
, il prendattr()
en charge en CSSVous penseriez que ce serait une question simple à répondre, avec tout le reste que jQuery peut faire. Malheureusement, le problème se résume à un problème technique: les règles css: after et: before ne font pas partie du DOM et ne peuvent donc pas être modifiées à l'aide des méthodes DOM de jQuery.
Il existe des moyens de manipuler ces éléments à l'aide de solutions de contournement JavaScript et / ou CSS; lequel vous utilisez dépend de vos besoins exacts.
Je vais commencer par ce qui est largement considéré comme la "meilleure" approche:
1) Ajouter / supprimer une classe prédéterminée
Dans cette approche, vous avez déjà créé une classe dans votre CSS avec un autre
:after
ou de:before
style. Placez cette "nouvelle" classe plus tard dans votre feuille de style pour vous assurer qu'elle remplace:Ensuite, vous pouvez facilement ajouter ou supprimer cette classe en utilisant jQuery (ou JavaScript vanilla):
Afficher l'extrait de code
:before
ou:after
n'est pas complètement dynamique2) Ajoutez de nouveaux styles directement à la feuille de style du document
Il est possible d'utiliser JavaScript pour ajouter des styles directement à la feuille de style du document, y compris les styles
:after
et:before
. jQuery ne fournit pas de raccourci pratique, mais heureusement, le JS n'est pas si compliqué:Afficher l'extrait de code
.addRule()
et les.insertRule()
méthodes associées sont assez bien supportées aujourd'hui.En variante, vous pouvez également utiliser jQuery pour ajouter une nouvelle feuille de style au document, mais le code nécessaire n'est pas plus propre:
Afficher l'extrait de code
Si nous parlons de "manipuler" les valeurs, pas seulement de les ajouter, nous pouvons également lire les styles existants
:after
ou en:before
utilisant une approche différente:Afficher l'extrait de code
Nous pouvons remplacer
document.querySelector('p')
par$('p')[0]
lors de l'utilisation de jQuery, pour un code légèrement plus court.3) Modifier un attribut DOM différent
Vous pouvez également utiliser
attr()
dans votre CSS pour lire un attribut DOM particulier. ( Si un navigateur prend en charge:before
, il le prendattr()
également en charge . ) En combinant cela aveccontent:
du CSS soigneusement préparé, nous pouvons changer le contenu (mais pas d'autres propriétés, comme la marge ou la couleur):before
et:after
dynamiquement:JS:
Afficher l'extrait de code
Cela peut être combiné avec la deuxième technique si le CSS ne peut pas être préparé à l'avance:
Afficher l'extrait de code
attr
en CSS ne peut s'appliquer qu'aux chaînes de contenu, pas aux URL ou aux couleurs RVBla source
Bien qu'ils soient rendus par les navigateurs via CSS comme s'ils étaient comme d'autres éléments DOM réels, les pseudo-éléments eux-mêmes ne font pas partie du DOM, car les pseudo-éléments, comme leur nom l'indique, ne sont pas de vrais éléments, et donc vous ne pouvez pas sélectionnez-les et manipulez-les directement avec jQuery (ou n'importe quelle API JavaScript d'ailleurs, pas même l' API Selectors ). Cela s'applique à tous les pseudo-éléments dont vous essayez de modifier les styles avec un script, et pas seulement
::before
et::after
.Vous pouvez uniquement accéder aux styles de pseudo-éléments directement à l'exécution via le CSSOM (think
window.getComputedStyle()
), qui n'est pas exposé par jQuery au.css()
- delà , une méthode qui ne prend pas en charge les pseudo-éléments non plus.Vous pouvez toujours trouver d'autres moyens de le contourner, par exemple:
Appliquer les styles aux pseudo-éléments d'une ou plusieurs classes arbitraires, puis basculer entre les classes (voir la réponse de seucolega pour un exemple rapide) - c'est la manière idiomatique car elle utilise des sélecteurs simples (qui ne sont pas des pseudo-éléments) pour faire la distinction entre les éléments et les états des éléments, la façon dont ils sont destinés à être utilisés
Manipuler les styles appliqués auxdits pseudo-éléments, en modifiant la feuille de style du document, ce qui est beaucoup plus un hack
la source
Vous ne pouvez pas sélectionner de pseudo-éléments dans jQuery car ils ne font pas partie du DOM. Mais vous pouvez ajouter une classe spécifique à l'élément père et contrôler ses pseudo-éléments en CSS.
EXEMPLE
Dans jQuery:
En CSS:
la source
Nous pouvons également compter sur des propriétés personnalisées (alias variables CSS) afin de manipuler le pseudo-élément. On peut lire dans la spécification que:
Compte tenu de cela, l'idée est de définir la propriété personnalisée au sein de l'élément et le pseudo-élément en héritera simplement; ainsi nous pouvons facilement le modifier.
1) Utilisation du style en ligne :
2) Utilisation de CSS et de classes
3) Utilisation de javascript
4) Utilisation de jQuery
Il peut également être utilisé avec des valeurs complexes:
Vous remarquerez peut-être que je considère la syntaxe
var(--c,value)
oùvalue
est la valeur par défaut et également appelée la valeur de secours.De la même spécification, nous pouvons lire:
Et ensuite:
Si nous ne définissons pas la propriété personnalisée OU nous la définissons sur
initial
OU elle contient une valeur non valide, la valeur de secours sera utilisée. L'utilisation deinitial
peut être utile si nous voulons réinitialiser une propriété personnalisée à sa valeur par défaut.en relation
Comment stocker la valeur héritée à l'intérieur d'une propriété personnalisée CSS (alias variables CSS)?
Propriétés personnalisées CSS (variables) pour le modèle de boîte
Veuillez noter que les variables CSS peuvent ne pas être disponibles dans tous les navigateurs que vous jugez pertinents (par exemple IE 11): https://caniuse.com/#feat=css-variables
la source
Dans la lignée de ce que suggère Christian, vous pourriez également faire:
la source
Voici comment accéder aux propriétés de style: after et: before, définies dans css:
la source
SI vous voulez manipuler entièrement les éléments sudo :: before ou :: after via CSS, vous pouvez le faire JS. Voir ci-dessous;
Remarquez comment l'
<style>
élément a un ID, que vous pouvez utiliser pour le supprimer et l'ajouter à nouveau si votre style change dynamiquement.De cette façon, votre élément est un style exactement comme vous le souhaitez via CSS, avec l'aide de JS.
la source
une manière efficace mais pas très efficace consiste à ajouter une règle au document avec le nouveau contenu et à la référencer avec une classe. en fonction de ce qui est nécessaire, la classe peut avoir besoin d'un identifiant unique pour chaque valeur de contenu.
la source
Voici le HTML:
Le style calculé sur «avant» était
content: "VERIFY TO WATCH";
Voici mes deux lignes de jQuery, qui utilisent l'idée d'ajouter une classe supplémentaire pour référencer spécifiquement cet élément, puis d'ajouter une balise de style (avec une balise! Important) pour changer le CSS de la valeur de contenu de l'élément sudo:
$("span.play:eq(0)").addClass('G');
$('body').append("<style>.G:before{content:'NewText' !important}</style>");
la source
Merci à tous! j'ai réussi à faire ce que je voulais: D http://jsfiddle.net/Tfc9j/42/ ici jetez un oeil
je voulais que l'opacité d'un div externe soit différente de l'opacité du div interne et que ça change d'un clic quelque part;) Merci!
la source
append
, ilhtml
vaut mieux éviterVous pouvez créer une fausse propriété ou utiliser une propriété existante et l' hériter dans la feuille de style du pseudo-élément.
Il semble que cela ne fonctionne pas pour la propriété "content" :(
la source
Ce n'est pas pratique car je n'ai pas écrit ceci pour des utilisations réelles, juste pour vous donner un exemple de ce qui peut être réalisé.
cet ajout actuel a / ou ajoute un élément Style qui contient vos attributs nécessaires qui prendront effet sur l'élément cible après l'élément Pseudo.
cela peut être utilisé comme
et
comme après: et avant: les pseudo-éléments ne sont pas directement accessibles via DOM il n'est actuellement pas possible d'éditer librement les valeurs spécifiques du css.
ma façon n'était qu'un exemple et ce n'est pas bon pour la pratique, vous pouvez le modifier essayer quelques-unes de vos propres astuces et le rendre correct pour une utilisation réelle.
faites ainsi votre propre expérimentation avec ceci et d'autres!
salutations - Adarsh Hegde.
la source
J'ajoute toujours ma propre fonction utils, qui ressemble à ceci.
ou utilisez les fonctionnalités ES6:
la source
Pourquoi ajouter des classes ou des attributs lorsque vous pouvez simplement ajouter un
style
à la têtela source
Il existe de nombreuses réponses ici, mais aucune réponse ne permet de manipuler le CSS de
:before
ou:after
, même pas celui qui est accepté.Voici comment je propose de le faire. Supposons que votre HTML soit comme ceci:
Et puis vous définissez son: avant en CSS et le concevez comme:
Veuillez noter que j'ai également défini l'
content
attribut dans l'élément lui-même afin que vous puissiez le retirer facilement plus tard. Il y a maintenant unbutton
clic sur lequel, vous voulez changer la couleur de: avant en vert et sa taille de police en 30 px. Vous pouvez y parvenir comme suit:Définissez un CSS avec votre style requis sur une classe
.activeS
:Vous pouvez maintenant modifier le style: avant en ajoutant la classe à votre élément: avant comme suit:
Si vous voulez simplement obtenir du contenu
:before
, cela peut être fait comme:En fin de compte, si vous souhaitez modifier dynamiquement le
:before
contenu par jQuery, vous pouvez y parvenir comme suit:Cliquer sur le bouton "changeBefore" ci-dessus changera le
:before
contenu de#something
"22" qui est une valeur dynamique.J'espère que ça aide
la source
J'ai utilisé des variables définies à l'
:root
intérieurCSS
pour modifier le:after
(le même s'applique à:before
) pseudo-élément , en particulier pour changer labackground-color
valeur d'un styleanchor
défini par.sliding-middle-out:hover:after
et lacontent
valeur d'un autreanchor
(#reference
) dans la démo suivante qui génère des couleurs aléatoires en utilisant JavaScript / jQuery:HTML
CSS
JS / jQuery
la source
attr()
except incontent
, est vraiment rare. Vous pouvez consulter caniuse.com pour cela.:root
et la prise en charge des variables css est meilleure, mais pas encore si répandue, car la prise en charge est assez récente. (consultez également le support sur caniuse.com)J'ai créé un plugin jQuery pour ajouter des règles css-pseudo comme l'utilisation
.css()
pour des éléments spécifiques.usage:
la source
la source
Vous pouvez utiliser mon plugin à cet effet.
JQuery:
Les valeurs doivent être spécifiées, comme dans la fonction normale de jQuery.css
De plus, vous pouvez également obtenir la valeur du paramètre pseudo-élément, comme dans la fonction normale de jQuery.css:
JS:
Afficher l'extrait de code
GitHub: https://github.com/yuri-spivak/managing-the-properties-of-pseudo-elements/
la source
Quelqu'un d'autre a commenté l'ajout à l'élément head avec un élément de style complet et ce n'est pas mal si vous ne le faites qu'une seule fois, mais si vous devez le réinitialiser plus d'une fois, vous vous retrouverez avec une tonne d'éléments de style. Donc, pour éviter que j'ai créé un élément de style vide dans la tête avec un identifiant et remplacez le innerHTML de celui-ci comme ceci:
Ensuite, le JavaScript ressemblerait à ceci:
Maintenant, dans mon cas, j'avais besoin de cela pour définir la hauteur d'un élément avant en fonction de la hauteur d'un autre et il changera lors du redimensionnement.En utilisant cela, je peux exécuter
setHeight()
chaque fois que la fenêtre est redimensionnée et il remplacera<style>
correctement.J'espère que cela aide quelqu'un qui était coincé à essayer de faire la même chose.
la source
J'ai quelque chose de différent pour vous, simple et efficace.
la source