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

Enrico
źródło
6
Przejdź do stackoverflow.com/a/463134/632951
Pacerier Kwietnia
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ść ”.

James
źródło
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

Premasagar
źródło
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.

sth
źródło
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.

Hashbrown
źródło
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

Nuck
źródło
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

Marek Skrzyniarz
źródło
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

Jeśli wszystko, co robisz, to dodawanie css do strony, sugerowałbym użycie stylowego dodatku i napisanie stylu użytkownika zamiast skryptu użytkownika, ponieważ styl użytkownika jest bardziej wydajny i odpowiedni.

Na tej stronie znajdziesz informacje o tworzeniu stylu użytkownika

erikvold
źródło
Modyfikowanie css to tylko część tego, co robi moje rozszerzenie gm
Enrico
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>
zloctb
źródło
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)
Razan Paul
źródło
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;
}
Pons Purushothaman
źródło
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.

Panie Miller
źródło
-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

agaase
źródło