Jak zastąpić! Ważne?

250

Stworzyłem niestandardowy arkusz stylów, który zastępuje oryginalny CSS dla mojego szablonu Wordpress. Jednak na mojej stronie kalendarza oryginalny CSS ma wysokość każdego zestawu komórek tabeli z !importantdeklaracją:

td {height: 100px !important}

Czy jest jakiś sposób, aby to zmienić?

użytkownik1444027
źródło
3
Próbowałeś też użyć !important? Jeśli arkusz CSS jest zdefiniowany po oryginalnym szablonie, powinien działać dobrze.
Petr Janeček
1
Który arkusz jest ostatni, twój czy szablon?
j08691
67
Dlatego !importantjest uważany za szkodliwy.
Spudley,
8
Najpotężniejszy sposób jest taki: td [style] {height: 110px! Ważna; }. działa tak, jakbyś wstrzyknął styl do kodu HTML, ponieważ stosujesz style do faktycznego atrybutu stylu znacznika.
DMTintner

Odpowiedzi:

352

Przesłanianie! Ważnego modyfikatora

  1. Wystarczy dodać kolejną regułę CSS za pomocą !importanti nadać selektorowi większą specyficzność (dodając dodatkowy znacznik, identyfikator lub klasę do selektora)
  2. dodaj regułę CSS z tym samym selektorem w późniejszym momencie niż istniejący (w remisie wygrywa ostatni zdefiniowany).

Niektóre przykłady o wyższej specyficzności (pierwszy jest najwyższy / zastępuje, trzeci jest najniższy):

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

Lub dodaj ten sam selektor po istniejącym:

td {height: 50px !important;}

Zrzeczenie się:

Prawie nigdy nie jest dobrym pomysłem !important. To zła inżynieria twórców szablonu WordPress. W sposób wirusowy zmusza użytkowników szablonu do dodawania własnych !importantmodyfikatorów, aby go przesłonić, i ogranicza opcje zastępowania go przez JavaScript.

Ale warto wiedzieć, jak to zmienić, jeśli czasem trzeba.

Matt Coughlin
źródło
7
Wiem, że jest to nieco starsza strona odpowiedzi, ale czy możesz dodać komentarz, że jest to bardzo zły sposób na tworzenie Twojego CSS (lub podać, dlaczego jest to dopuszczalne, jeśli się nie zgadzasz)? Widziałem ludzi, którzy odnoszą się do tej odpowiedzi ... :)
ZenMaster,
Świetna odpowiedź. Zgadzam się, to bałagan. Zmusza mnie to do włamania się do ich włamania, a następnie do włamania się do mojego włamania itp. W moim przypadku mam do czynienia z szablonami, które wyciągają gdzieś swój CSS z bazy danych. Grep zrzut DB i pokazuje mi, że pochodzi on z 1 MB BLS JSON. Niezbyt przydatne dla mnie w znalezieniu, gdzie to zmienić, zmuszając mnie do dodania CSS do pliku kodu, tak jak należy to zrobić, z wyjątkiem tych paskudnych włamań.
Josh Ribakoff
Zobacz także: Związek między!
Ważnością
dobrym pomysłem może być dodanie identyfikatora tagu, nawet jeśli spowalnia on css. Musiałem tylko naprawić jeden, w którym musiałem wstawić div # header.class {style:; }, aby
zabrało
Są dobre zastosowania !important. Jak zastąpienie stylu przeglądarki lub witryny ze skryptu Stylish, AdBlock lub uBlock. Lub gdy nie masz dość łatwego dostępu do podstawowego CSS, który może być bardzo skomplikowany, rozprzestrzeniać się po wielu plikach i zmieniać z czasem (i może również korzystać !important). Jak każde narzędzie, potencjał dodatni lub ujemny zależy od tego, jak go używasz. Ludzie muszą przestać być małpami, ilekroć takie rzeczy lub goto / eval / globals / itp. wspomniano. Równie dobrze może powiedzieć „unikaj WordPress” lub „unikaj CSS”, ponieważ potencjał do „bałaganu” jest zbyt duży.
Beejor,
30

Tej opcji !importantnależy używać tylko wtedy, gdy w arkuszu stylów znajdują się selektory o sprzecznej specyficzności .

Ale nawet jeśli masz sprzeczną specyfikę, lepiej jest utworzyć bardziej szczegółowy selektor wyjątku. W twoim przypadku lepiej jest mieć classw kodzie HTML, którego można użyć do stworzenia bardziej szczegółowego selektora, który nie potrzebuje !importantreguły.

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

