J'ai une page qui contient une image et je l'ai stylée avec: avant les sélecteurs CSS.
L'image est dynamique et n'a donc pas de largeur fixe; Il me faut donc définir: avant la largeur de la règle de manière dynamique.
Je veux le faire côté client en utilisant JQuery.
Supposons ceci:
.column:before{
width: 300px;
float: left;
content: "";
height: 430px;
}
.column{
width: 500px;
float: right;
padding: 5px;
overflow: hidden;
text-align: justify;
}
Comment puis-je changer la propriété width de la classe avec :before
sélecteur (et pas un sans lui) avec JQuery?
Je ne pense pas qu'il existe un moyen jQuery d'accéder directement aux règles de la pseudoclasse, mais vous pouvez toujours ajouter un nouvel élément style
à la tête du document, comme:
$('head').append('<style>.column:before{width:800px !important;}</style>');
Voir un démonstration en direct ici
Je me souviens aussi d'avoir vu un plugin s'attaquer à ce problème une fois, mais je ne pouvais malheureusement pas le trouver lors de la première recherche sur Google.
Les pseudo-éléments font partie du DOM fantôme et ne peuvent pas être modifiés (mais peut ont leurs valeurs interrogées).
Cependant, vous pouvez parfois contourner cela en utilisant des classes, par exemple.
$('#element').addClass('some-class');
.some-class:before {
/* change your properties here */
}
Cela peut ne pas convenir à votre requête, mais cela montre que vous pouvez parfois atteindre ce modèle.
Pour obtenir la valeur d'un pseudo-élément, essayez un code tel que ...
var pseudoElementContent = window.getComputedStyle($('#element')[0], ':before')
.getPropertyValue('content')
Les pseudo-éléments ne font pas partie du DOM et ne peuvent donc pas être manipulés avec jQuery ou Javascript.
Mais comme indiqué dans la réponse acceptée, vous pouvez utiliser le JS pour ajouter un bloc de style qui termine le style des pseudo-éléments.
La réponse devrait être Jain . Vous ne pouvez pas sélectionner un élément via un pseudo-sélecteur, mais vous pouvez ajouter une nouvelle règle à votre feuille de style avec insertRule
.
J'ai fait quelque chose qui devrait fonctionner pour vous:
var addRule = function(sheet, selector, styles) {
if (sheet.insertRule) return sheet.insertRule(selector + " {" + styles + "}", sheet.cssRules.length);
if (sheet.addRule) return sheet.addRule(selector, styles);
};
addRule(document.styleSheets[0], "body:before", "content: 'foo'");
http://fiddle.jshell.net/MDyxg/1/
Pour être super-cool (et pour répondre à la question vraiment ), je l'ai roulé à nouveau et l'ai emballé dans un plugin jQuery (cependant, jquery est toujours non requis!):
/*!
* jquery.addrule.js 0.0.1 - https://Gist.github.com/yckart/5563717/
* Add css-rules to an existing stylesheet.
*
* @see http://stackoverflow.com/a/16507264/1250044
*
* Copyright (c) 2013 Yannick Albert (http://yckart.com)
* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php).
* 2013/05/12
**/
(function ($) {
window.addRule = function (selector, styles, sheet) {
styles = (function (styles) {
if (typeof styles === "string") return styles;
var clone = "";
for (var p in styles) {
if (styles.hasOwnProperty(p)) {
var val = styles[p];
p = p.replace(/([A-Z])/g, "-$1").toLowerCase(); // convert to dash-case
clone += p + ":" + (p === "content" ? '"' + val + '"' : val) + "; ";
}
}
return clone;
}(styles));
sheet = sheet || document.styleSheets[document.styleSheets.length - 1];
if (sheet.insertRule) sheet.insertRule(selector + " {" + styles + "}", sheet.cssRules.length);
else if (sheet.addRule) sheet.addRule(selector, styles);
return this;
};
if ($) $.fn.addRule = function (styles, sheet) {
addRule(this.selector, styles, sheet);
return this;
};
}(window.jQuery));
L'utilisation est assez simple:
$("body:after").addRule({
content: "foo",
color: "red",
fontSize: "32px"
});
// or without jquery
addRule("body:after", {
content: "foo",
color: "red",
fontSize: "32px"
});
Vous pouvez essayer d'hériter une propriété de la classe de base:
var width = 2;
var interval = setInterval(function () {
var element = document.getElementById('box');
width += 0.0625;
element.style.width = width + 'em';
if (width >= 7) clearInterval(interval);
}, 50);
.box {
/* Set property */
width:4em;
height:2em;
background-color:#d42;
position:relative;
}
.box:after {
/* Inherit property */
width:inherit;
content:"";
height:1em;
background-color:#2b4;
position:absolute;
top:100%;
}
<div id="box" class="box"></div>
Comme Boltclock l'indique dans sa réponse à ). Sélection et manipulation de pseudo-éléments CSS tels que :: before et :: after utilisant jQuery
Bien qu'ils soient rendus par les navigateurs via CSS comme s'ils ressemblaient à d'autres éléments réels du DOM, les pseudo-éléments eux-mêmes ne font pas partie du DOM et vous ne pouvez donc pas les sélectionner et les manipuler avec jQuery.
Il serait peut-être préférable de définir le style avec jQuery au lieu d'utiliser le pseudo sélecteur CSS.
Une option consiste à utiliser un attribut sur l'image et à le modifier à l'aide de jQuery. Alors prenez cette valeur en CSS:
HTML (note je suppose .cloumn
est un div
mais cela pourrait être n'importe quoi):
<div class="column" bf-width=100 >
<img src="..." />
</div>
jQuery:
// General use:
$('.column').attr('bf-width', 100);
// With your image, along the lines of:
$('.column').attr('bf-width', $('img').width());
Et ensuite, pour utiliser cette valeur en CSS:
.column:before {
content: attr(data-content) 'px';
/* ... */
}
Cela va prendre la valeur d'attribut de .column
, et l'appliquer sur l'avant.
Sources: CSS attr (notez le exemples avec avant), jQuery attr.