Mam problem ze stosowaniem takiego stylu !important
. Próbowałem:
$("#elem").css("width", "100px !important");
To nic nie robi ; nie jest stosowany żaden styl szerokości. Czy istnieje jQuery sposób na zastosowanie takiego stylu bez konieczności nadpisywania cssText
(co oznaczałoby, że musiałbym go najpierw przeanalizować itp.)?
Edycja : Powinienem dodać, że mam arkusz stylów ze !important
stylem, który próbuję zastąpić !important
stylem wbudowanym, więc używanie .width()
i tym podobne nie działa, ponieważ jest zastępowane przez mój !important
styl zewnętrzny .
Obliczana jest również wartość, która zastąpi poprzednią wartość , więc nie mogę po prostu stworzyć innego stylu zewnętrznego.
javascript
jquery
html
css
mkoryak
źródło
źródło
.css
i!important
rdzenia jQuery. Błąd został zamknięty, ponieważ „nie można go naprawić”. Jednak przypadek testowy tego błędu nie był tak restrykcyjny jak ten w tym pytaniu - przypadek testowy nie miał wbudowanego!important
stylu, który próbował zastąpić. Dlatego proponowane obejście tego błędu nie będzie działać w tym przypadku.Odpowiedzi:
Problem jest spowodowany niezrozumieniem
!important
atrybutu przez jQuery i dlatego nie stosuje reguły.Możesz być w stanie obejść ten problem i zastosować regułę, odwołując się do niego za pośrednictwem
addClass()
:Lub używając
attr()
:To drugie podejście jednak rozbroiłoby wszelkie wcześniej ustawione reguły stylu w linii. Więc używaj ostrożnie.
Oczywiście istnieje dobry argument, że metoda @Nick Craver jest łatwiejsza / mądrzejsza.
Powyższe
attr()
podejście nieznacznie zmodyfikowano, aby zachować oryginalnystyle
ciąg / właściwości, i zmodyfikowano zgodnie z sugestią falko w komentarzu:źródło
'undefinedwidth: 100px !important;'
gdy obecny styl będzie pusty.Myślę, że znalazłem prawdziwe rozwiązanie. Wprowadziłem nową funkcję:
jQuery.style(name, value, priority);
Możesz go użyć do uzyskania wartości z
.style('name')
podobnie.css('name')
, uzyskać CSSStyleDeclaration z.style()
, a także ustawić wartości - z możliwością określenia priorytetu jako „ważny”. Zobacz to .Próbny
Oto wynik:
Funkcja
Zobacz to, jak czytać i ustawiać wartości CSS. Mój problem polegał na tym, że już ustawiłem
!important
szerokość w swoim CSS, aby uniknąć konfliktów z innym CSS motywu, ale wszelkie zmiany wprowadzone w szerokości w jQuery pozostaną niezmienione, ponieważ zostaną dodane do atrybutu style.Zgodność
Aby ustawić priorytet za pomocą
setProperty
funkcji, w tym artykule jest mowa o obsłudze IE 9+ i wszystkich innych przeglądarek. Próbowałem z IE 8 i nie powiodło się, dlatego zbudowałem obsługę tego w moich funkcjach (patrz wyżej). Będzie działał na wszystkich innych przeglądarkach korzystających z setProperty, ale będzie potrzebował mojego niestandardowego kodu do pracy w <IE 9.źródło
!important
w swoim stylu, przynajmniej na rzeczy masz zamiar zmiany z jQuery ... Dopóki oni są twoi style. Jeśli Twój kod działa na stronie kodowanej przez ucznia, który omija zasady dotyczące swoistości, uderzając!important
co drugi styl,!importants
wcześniej lub później włączysz jedną z nich .Możesz ustawić szerokość bezpośrednio za pomocą
.width()
:Zaktualizowano dla komentarzy: Masz również tę opcję, ale zastąpi ona wszystkie css w elemencie, więc nie jestem pewien, czy jest to bardziej opłacalne:
źródło
$('#elem').css('cssText', $('#elem').css('cssText')+'width: 100px !important');
konkatując go z poprzednią wartościąUwaga: korzystanie z Chrome może zwrócić błąd, taki jak:
Zmiana linii w celu użycia
.removeProperty
funkcji, np. W celuelem[0].style.removeProperty('width');
rozwiązania problemu.źródło
var = document.getElementById('elem');
i wykonaj metody stylu na elemie (w przeciwieństwie do elem [0]). Twoje zdrowie.var style = document.getElementById('elem'); style.removeProperty('width'); style.setProperty('width, '100px', 'important')
.removeAttribute
. Wydaje się, że jest to metoda tylko dla IE . Komentarz @mcoenca ma rację;.removeProperty
działa w porządku. To IE9 + według MSDNelem.next().get(0).style...
Odpowiedź Davida Thomasa opisuje sposób użycia
$('#elem').attr('style', …)
, ale ostrzega, że użycie go usunie wcześniej ustawione style wstyle
atrybucie. Oto sposób korzystaniaattr()
bez tego problemu:Jako funkcja:
Oto demo JS Bin .
źródło
addStyleAttribute()
można również zmodyfikować, aby przyjmował te same parametry, co jQuery.css()
. Na przykład, może wspierać przeniesienie mapy właściwości CSS do ich wartości. Gdybyś to zrobił, w zasadzie byłbyś ponownie wdrażany.css()
z!important
naprawionym błędem, ale bez żadnych optymalizacji.Po przeczytaniu innych odpowiedzi i eksperymentowaniu, to działa dla mnie:
Nie działa to jednak w IE 8 i starszych wersjach.
źródło
Możesz to zrobić:
Używanie „cssText” jako nazwy właściwości i wszystkiego, co chcesz dodać do CSS jako jego wartości.
źródło
cssText
tam było wcześniej - więc nie można tak naprawdę swobodnie z niego korzystaćMożesz to osiągnąć na dwa sposoby:
źródło
.prop()
funkcja została dodana w jQuery v1.6 i będzie działać w Chrome ... cytowano to na stronie prop: Przed jQuery 1.6.attr()
metoda czasami brała pod uwagę wartości właściwości przy pobieraniu niektórych atrybutów, co może powodować niespójne zachowanie. Począwszy od jQuery 1.6,.prop()
metoda zapewnia sposób jawnego pobierania wartości właściwości, podczas gdy.attr()
pobiera atrybuty.Nie ma potrzeby przechodzenia do złożoności odpowiedzi @ AramKocharyan ani potrzeby dynamicznego wstawiania tagów stylu.
Po prostu nadpisz styl, ale nie musisz nic analizować, dlaczego miałbyś?
Nie można używać
removeProperty()
, ponieważ nie usunie!important
reguł w Chrome.Nie można użyć
element.style[property] = ''
, ponieważ akceptuje tylko camelCase w przeglądarce Firefox.Prawdopodobnie można by to skrócić za pomocą jQuery, ale ta funkcja waniliowa będzie działać w nowoczesnych przeglądarkach, Internet Explorer 8 itp.
źródło
Oto, co zrobiłem po napotkaniu tego problemu ...
źródło
To rozwiązanie nie zastępuje żadnego z poprzednich stylów, po prostu stosuje ten, którego potrzebujesz:
źródło
Jeśli nie jest to tak istotne, a ponieważ masz do czynienia z jednym elementem
#elem
, możesz zmienić jego identyfikator na inny i nadać mu dowolny styl ...A w twoim CSS:
źródło
Zamiast korzystać z
css()
funkcji, wypróbujaddClass()
funkcję:źródło
Najłatwiejszym i najlepszym rozwiązaniem tego problemu ode mnie było po prostu użycie addClass () zamiast .css () lub .attr ().
Na przykład:
$('#elem').addClass('importantClass');
A w twoim pliku CSS:
źródło
Do twojej wiadomości, to nie działa, ponieważ jQuery go nie obsługuje. W 2012 r. Zgłoszono zgłoszenie (nr 11173 $ (elem) .css („właściwość”, „wartość! Ważna”) nie działa ), które ostatecznie zostało zamknięte jako WONTFIX.
źródło
Większość tych odpowiedzi jest obecnie nieaktualna, obsługa IE7 nie stanowi problemu.
Najlepszym sposobem na to, który obsługuje IE11 + i wszystkie nowoczesne przeglądarki, jest:
Lub jeśli chcesz, możesz utworzyć małą wtyczkę jQuery, która to robi. Ta wtyczka ściśle pasuje do własnej
css()
metody jQuery pod względem obsługiwanych parametrów:Przykład jsfiddle tutaj .
źródło
Musimy najpierw usunąć poprzedni styl. Usuwam go za pomocą wyrażenia regularnego. Oto przykład zmiany koloru:
źródło
$selector.css('cssText','margin-bottom: 0 !important')
Alternatywny sposób na dodanie stylu do głowy:
To dodaje styl po wszystkich twoich plikach CSS, więc będzie miał wyższy priorytet niż inne pliki CSS i zostanie zastosowany.
źródło
Może to wyglądać tak:
Pamięć podręczna
Ustaw CSS
Usuń CSS
źródło
Myślę, że działa OK i może zastąpić każdy inny CSS wcześniej (this: DOM element):
źródło
Zrób to tak:
źródło
To rozwiązanie pozostawi cały obliczony javascript i doda ważny znacznik do elementu: Możesz to zrobić (np. Jeśli musisz ustawić szerokość za pomocą ważnego znacznika)
źródło
Trzy działające przykłady
Miałem podobną sytuację, ale użyłem .find () po długim zmaganiu się z .closest () z wieloma odmianami.
Przykładowy kod
Alternatywny
Praca: http://jsfiddle.net/fx4mbp6c/
źródło
.indexOf()
funkcji czymś, co jest bardziej kompatybilne z różnymi przeglądarkami. Użyj raczej.match()
lub.test()
zamiast.indexOf()
var contents =
?Może to być lub nie być odpowiednie dla twojej sytuacji, ale możesz użyć selektorów CSS w wielu tego typu sytuacjach.
Jeśli na przykład chciałbyś, aby 3. i 6. instancja .cssText miała inną szerokość, możesz napisać:
Lub:
źródło
.cssText
.:nth-of-type()
nie robi tego, co myślisz. Zobacz tutaj wyjaśnienie.li
elementów. Wszystkie mają ten sam typ elementuli
, co dotyczy selektora. Jeśli miałbyś miksować różne elementy w tym samym rodzicu,:nth-of-type()
zachowywałbyś się inaczej, zwłaszcza po dodaniu selektora klasy do miksu.Zakładam, że wypróbowałeś to bez dodawania
!important
?Inline CSS (czyli sposób dodawania stylów przez JavaScript) zastępuje arkusz stylów CSS. Jestem pewien, że tak jest nawet w przypadku reguły CSS arkusza stylów
!important
.Kolejne pytanie (może głupie pytanie, ale trzeba je zadać.): Czy element, nad którym próbujesz pracować,
display:block;
czydisplay:inline-block;
?Nie znając swojej wiedzy na temat CSS ... elementy wbudowane nie zawsze zachowują się tak, jak można się spodziewać.
źródło
Do dodania możemy użyć setProperty lub cssText
!important
element DOM za pomocą JavaScript.Przykład 1:
Przykład 2:
źródło
Odkryłem również, że niektóre elementy lub dodatki (takie jak Bootstrap) mają specjalne przypadki klasowe, w których nie działają dobrze z
!important
innymi rozwiązaniami.addClass/.removeClass
, i dlatego musisz je włączać / wyłączać.Na przykład, jeśli używasz czegoś w rodzaju
<table class="table-hover">
jedynego sposobu skutecznego modyfikowania elementów, takich jak kolory wierszy, to włączanietable-hover
/ wyłączanie klasy, tak jak to$(your_element).closest("table").toggleClass("table-hover");
Mam nadzieję, że to obejście będzie komuś pomocne! :)
źródło
Miałem ten sam problem, próbując zmienić kolor tekstu elementu menu podczas „zdarzenia”. Najlepszym sposobem, jaki znalazłem, gdy miałem ten sam problem, było:
Pierwszy krok: Utwórz w swoim CSS nową klasę w tym celu, na przykład:
Ostatni krok: zastosuj tę klasę za pomocą metody addClass w następujący sposób:
Problem rozwiązany.
źródło
Najbezpieczniejszym obejściem tego problemu jest dodanie klasy, a następnie wykonanie magii w CSS :-)
addClass()
iremoveClass()
powinno to zrobić.źródło
https://jsfiddle.net/xk6Ut/256/
Alternatywnym podejściem jest dynamiczne tworzenie i aktualizowanie klasy CSS w JavaScript. Aby to zrobić, możemy użyć elementu stylu i musimy użyć identyfikatora dla elementu stylu, abyśmy mogli zaktualizować klasę CSS
...
źródło