Nadrzędny! Ważny styl


128

Tytuł w dużym stopniu to podsumowuje.

Zewnętrzny arkusz stylów ma następujący kod:

td.EvenRow a {
  display: none !important;
}

Próbowałem użyć:

element.style.display = "inline";

i

element.style.display = "inline !important";

ale nie działa. Czy można zastąpić! Ważny styl za pomocą javascript.

To jest dla rozszerzenia greasemonkey, jeśli to robi różnicę.



Oszczędność czasu @Pacerier!
Eduard

Odpowiedzi:


49

Uważam, że jedynym sposobem na to jest dodanie stylu jako nowej deklaracji CSS z sufiksem „! Important”. Najłatwiej to zrobić, dodając nowy element <style> do nagłówka dokumentu:

function addNewStyle(newStyle) {
    var styleElement = document.getElementById('styles_js');
    if (!styleElement) {
        styleElement = document.createElement('style');
        styleElement.type = 'text/css';
        styleElement.id = 'styles_js';
        document.getElementsByTagName('head')[0].appendChild(styleElement);
    }
    styleElement.appendChild(document.createTextNode(newStyle));
}

addNewStyle('td.EvenRow a {display:inline !important;}')

Reguły dodane powyższą metodą (jeśli użyjesz sufiksu! Important) zastąpią inne poprzednio ustawione style. Jeśli nie używasz przyrostka, pamiętaj, aby wziąć pod uwagę pojęcia takie jak „ specyficzność ”.


8
Można to zastąpić jednowarstwowym. Zobacz poniżej: stackoverflow.com/questions/462537/…
Premasagar

2
Jak znajdziesz selektor, który faktycznie wyzwala styl? Myślę, że wymaga to przeanalizowania wszystkich arkuszy stylów, co jest dość trudną pracą.
user123444555621

254

Można do tego użyć kilku prostych, jednoliniowych linków.

1) Ustaw atrybut „style” dla elementu:

element.setAttribute('style', 'display:inline !important');

lub...

2) Zmodyfikuj cssTextwłaściwość styleobiektu:

element.style.cssText = 'display:inline !important';

Albo zrobi robotę.

===

BTW - jeśli potrzebujesz użytecznego narzędzia do manipulowania !importantregułami w elementach, napisałem wtyczkę jQuery o nazwie „ważne”: http://github.com/premasagar/important


Myślę, że użycie cssText jest prostsze niż dodanie styletagu.
Guss

1
@Guss - Pierwszy przykład, który podałem, dotyczy styleatrybutu, a nie tagu / elementu.
Premasagar

53
Aby zapobiec zastępowaniu innych właściwości, których chcesz użyćelement.style.cssText += ';display:inline !important;';
user123444555621

5
To jest lepsza odpowiedź niż wybrana, na pewno +1, aby uzyskać wyższą.
Nathan C. Tresch

2
@ user123444555621, Premasagar. Równie dobrze można użyć opcji lepsze: element.style.setProperty.
Pacerier,

185

element.stylema setPropertymetodę, która może przyjąć priorytet jako trzeci parametr:

element.style.setProperty("display", "inline", "important")

To nie działa w starych IES ale powinno być dobrze w obecnych przeglądarek.



4
Najlepsze rozwiązanie, ponieważ nie zastępuje całego atrybutu stylu i jest zgodne z zamierzeniem W3C.
stfn

jego wadą jest to, że nie mogę używać nazw właściwości w camelCase, takich jakboxShadow
Pavan,

@Pavan Łatwo jest zamiast tego użyć dzielonego formularza lub, jeśli chcesz go automatycznie przekonwertować, po prostu napisz funkcję.
nyuszika7h

3

Opierając się na doskonałej odpowiedzi @ Premasagar; jeśli nie chcesz usuwać wszystkich innych stylów wbudowanych, użyj tego

//accepts the hyphenated versions (i.e. not 'cssFloat')
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żyć, removeProperty()ponieważ nie spowoduje to usunięcia !importantreguł w Chrome.
Nie można użyć, element.style[property] = ''ponieważ akceptuje tylko camelCase w FireFox.


Równie dobrze można użyć opcji lepsze: element.style.setProperty.
Pacerier,

1

Lepsza metoda, którą właśnie odkryłem: spróbuj być bardziej szczegółowym niż CSS strony z twoimi selektorami. Po prostu musiałem to zrobić dzisiaj i działa jak urok! Więcej informacji na stronie W3C: http://www.w3.org/TR/CSS2/cascade.html#specificity


2
Nuck, dzięki za przesłanie wnikliwej odpowiedzi. Byłoby jeszcze bardziej pomocne, gdybyś poświęcił trochę czasu na podanie przykładu przy użyciu kodu oryginalnego pytania.
Leif Wickland,

1

