J'ai du mal à appliquer un style qui est !important
. J'ai essayé:
$("#elem").css("width", "100px !important");
Cela ne fait rien ; aucun style de largeur n'est appliqué. Existe-t-il une façon jQuery d'appliquer un tel style sans avoir à l'écraser cssText
(ce qui signifierait que je devrais d'abord l'analyser, etc.)?
Modifier : je dois ajouter que j'ai une feuille de style avec un !important
style que j'essaie de remplacer avec un !important
style en ligne, donc en utilisant.width()
et similaire ne fonctionne pas car elle est remplacée par mon !important
style externe .
De plus, la valeur qui remplacera la valeur précédente est calculée , donc je ne peux pas simplement créer un autre style externe.
javascript
jquery
html
css
mkoryak
la source
la source
.css
et le!important
noyau jQuery. Le bogue a été fermé car «ne sera pas corrigé». Cependant, le cas de test de ce bogue n'était pas aussi restrictif que celui de cette question - le cas de test n'avait pas de!important
style en ligne qu'il essayait de remplacer. Ainsi, la solution de contournement proposée dans ce bogue ne fonctionnera pas dans ce cas.Réponses:
Le problème est dû au fait que jQuery ne comprend pas l'
!important
attribut et, en tant que tel, ne parvient pas à appliquer la règle.Vous pourrez peut-être contourner ce problème et appliquer la règle en vous y référant via
addClass()
:Ou en utilisant
attr()
:Cependant, cette dernière approche annulerait toutes les règles de style en ligne précédemment définies. À utiliser donc avec précaution.
Bien sûr, il y a un bon argument que la méthode de @Nick Craver est plus facile / plus sage.
L'
attr()
approche ci-dessus a été légèrement modifiée pour conserver lastyle
chaîne / les propriétés d'origine, et modifiée comme suggéré par falko dans un commentaire:la source
'undefinedwidth: 100px !important;'
lorsque le style actuel est vide.Je pense avoir trouvé une vraie solution. Je l'ai transformé en une nouvelle fonction:
jQuery.style(name, value, priority);
Vous pouvez l'utiliser pour obtenir des valeurs avec
.style('name')
tout comme.css('name')
, obtenir la CSSStyleDeclaration avec.style()
, et également définir des valeurs - avec la possibilité de spécifier la priorité comme «importante». Regardez ça .Démo
Voici la sortie:
La fonction
Voir ceci pour des exemples de lecture et de définition des valeurs CSS. Mon problème était que j'avais déjà mis
!important
la largeur dans mon CSS pour éviter les conflits avec d'autres CSS de thème, mais toutes les modifications que j'ai apportées à la largeur dans jQuery ne seraient pas affectées car elles seraient ajoutées à l'attribut style.Compatibilité
Pour définir la priorité à l'aide de la
setProperty
fonction, cet article indique que IE 9+ et tous les autres navigateurs sont pris en charge. J'ai essayé avec IE 8 et il a échoué, c'est pourquoi j'ai intégré le support dans mes fonctions (voir ci-dessus). Il fonctionnera sur tous les autres navigateurs utilisant setProperty, mais il aura besoin de mon code personnalisé pour fonctionner dans <IE 9.la source
!important
dans vos styles, du moins pour les choses que vous allez changer avec jQuery ... Tant que ce sont vos styles. Si votre code s'exécute dans une page codée par un étudiant qui contourne son ignorance des règles de spécificité en appliquant!important
un style sur deux, vous allez vous précipiter tête première dans l'un de ces styles!importants
tôt ou tard.Vous pouvez définir la largeur directement en utilisant
.width()
comme ceci:Mis à jour pour les commentaires: vous avez également cette option, mais elle remplacera tous les css sur l'élément, donc pas sûr qu'elle soit plus viable:
la source
$('#elem').css('cssText', $('#elem').css('cssText')+'width: 100px !important');
concaténant avec la valeur précédenteRemarque: L'utilisation de Chrome peut renvoyer une erreur telle que:
Changer la ligne pour utiliser la
.removeProperty
fonction de manière àelem[0].style.removeProperty('width');
résoudre le problème.la source
var = document.getElementById('elem');
et exécutez simplement les méthodes de style sur elem (par opposition à elem [0]). À votre santé.var style = document.getElementById('elem'); style.removeProperty('width'); style.setProperty('width, '100px', 'important')
.removeAttribute
. Il semble que ce soit uniquement une méthode IE . Le commentaire de @mcoenca a raison;.removeProperty
fonctionne bien. C'est IE9 + selon MSDNelem.next().get(0).style...
La réponse de David Thomas décrit une manière d'utiliser
$('#elem').attr('style', …)
, mais avertit que son utilisation supprimera les styles précédemment définis dans l'style
attribut. Voici une façon d'utiliserattr()
sans ce problème:En tant que fonction:
Voici une démo JS Bin .
la source
addStyleAttribute()
pourrait également être modifié pour prendre les mêmes paramètres que ceux de jQuery.css()
. Par exemple, il pourrait prendre en charge la prise d'une carte des propriétés CSS à leurs valeurs. Si vous faisiez cela, vous seriez en train de réimplémenter.css()
avec le!important
bug corrigé mais sans aucune optimisation.Après avoir lu d'autres réponses et expérimenté, voici ce qui fonctionne pour moi:
Cependant, cela ne fonctionne pas dans IE 8 et les versions antérieures.
la source
Tu peux le faire:
Utiliser "cssText" comme nom de propriété et tout ce que vous voulez ajouter au CSS comme valeur.
la source
cssText
s'y trouvait auparavant - vous ne pouvez donc pas l'utiliser librementVous pouvez y parvenir de deux manières:
la source
.prop()
fonction a été ajoutée dans jQuery v1.6 et fonctionnera dans Chrome.attr()
. Depuis jQuery 1.6, la.prop()
méthode fournit un moyen de récupérer explicitement les valeurs des propriétés, tout en.attr()
récupérant les attributs.Il n'est pas nécessaire d'aller à la complexité de la réponse de @ AramKocharyan, ni à la nécessité d'insérer dynamiquement des balises de style.
Remplacez simplement le style, mais vous n'avez rien à analyser, pourquoi le feriez-vous?
Impossible d'utiliser
removeProperty()
, car il ne supprimera pas les!important
règles dans Chrome.Ne peut pas utiliser
element.style[property] = ''
, car il accepte uniquement camelCase dans Firefox.Vous pourriez probablement raccourcir cela avec jQuery, mais cette fonction vanilla fonctionnera sur les navigateurs modernes, Internet Explorer 8, etc.
la source
Voici ce que j'ai fait après avoir rencontré ce problème ...
la source
Cette solution ne remplace aucun des styles précédents, elle applique simplement celui dont vous avez besoin:
la source
Si ce n'est pas si pertinent et que vous avez affaire à un élément
#elem
, vous pouvez changer son identifiant en quelque chose d'autre et le styler comme vous le souhaitez ...Et dans votre CSS:
la source
Au lieu d'utiliser la
css()
fonction, essayez laaddClass()
fonction:la source
La solution la plus simple et la meilleure pour moi à ce problème était d'utiliser simplement addClass () au lieu de .css () ou .attr ().
Par exemple:
$('#elem').addClass('importantClass');
Et dans votre fichier CSS:
la source
Pour info, cela ne fonctionne pas car jQuery ne le supporte pas. Un ticket a été déposé en 2012 ( # 11173 $ (elem) .css ("propriété", "valeur! Important") échoue ) qui a finalement été fermé en tant que WONTFIX.
la source
La plupart de ces réponses sont désormais obsolètes, la prise en charge d'IE7 n'est pas un problème.
La meilleure façon de le faire qui prend en charge IE11 + et tous les navigateurs modernes est:
Ou si vous le souhaitez, vous pouvez créer un petit plugin jQuery qui fait cela. Ce plugin correspond étroitement à la propre
css()
méthode de jQuery dans les paramètres qu'il prend en charge:Exemple jsfiddle ici .
la source
Nous devons d'abord supprimer le style précédent. Je le supprime en utilisant une expression régulière. Voici un exemple de changement de couleur:
la source
$selector.css('cssText','margin-bottom: 0 !important')
Une autre façon d'ajouter du style dans la tête:
Cela ajoute du style après tous vos fichiers CSS, il aura donc une priorité plus élevée que les autres fichiers CSS et sera appliqué.
la source
Peut-être que ça ressemble à ceci:
Cache
Définir CSS
Supprimer CSS
la source
Je pense que cela fonctionne bien et peut écraser tout autre CSS avant (ceci: élément DOM):
la source
Fais-le comme ça:
la source
Cette solution laissera tout le javascript calculé et ajoutera la balise importante dans l'élément: Vous pouvez le faire (Ex si vous devez définir la largeur avec la balise importante)
la source
Trois exemples pratiques
J'ai eu une situation similaire, mais j'ai utilisé .find () après avoir lutté avec .closest () pendant une longue période avec de nombreuses variantes.
L'exemple de code
Alternative
Fonctionne: http://jsfiddle.net/fx4mbp6c/
la source
.indexOf()
fonction par quelque chose de plus compatible avec tous les navigateurs. Utilisez plutôt,.match()
ou.test()
au lieu de.indexOf()
var contents =
?Cela peut ou non être approprié pour votre situation, mais vous pouvez utiliser des sélecteurs CSS pour un grand nombre de ces types de situations.
Si, par exemple, vous vouliez que les 3e et 6e instances de .cssText aient une largeur différente, vous pourriez écrire:
Ou:
la source
.cssText
.:nth-of-type()
ne fait pas ce que vous pensez qu'il fait. Voir ici pour une explication.li
éléments. Ils sont tous du même type d'élémentli
, ce que traite le sélecteur. Si vous deviez mélanger différents éléments dans le même parent, alors vous vous:nth-of-type()
comporteriez différemment, surtout si vous ajoutez un sélecteur de classe dans le mélange.Je suppose que vous l'avez essayé sans ajouter
!important
?Le CSS en ligne (qui permet à JavaScript d'ajouter du style) remplace le CSS de la feuille de style. Je suis presque sûr que c'est le cas même lorsque la règle CSS de feuille de style a
!important
.Une autre question (peut-être une question stupide mais qui doit être posée.): L'élément sur lequel vous essayez de travailler
display:block;
oudisplay:inline-block;
?Ne connaissant pas votre expertise en CSS ... les éléments en ligne ne se comportent pas toujours comme vous vous y attendez.
la source
Nous pouvons utiliser setProperty ou cssText pour ajouter
!important
à un élément DOM en utilisant JavaScript.Exemple 1:
Exemple 2:
la source
J'ai également découvert que certains éléments ou modules complémentaires (comme Bootstrap) ont des cas de classe spéciaux où ils ne fonctionnent pas bien
!important
ou d'autres solutions de rechange comme.addClass/.removeClass
, et donc vous devez les activer / désactiver.Par exemple, si vous utilisez quelque chose comme
<table class="table-hover">
la seule façon de modifier avec succès des éléments comme les couleurs des lignes est d'activertable-hover
/ désactiver la classe, comme ceci$(your_element).closest("table").toggleClass("table-hover");
J'espère que cette solution de rechange sera utile à quelqu'un! :)
la source
J'ai eu le même problème en essayant de changer la couleur du texte d'un élément de menu lors d'un "événement". La meilleure façon que j'ai trouvée quand j'ai eu ce même problème était:
Première étape: créez, dans votre CSS, une nouvelle classe dans ce but, par exemple:
Dernière étape: appliquez cette classe à l'aide de la méthode addClass comme suit:
Problème résolu.
la source
La solution de contournement la plus sûre est d'ajouter une classe, puis de faire la magie en CSS :-),
addClass()
etremoveClass()
devrait faire le travail.la source
https://jsfiddle.net/xk6Ut/256/
Une autre approche consiste à créer et à mettre à jour dynamiquement la classe CSS en JavaScript. Pour ce faire, nous pouvons utiliser l'élément style et devons utiliser l'ID de l'élément style afin de pouvoir mettre à jour la classe CSS
...
la source