Comment remplacer! Important?

250

J'ai créé une feuille de style personnalisée qui remplace le CSS d'origine pour mon modèle Wordpress. Cependant, sur ma page de calendrier, le CSS d'origine a la hauteur de chaque cellule de tableau définie avec la !importantdéclaration:

td {height: 100px !important}

Existe-t-il un moyen de contourner cela?

user1444027
la source
3
Avez-vous également essayé d'utiliser !important? Si votre feuille CSS est définie après le modèle d'origine, cela devrait bien fonctionner.
Petr Janeček
1
Quelle feuille vient en dernier, la vôtre ou celle du modèle?
j08691
67
C'est pourquoi !importantest considéré comme nocif.
Spudley
8
Le moyen le plus puissant est le suivant: td [style] {hauteur: 110px! Important; }. il agit comme si vous injectiez le style en ligne au html car vous appliquez les styles à l'attribut de style réel de la balise.
DMTintner

Réponses:

352

Remplacer le modificateur! Important

  1. Ajoutez simplement une autre règle CSS avec !importantet donnez au sélecteur une spécificité plus élevée (en ajoutant une balise, un identifiant ou une classe supplémentaire au sélecteur)
  2. ajouter une règle CSS avec le même sélecteur à un point ultérieur que celui existant (dans une égalité, le dernier défini gagne).

Quelques exemples avec une spécificité plus élevée (le premier est le plus élevé / remplace, le troisième est le plus bas):

table td    {height: 50px !important;}
.myTable td {height: 50px !important;}
#myTable td {height: 50px !important;}

Ou ajoutez le même sélecteur après celui existant:

td {height: 50px !important;}

Avertissement:

Ce n'est presque jamais une bonne idée à utiliser !important. C'est une mauvaise ingénierie par les créateurs du modèle WordPress. De manière virale, il oblige les utilisateurs du modèle à ajouter leurs propres !importantmodificateurs pour le remplacer, et il limite les options pour le remplacer via JavaScript.

Mais, il est utile de savoir comment le remplacer, si vous devez parfois le faire.

Matt Coughlin
la source
7
Je sais que c'est un peu sur le côté le plus ancien des réponses, mais pouvez-vous peut-être ajouter un commentaire que c'est une très mauvaise façon de créer votre CSS (ou indiquer pourquoi il est acceptable si vous n'êtes pas d'accord)? J'ai vu des gens se référer à cette réponse ... :)
ZenMaster
Très bonne réponse. Je suis d'accord, c'est un gâchis. Cela m'oblige à pirater leur hack, puis quelqu'un à pirater mon hack, etc. Dans mon cas, je dois gérer des modèles qui tirent leur CSS d'une base de données quelque part. Je grep le dump DB et il me montre qu'il vient d'un blob json de 1 Mo. Pas très utile pour moi de trouver où le changer, me forçant à ajouter du CSS à un fichier de code, comme cela devrait être fait, sauf avec ces méchants hacks.
Josh Ribakoff
il peut être judicieux d'ajouter également l'identifiant de balise même s'il ralentit le CSS. Je devais juste en corriger un où je devais mettre div # header.class {style:; } pour qu'il prenne ... très ennuyeux
Sparatan117
Il y a de bonnes utilisations pour !important. Comme un remplacement de style à l'échelle du navigateur ou du site à partir d'un script élégant, AdBlock ou uBlock. Ou lorsque vous n'avez pas un accès raisonnablement facile au CSS de base, qui peut être très complexe, réparti sur de nombreux fichiers et évoluer dans le temps (et peut également être utilisé !important). Comme tout outil, le potentiel positif ou négatif dépend de la façon dont vous l'utilisez. Les gens doivent arrêter de devenir singes chaque fois que des choses comme ça ou goto / eval / globals / etc. sont mentionnés. Autant dire "éviter WordPress" ou "éviter CSS" car le potentiel de "gâcher les choses" est trop grand.
Beejor
30

Le !importantne doit être utilisé que lorsque vous avez des sélecteurs dans votre feuille de style avec une spécificité conflictuelle .

Mais même lorsque vous avez une spécificité conflictuelle, il est préférable de créer un sélecteur plus spécifique pour l'exception. Dans votre cas, il est préférable d'avoir un classcode HTML que vous pouvez utiliser pour créer un sélecteur plus spécifique qui n'a pas besoin de la !importantrègle.