Jeśli chcesz zaktualizować / dodać pojedynczy styl w atrybucie stylu elementu DOM, możesz użyć tej funkcji:

function setCssTextStyle(el, style, value) {
  var result = el.style.cssText.match(new RegExp("(?:[;\\s]|^)(" +
      style.replace("-", "\\-") + "\\s*:(.*?)(;|$))")),
    idx;
  if (result) {
    idx = result.index + result[0].indexOf(result[1]);
    el.style.cssText = el.style.cssText.substring(0, idx) +
      style + ": " + value + ";" +
      el.style.cssText.substring(idx + result[1].length);
  } else {
    el.style.cssText += " " + style + ": " + value + ";";
  }
}

style.cssText jest obsługiwany we wszystkich głównych przeglądarkach .

Przykład użycia:

var elem = document.getElementById("elementId");
setCssTextStyle(elem, "margin-top", "10px !important");

Oto link do wersji demonstracyjnej


Jakich dodatkowych informacji lub ulepszeń dostarcza ta odpowiedź?
Pogrindis

Ta funkcja jest krótka, prosta i łatwa do zrozumienia. Możesz dodać ważną opcję. Nie usuwa wszystkich stylów elementów. Nadpisuje lub dodaje pojedynczy styl w atrybutach stylów elementów. Nie potrzebujesz żadnych frameworków JS. A najważniejsze jest to, że ta funkcja działa w każdej przeglądarce.
Marek Skrzyniarz


0

https://developer.mozilla.org/en-US/docs/Web/CSS/initial

użyj właściwości początkowej w css3

 <p style="color:red!important"> 
    this text is red 
       <em style="color:initial"> 
          this text is in the initial color (e.g. black)
       </em>
    this is red again
 </p>

Inicjały nie resetują się ważne. Nie ustawiasz koloru p, ale kolor em. Rzeczywiście, zmień kolor: początkowy na kolor: zielony i też by działał.
Pacerier,

0

https://jsfiddle.net/xk6Ut/256/

Jedną z opcji nadpisania klasy CSS w JavaScript jest użycie identyfikatora elementu style, 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)

0

Zamiast wstrzykiwać styl, jeśli wstrzykniesz klasę (np. „Show”) przez skrypt java, zadziała. Ale tutaj potrzebujesz css jak poniżej. dodana reguła CSS klasy powinna znajdować się poniżej pierwotnej reguły.

td.EvenRow a{
  display: none !important;
}

td.EvenRow a.show{
  display: block !important;
}

0

Mamy kolejną możliwość usunięcia wartości właściwości z CSS.

Podobnie jak przy użyciu metody replace w js. Ale musisz dokładnie znać identyfikator stylu lub możesz napisać pętlę for, aby to wykryć, (policz style na stronie, a następnie sprawdź, czy któryś z tych elementów zawiera lub pasuje do !importantwartości). także - ile ich zawiera, lub po prostu napisz globalną metodę zastępującą [regexp: / str / gi])

Mój jest bardzo prosty, ale dołączam jsBin, na przykład:

https://jsbin.com/geqodeg/edit?html,css,js,output

Najpierw ustawiłem tło ciała w CSS na żółto !important, a następnie nadpisałem przez JS na darkPink.


-1

Poniżej znajduje się fragment kodu służący do ustawiania ważnego parametru atrybutu stylu za pomocą jquery.

$.fn.setFixedStyle = function(styles){
    var s = $(this).attr("style");
    s = "{"+s.replace(/;/g,",").replace(/'|"/g,"");
    s = s.substring(0,s.length-1)+"}";
    s = s.replace(/,/g,"\",\"").replace(/{/g,"{\"").replace(/}/g,"\"}").replace(/:/g,"\":\"");
    var stOb = JSON.parse(s),st;
    if(!styles){
     $.each(stOb,function(k,v){
      stOb[k] +=" !important";
     });
    }
    else{
     $.each(styles,function(k,v){
      if(v.length>0){
        stOb[k] = v+" !important";
      }else{
        stOb[k] += " !important";  
      }
     });
    }
    var ns = JSON.stringify(stOb);
    $(this).attr("style",ns.replace(/"|{|}/g,"").replace(/,/g,";"));
};

Użycie jest całkiem proste - po prostu przekaż obiekt zawierający wszystkie atrybuty, które chcesz ustawić jako ważne.

$("#i1").setFixedStyle({"width":"50px","height":""});

Istnieją dwie dodatkowe opcje.

Aby po prostu dodać ważny parametr do już istniejącego atrybutu stylu, przekaż pusty ciąg.

2. Aby dodać ważny parametr do wszystkich obecnych atrybutów, nie przekazuj niczego. Ustawi wszystkie atrybuty jako ważne.

Oto jest na żywo w akcji. http://codepen.io/agaase/pen/nkvjr

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.