Osobiście nigdy nie używam !importantw moich arkuszach stylów. Pamiętaj, że C w CSS służy do kaskadowania. Używanie !importantto zepsuje.

Jasper de Vries
źródło
17
To nie jest prawda. Na przykład !importantreguła w arkuszu stylów zastąpi normalną regułę w styleznaczniku. Jednak w niektórych sytuacjach może się wydawać, że zastępuje je bardziej szczegółowa reguła. Na przykład, jeśli wybierzesz opcję font-size: 24pt !importantwłączenia body, nadal możesz zastąpić ją funkcją font-size: 12ptwłączenia p. To dlatego, że nie są przesłanianie !importantregułę, jesteś przesłanianie niejawny font-size: inheritON p.
Meustrus
23

Oświadczenie: Unikaj! Ważne za wszelką cenę.

Jest to brudny, brudny hack, ale możesz zastąpić! Ważne, bez! Ważne, używając animacji (nieskończenie zapętlonej lub bardzo długotrwałej) na nieruchomości, na którą próbujesz przesłonić importerów.

@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
źródło
2
potencjalnie obciąża procesor użytkownika
Berry Tsakala
2
Wygląda na to, że ta sztuczka już nie działa. W przeglądarkach Firefox 78 i Chrome 83 pudełko nadal ma kolor czerwony.
Andy Pan
13

Dobra, oto krótka lekcja na temat znaczenia CSS. Mam nadzieję, że poniższe informacje pomogą!

Przede wszystkim każda część stylów określa się jako wagę, więc im więcej elementów związanych z tym stylem, tym ważniejsze jest. Na przykład

#P1 .Page {height:100px;}

jest ważniejsze niż:

.Page {height:100px;}

Tak więc, gdy używasz ważnego, idealnie powinno się go używać tylko wtedy, gdy naprawdę jest naprawdę potrzebne. Aby pominąć declerację, uszczegółowić styl, ale także z przesłonięciem. Patrz poniżej:

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

Mam nadzieję, że to pomoże!!!

KM123
źródło
dwa !importantmogą zostać zastąpione przez ponowne zdefiniowanie .old-class-name {bla bla bla} jako .old-class-name.overrided {bla bla bla} w <style></style>znaczniku nad komponentem, to działa dla mnie
Tarek Kalaji
11

Zastąp za pomocą JavaScript

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

Pracował dla mnie.

Manish Shrivastava
źródło
Myślałem, że style wbudowane zawsze nadpisują ważność rodzica! flaga.
Joshua Ramirez
3
@JoshuaRamirez Nie, tak naprawdę nie przesłaniają ważnej flagi, chyba że umieścisz również! Ważną flagę w linii
Cam
1
Jeśli zamierzasz użyć JS, możesz po prostu całkowicie usunąć element, chyba że istnieje zdalna możliwość, że będziesz go potrzebować ponownie. Układanie w stos! Ważne za pośrednictwem JS przywraca pierwotne pytanie.
SilverbackNet,
@SilverbackNet Zgodnie z moim rozumieniem, przesłonięcie za pomocą JS jest dokładniejsze i zwykle działa, gdy CSS ładuje się sekwencyjnie, a JS blokuje ładowanie bloku JS po załadowaniu wszystkiego. Tak więc, zastępuje zmiany dokonane przez css niezależnie od sekwencji css.
Manish Shrivastava
przesłonięcie w ten sposób nie działa dla atrybutów stylu.
user2284570,
6

To też może pomóc

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

Spowoduje to zastąpienie dowolnego stylu wbudowanego

DiChrist
źródło
0

W każdym razie możesz zastąpić za heightpomocą max-height.

pasquale
źródło
-5

Chciałbym dodać odpowiedź na to pytanie, o której nie wspomniano, ponieważ próbowałem wszystkich powyższych bezskutecznie. Moja szczególna sytuacja polega na tym, że korzystam z semantycznego interfejsu użytkownika, który ma wbudowane !importantatrybuty elementów (bardzo denerwujące). Próbowałem wszystkiego, aby to zastąpić, ale w końcu jedna rzecz zadziałała (używając jquery). Jest to następujące:

$('.active').css('cssText', 'border-radius: 0px !important');
IWI
źródło
To nie działa, patrz odpowiedź Manisha, która używa attr('style', ...zamiast tego
Christophe Roussy