td.a-semantic-class-name { height: 100px; }

Personnellement, je n'utilise jamais !importantdans mes feuilles de style. N'oubliez pas que le C en CSS est destiné à la cascade. L'utilisation !importantrompra cela.

Jasper de Vries
la source
17
Ce n'est pas vrai. Une !importantrègle dans la feuille de style remplacera une règle normale dans une stylebalise, par exemple. Cependant, dans certaines situations, il apparaîtra qu'une règle plus spécifique l'emporte. Par exemple, si vous définissez un font-size: 24pt !importanton body, vous pouvez toujours le remplacer par un font-size: 12pton p. En effet, vous ne remplacez pas la !importantrègle, vous remplacez l'implicite font-size: inheritsur p.
meustrus
23

Avertissement: Évitez! Important à tout prix.

C'est un hack sale, sale, mais vous pouvez remplacer une! Important, sans! Important, en utilisant une animation (en boucle infinie ou très longue durée) sur la propriété sur laquelle vous essayez de remplacer les importants.

@keyframes forceYellow {
  from {
    background-color: yellow;
  }
  to {
    background-color: yellow;
  }
}

div {
  width: 100px;
  height: 100px;
  margin: 0 auto;
  background: red !important;
  animation: 1s linear infinite forceYellow;
}
<div></div>

mariomc
la source
2
potentiellement fatiguer le processeur de l'utilisateur
Berry Tsakala
2
Il semble que cette astuce ne fonctionne plus. Sur Firefox 78 et Chrome 83, la boîte est toujours colorée en rouge.
Andy Pan
13

D'accord, voici une brève leçon sur l'importance CSS. J'espère que ce qui suit aide!

Tout d'abord, chaque partie du style est nommée pondération, donc plus vous avez d'éléments liés à ce style, plus il est important. Par exemple

#P1 .Page {height:100px;}

est plus important que:

.Page {height:100px;}

Donc, lorsque vous utilisez important, idéalement, cela ne devrait être utilisé que lorsque cela est vraiment nécessaire. Donc, pour outrepasser la decleration, rendez le style plus spécifique, mais aussi avec un override. Voir ci-dessous:

td {width:100px !important;}
table tr td .override {width:150px !important;}

J'espère que ça aide!!!

KM123
la source
deux !importantpeuvent être remplacés en redéfinissant .old-class-name {bla bla bla} comme .old-class-name.overrided {bla bla bla} dans la <style></style>balise au-dessus du composant, cela fonctionne pour moi
Tarek Kalaji
11

Remplacer à l'aide de JavaScript

$('.mytable td').attr('style', 'display: none !important');

A travaillé pour moi.

Manish Shrivastava
la source
Je pensais que les styles en ligne l'emportaient toujours sur l'importance d'un parent! drapeau.
Joshua Ramirez
3
@JoshuaRamirez Non, ils ne remplacent pas un drapeau important à moins que vous ne mettiez également le drapeau important en ligne
Cam
1
Si vous allez utiliser JS, vous pouvez tout aussi bien supprimer l'élément entièrement, à moins qu'il n'y ait une possibilité à distance que vous en ayez à nouveau besoin. Stacking! Important via JS vous ramène à la question d'origine.
SilverbackNet
@SilverbackNet Selon ma compréhension, le remplacement de JS est plus précis et fonctionne généralement comme des charges CSS en séquence et des charges de blocs JS jquery après que tout est chargé. Ainsi, il annule les modifications effectuées par css indépendamment des séquences css.
Manish Shrivastava
remplacer comme cela ne fonctionne pas pour les attributs de style.
user2284570
6

Cela peut aussi aider

td[style] {height: 50px !important;}

Cela remplacera tout style en ligne

DiChrist
la source
0

Dans tous les cas, vous pouvez remplacer heightavec max-height.

pasquale
la source
-5

Je voudrais ajouter une réponse à cela qui n'a pas été mentionnée, car j'ai essayé tout ce qui précède en vain. Ma situation spécifique est que j'utilise sémantique-ui, qui a construit des !importantattributs sur des éléments (extrêmement ennuyeux). J'ai tout essayé pour le remplacer, seulement à la fin une chose a fonctionné (en utilisant jquery). C'est comme suit:

$('.active').css('cssText', 'border-radius: 0px !important');
IWI
la source
Cela ne fonctionne pas, voir la réponse de Manish qui utilise à la attr('style', ...place
Christophe Roussy