Jak złożyć wniosek! Ważne za pomocą .css ()?


734

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 !importantstylem, który próbuję zastąpić !importantstylem wbudowanym, więc używanie .width()i tym podobne nie działa, ponieważ jest zastępowane przez mój !importantstyl zewnętrzny .

Obliczana jest również wartość, która zastąpi poprzednią wartość , więc nie mogę po prostu stworzyć innego stylu zewnętrznego.


Warto zauważyć, że tak naprawdę działa w Chrome (przynajmniej dla mnie), ale nie w Firefox.
Peter Jaric

Działa to również dla mnie w Chrome 17.xi Safari 5.1.1, ale nie w FF 8.0.
DavidJ

Nie działa dla mnie na Chromium 20.0.x przy użyciu JQuery 1.8.2.
Alba Mendez

7
Błąd jQuery # 11173 dotyczył naprawy .cssi !importantrdzenia 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 !importantstylu, który próbował zastąpić. Dlatego proponowane obejście tego błędu nie będzie działać w tym przypadku.
Rory O'Kane,

2
Możliwy duplikat Zastąpienie! Ważne z css lub jquery - Podczas gdy ten jest starszy i ma więcej głosów, drugi ma najczystszą, najcenniejszą odpowiedź.
Jason C,

Odpowiedzi:


603

Problem jest spowodowany niezrozumieniem !importantatrybutu 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():

.importantRule { width: 100px !important; }

$('#elem').addClass('importantRule');

Lub używając attr():

$('#elem').attr('style', 'width: 100px !important');

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ć oryginalny styleciąg / właściwości, i zmodyfikowano zgodnie z sugestią falko w komentarzu:

$('#elem').attr('style', function(i,s) { return (s || '') + 'width: 100px !important;' });

2
pochylam się nad twoim ostatnim podejściem, ale smutne jest to, że prawdopodobnie źle skończę z analizowaniem poprzedniego cssText, ponieważ nie mogę go po prostu odrzucić
mkoryak

1
ah, przepraszam, nie mogłem tego zdobyć, czasem angielski humor wykracza poza moje rozumienie ... :)
Sinan

1
Co z zagnieżdżonymi cudzysłowami („” szerokość: 100 pikseli! Ważne ””)? Nie działało to dla mnie, ale kiedy usunąłem wewnętrzne cytaty, zadziałało. Dzięki!
Peter Jaric

15
mała poprawka, gdy styl jest pusty: $ ('# elem'). attr ('styl', funkcja (i, s) {return (s || '') + 'szerokość: 100px! ważne;'});
falko

4
Powinieneś dodać poprawkę @ falko, ponieważ w Firefoksie twój ostatni fragment kodu ustawi styl, 'undefinedwidth: 100px !important;'gdy obecny styl będzie pusty.
acdcjunior

332

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

var div = $('someDiv');
console.log(div.style('color'));
div.style('color', 'red');
console.log(div.style('color'));
div.style('color', 'blue', 'important');
console.log(div.style('color'));
console.log(div.style().getPropertyPriority('color'));

Oto wynik:

null
red
blue
important

Funkcja

(function($) {    
  if ($.fn.style) {
    return;
  }

  // Escape regex chars with \
  var escape = function(text) {
    return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
  };

  // For those who need them (< IE 9), add support for CSS functions
  var isStyleFuncSupported = !!CSSStyleDeclaration.prototype.getPropertyValue;
  if (!isStyleFuncSupported) {
    CSSStyleDeclaration.prototype.getPropertyValue = function(a) {
      return this.getAttribute(a);
    };
    CSSStyleDeclaration.prototype.setProperty = function(styleName, value, priority) {
      this.setAttribute(styleName, value);
      var priority = typeof priority != 'undefined' ? priority : '';
      if (priority != '') {
        // Add priority manually
        var rule = new RegExp(escape(styleName) + '\\s*:\\s*' + escape(value) +
            '(\\s*;)?', 'gmi');
        this.cssText =
            this.cssText.replace(rule, styleName + ': ' + value + ' !' + priority + ';');
      }
    };
    CSSStyleDeclaration.prototype.removeProperty = function(a) {
      return this.removeAttribute(a);
    };
    CSSStyleDeclaration.prototype.getPropertyPriority = function(styleName) {
      var rule = new RegExp(escape(styleName) + '\\s*:\\s*[^\\s]*\\s*!important(\\s*;)?',
          'gmi');
      return rule.test(this.cssText) ? 'important' : '';
    }
  }

  // The style function
  $.fn.style = function(styleName, value, priority) {
    // DOM node
    var node = this.get(0);
    // Ensure we have a DOM node
    if (typeof node == 'undefined') {
      return this;
    }
    // CSSStyleDeclaration
    var style = this.get(0).style;
    // Getter/Setter
    if (typeof styleName != 'undefined') {
      if (typeof value != 'undefined') {
        // Set style property
        priority = typeof priority != 'undefined' ? priority : '';
        style.setProperty(styleName, value, priority);
        return this;
      } else {
        // Get style property
        return style.getPropertyValue(styleName);
      }
    } else {
      // Get CSSStyleDeclaration
      return style;
    }
  };
})(jQuery);

Zobacz to, jak czytać i ustawiać wartości CSS. Mój problem polegał na tym, że już ustawiłem !importantszerokość 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ą setPropertyfunkcji, 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.


przetestowałeś to w innych przeglądarkach?
mkoryak

2
Istnieje również wtyczka jQuery.important, która została opublikowana kilka lat temu. Używam go w produkcji tylko z jednym drobnym problemem (zobacz kartę Problemy.
Colllin

14
$ ('.someclass') .each (function () {this.style.setProperty ('border', 'none', 'important');}); stackoverflow.com/questions/11962962/... Prostsze, czystsze i bardziej wydajne.

3
Jedynym dobrym sposobem na poradzenie sobie z tym jest użycie klas, a nie bezpośrednie wstrzykiwanie stylu.
Richard

3
@Richard, jedynym dobrym sposobem radzenia sobie z tym jest nie do wykorzystania !importantw 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 !importantco drugi styl, !importantswcześniej lub później włączysz jedną z nich .
Septagram

149

Możesz ustawić szerokość bezpośrednio za pomocą .width():

$("#elem").width(100);

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:

$('#elem').css('cssText', 'width: 100px !important');

ok, użyłem jako przykładu, najważniejsze jest ustawienie! ważne.
mkoryak

1
również zredagowałem pytanie, aby lepiej odzwierciedlić moją sytuację. Zasadniczo mam zewnętrzną! ważną szerokość, która jest ustawiona na coś złego, co muszę zastąpić w linii. width () nie działa z tego powodu
mkoryak 16.04.2010

@mkoryak - Zaktualizowano z jedyną inną nieklasową opcją, nie jestem pewien, czy będzie pasować do Twojej sytuacji, czy nie.
Nick Craver

1
Ale zastąpi każdy inny styl zastosowany bezpośrednio do elementu. stackoverflow.com/a/11723492/491044 jest najłatwiejszy do wdrożenia.
trgraglia

10
zapobiec nadpisywaniu, $('#elem').css('cssText', $('#elem').css('cssText')+'width: 100px !important');konkatując go z poprzednią wartością
Abel Callejo,

81
const elem = $("#elem");
elem[0].style.removeAttribute('width');
elem[0].style.setProperty('width', '100px', 'important');

Uwaga: korzystanie z Chrome może zwrócić błąd, taki jak:

elem [0] .style.removeAttribute nie jest funkcją

Zmiana linii w celu użycia .removePropertyfunkcji, np. W celu elem[0].style.removeProperty('width');rozwiązania problemu.


10
To jedna z najlepszych odpowiedzi. Prosty i działa. I nie wymaga wielu wyjaśnień. To tylko zwykły JavaScript, z wyjątkiem selektora jQuery. jQuery nie zapewnia wsparcia dla „ważnego”, więc najlepiej jest używać zwykłego JS
OMA

2
Jeśli chcesz użyć wanilii, po prostu stwórz var = document.getElementById('elem');i wykonaj metody stylu na elemie (w przeciwieństwie do elem [0]). Twoje zdrowie.
humbolight

3
W waniliowym JS removeAttribute nie działa. Wykonaj następujące czynności. var style = document.getElementById('elem'); style.removeProperty('width'); style.setProperty('width, '100px', 'important')
mcoenca,

2
Miałem też problemy z .removeAttribute. Wydaje się, że jest to metoda tylko dla IE . Komentarz @mcoenca ma rację; .removePropertydziała w porządku. To IE9 + według MSDN
FelipeAls,

2
@Dejan, przepraszam za bardzo późną odpowiedź, ale to powinno zadziałać:elem.next().get(0).style...
RedClover

54

Odpowiedź Davida Thomasa opisuje sposób użycia $('#elem').attr('style', …), ale ostrzega, że ​​użycie go usunie wcześniej ustawione style w styleatrybucie. Oto sposób korzystania attr()bez tego problemu:

var $elem = $('#elem');
$elem.attr('style', $elem.attr('style') + '; ' + 'width: 100px !important');

Jako funkcja:

function addStyleAttribute($element, styleAttribute) {
    $element.attr('style', $element.attr('style') + '; ' + styleAttribute);
}
addStyleAttribute($('#elem'), 'width: 100px !important');

Oto demo JS Bin .


2
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 !importantnaprawionym błędem, ale bez żadnych optymalizacji.
Rory O'Kane

1
Działa to dla mnie dobrze, ponieważ szerokość została zdefiniowana w klasie CSS i musiałem ją dynamicznie zastąpić wartością obliczoną na podstawie szerokości okna przeglądarki i zawartości.
Chris Rasco

30

Po przeczytaniu innych odpowiedzi i eksperymentowaniu, to działa dla mnie:

$(".selector")[0].style.setProperty( 'style', 'value', 'important' );

Nie działa to jednak w IE 8 i starszych wersjach.


1
a ponieważ wciąż musimy wspierać IE8 (niektórzy z nas, pechowcy) - to nie jest dobre.
mkoryak

27

Możesz to zrobić:

$("#elem").css("cssText", "width: 100px !important;");

Używanie „cssText” jako nazwy właściwości i wszystkiego, co chcesz dodać do CSS jako jego wartości.


5
Minusem tego jest to, że nadpisze to, co cssTexttam było wcześniej - więc nie można tak naprawdę swobodnie z niego korzystać
mkoryak

1
w każdym razie możesz użyć $ („# elem”). css („cssText”, „+ =; szerokość: 100 pikseli! ważne;”);
lexa-b

18

Możesz to osiągnąć na dwa sposoby:

$("#elem").prop("style", "width: 100px !important"); // this is not supported in chrome
$("#elem").attr("style", "width: 100px !important");

W rzeczywistości .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.
Mottie

1
Niezbyt dobry pomysł na ogólne rozwiązanie. Korzystając z tego, możesz zastąpić istniejący styl.
Nirav Zaveri,

14

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ś?

// Accepts the hyphenated versions (i.e. not 'cssFloat')
function addStyle(element, property, value, important) {
    // Remove previously defined property
    if (element.style.setProperty)
        element.style.setProperty(property, '');
    else
        element.style.setAttribute(property, '');

    // Insert the new style with all the old rules
    element.setAttribute('style', element.style.cssText +
        property + ':' + value + ((important) ? ' !important' : '') + ';');
}

Nie można używać removeProperty(), ponieważ nie usunie !importantreguł 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.


12

Oto, co zrobiłem po napotkaniu tego problemu ...

var origStyleContent = jQuery('#logo-example').attr('style');
jQuery('#logo-example').attr('style', origStyleContent + ';width:150px !important');

Dziękujemy, jest to o wiele prostsze do wdrożenia niż niestandardowa wtyczka (nawet jeśli potencjalnie niszczy inne wbudowane style).
Phrogz

9

To rozwiązanie nie zastępuje żadnego z poprzednich stylów, po prostu stosuje ten, którego potrzebujesz:

var heightStyle = "height: 500px !important";
if ($("foo").attr('style')) {
  $("foo").attr('style', heightStyle + $("foo").attr('style').replace(/^height: [-,!,0-9,a-z, A-Z, ]*;/,''));
else {
  $("foo").attr('style', heightStyle);
}

9

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 ...

$('#elem').attr('id', 'cheaterId');

A w twoim CSS:

#cheaterId { width: 100px;}

9
dlaczego zmieniasz identyfikator, aby zastosować css zamiast po prostu dodać klasę css?
TeKapa

8

Zamiast korzystać z css()funkcji, wypróbuj addClass()funkcję:

  <script>
  $(document).ready(function() {
    $("#example").addClass("exampleClass");
  });
  </script>

  <style>
  .exampleClass{
    width:100% !important;
    height:100% !important;
  }
  </style>

OP napisał, że wartość właściwości jest obliczana dynamicznie, więc twoja odpowiedź nie działa dla niego.
Sebastian Zartner

To rozwiązanie działało dla mnie. Nie sądzę, że mam dokładnie takie same potrzeby jak oryginalny plakat, ale działa tam, gdzie nie działa css ().
leekei

2
To jest rzeczywiście całkowicie rozsądne rozwiązanie problemu ... po prostu nie ten problem!
mkoryak

8

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:

.importantClass {
    width: 100px !important;
}

1
Ponieważ szerokość jest obliczana w JavaScript, nie rozwiązuje to problemu.
Chris


7

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:

const $elem = $("#elem");
$elem[0].style.setProperty('width', '100px', 'important');

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:

/**
 * Sets a CSS style on the selected element(s) with !important priority.
 * This supports camelCased CSS style property names and calling with an object 
 * like the jQuery `css()` method. 
 * Unlike jQuery's css() this does NOT work as a getter.
 * 
 * @param {string|Object<string, string>} name
 * @param {string|undefined} value
 */   
jQuery.fn.cssImportant = function(name, value) {
  const $this = this;
  const applyStyles = (n, v) => {
    // Convert style name from camelCase to dashed-case.
    const dashedName = n.replace(/(.)([A-Z])(.)/g, (str, m1, upper, m2) => {
      return m1 + "-" + upper.toLowerCase() + m2;
    }); 
    // Loop over each element in the selector and set the styles.
    $this.each(function(){
      this.style.setProperty(dashedName, v, 'important');
    });
  };
  // If called with the first parameter that is an object,
  // Loop over the entries in the object and apply those styles. 
  if(jQuery.isPlainObject(name)){
    for(const [n, v] of Object.entries(name)){
       applyStyles(n, v);
    }
  } else {
    // Otherwise called with style name and value.
    applyStyles(name, value);
  }
  // This is required for making jQuery plugin calls chainable.
  return $this;
};
// Call the new plugin:
$('#elem').cssImportant('height', '100px');

// Call with an object and camelCased style names:
$('#another').cssImportant({backgroundColor: 'salmon', display: 'block'});

// Call on multiple items:
$('.item, #foo, #bar').cssImportant('color', 'red');

Przykład jsfiddle tutaj .


1
to jest odpowiedź. Nie ma potrzeby sprawdzania innych odpowiedzi
Shwet

6

Musimy najpierw usunąć poprzedni styl. Usuwam go za pomocą wyrażenia regularnego. Oto przykład zmiany koloru:

var SetCssColorImportant = function (jDom, color) {
       var style = jDom.attr('style');
       style = style.replace(/color: .* !important;/g, '');
       jDom.css('cssText', 'color: ' + color + ' !important;' + style); }

3
Nie wiem, dlaczego tak wiele rozwiązań włamuje znacznik stylu do elementu, gdy metoda cssText działa dobrze ... np.$selector.css('cssText','margin-bottom: 0 !important')
frumbert 13.08.13

6

Alternatywny sposób na dodanie stylu do głowy:

$('head').append('<style> #elm{width:150px !important} </style>');

To dodaje styl po wszystkich twoich plikach CSS, więc będzie miał wyższy priorytet niż inne pliki CSS i zostanie zastosowany.


6

Może to wyglądać tak:

Pamięć podręczna

var node = $ ('. selector') [0];
LUB
var node = document.querySelector ('. selector');

Ustaw CSS

node.style.setProperty („szerokość”, „100px”, „ważne”);

Usuń CSS

node.style.removeProperty ('width');
LUB
node.style.width = '';

6

Myślę, że działa OK i może zastąpić każdy inny CSS wcześniej (this: DOM element):

this.setAttribute('style', 'padding:2px !important');


5

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)

$('exampleDiv').css('width', '');
//This will remove the width of the item
var styles = $('exampleDiv').attr('style');
//This will contain all styles in your item
//ex: height:auto; display:block;
styles += 'width: 200px !important;'
//This will add the width to the previous styles
//ex: height:auto; display:block; width: 200px !important;
$('exampleDiv').attr('style', styles);
//This will add all previous styles to your item

4

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

// Allows contain functions to work, ignores case sensitivity

jQuery.expr[':'].contains = function(obj, index, meta, stack) {
    result = false;
    theList = meta[3].split("','");
    var contents = (obj.textContent || obj.innerText || jQuery(obj).text() || '')
    for (x=0; x<theList.length; x++) {
        if (contents.toLowerCase().indexOf(theList[x].toLowerCase()) >= 0) {
            return true;
        }
    }
    return false;
};

$(document).ready(function() {
    var refreshId = setInterval( function() {
        $("#out:contains('foo', 'test456')").find(".inner").css('width', '50px', 'important');
    }, 1000); // Rescans every 1000 ms
});

Alternatywny

$('.inner').each(function () {
    this.style.setProperty('height', '50px', 'important');
});

$('#out').find('.inner').css({ 'height': '50px'});

Praca: http://jsfiddle.net/fx4mbp6c/


Oszczędzę ci głosowania w dół, ale powinieneś zdecydować się na zastąpienie tej .indexOf()funkcji czymś, co jest bardziej kompatybilne z różnymi przeglądarkami. Użyj raczej .match()lub .test()zamiast.indexOf()
Alexander Dixon

Dlaczego nie ma średnika zgodnego z var contents = ?
Peter Mortensen

3

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ć:

.cssText:nth-of-type(3), .cssText:nth-of-type(6) {width:100px !important;}

Lub:

.container:nth-of-type(3).cssText, .container:nth-of-type(6).cssText {width:100px !important;}

To nie pasuje do trzeciego i szóstego wystąpienia .cssText. :nth-of-type()nie robi tego, co myślisz. Zobacz tutaj wyjaśnienie.
BoltClock

Słusznie. Przeczytałem link, ale nie jestem pewien, czy zrozumiałem twój punkt widzenia. Oto skrzypce pokazujące, że działa zgodnie z przeznaczeniem: jsfiddle.net/d2E4b
Tim Cutting

2
W skrzypcach masz do czynienia z szeregiem lielementów. Wszystkie mają ten sam typ elementu li, 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.
BoltClock

3

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;czy display:inline-block;?

Nie znając swojej wiedzy na temat CSS ... elementy wbudowane nie zawsze zachowują się tak, jak można się spodziewać.


4
Reguły css, które mają! ważne, zastępują wszystko, bez względu na to, gdzie się znajdują, z wyjątkiem tego, że style wbudowane z! ważne zastąpią style arkusza stylów z! ważne. To jest problem, który mam. istnieje zasada arkusza stylów z! Ważne, którą chciałbym zastąpić. co więcej, wartość, którą muszę podać, musi być obliczona przez JS, więc nie mogę po prostu zmienić samego arkusza stylów.
mkoryak

3

Do dodania możemy użyć setProperty lub cssText !important element DOM za pomocą JavaScript.

Przykład 1:

elem.style.setProperty ("color", "green", "important");

Przykład 2:

elem.style.cssText='color: red !important;'

2

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 !importantinnymi 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łączanie table-hover/ wyłączanie klasy, tak jak to

$(your_element).closest("table").toggleClass("table-hover");

Mam nadzieję, że to obejście będzie komuś pomocne! :)


2

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:

.colorw{ color: white !important;}

Ostatni krok: zastosuj tę klasę za pomocą metody addClass w następujący sposób:

$('.menu-item>a').addClass('colorw');

Problem rozwiązany.


1
Najlepsza odpowiedź, moim zdaniem. Najwygodniejszy.
Siyah

Dzięki @Siyah CSS jest znany przez mnóstwo ppl, ale rozumiany tylko dla nielicznych i to jest smutne i sprawia, że ​​niektórzy programiści go nienawidzą lol
JoelBonetR

Nie jeśli jednak chcesz wygenerować wartość CSS za pomocą js, na przykład wartość koloru zdefiniowana w JS. W przeciwnym razie jest to miłe.
Carl Papworth,

dlaczego chcesz zdefiniować kolor w js?
JoelBonetR

2

Najbezpieczniejszym obejściem tego problemu jest dodanie klasy, a następnie wykonanie magii w CSS :-) addClass()i removeClass()powinno to zrobić.


1

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

function writeStyles(styleName, cssText) {
    var styleElement = document.getElementById(styleName);
    if (styleElement) document.getElementsByTagName('head')[0].removeChild(
        styleElement);
    styleElement = document.createElement('style');
    styleElement.type = 'text/css';
    styleElement.id = styleName;
    styleElement.innerHTML = cssText;
    document.getElementsByTagName('head')[0].appendChild(styleElement);
}

...

  var cssText = '.testDIV{ height:' + height + 'px !important; }';
  writeStyles('styles_js', cssText)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.