Превалирующий! Важный стиль

128

Название в значительной степени подводит итог.

Внешняя таблица стилей имеет следующий код:

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

Я пробовал использовать:

element.style.display = "inline";

и

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

но ни то, ни другое не работает. Можно ли переопределить стиль! Important с помощью javascript.

Это для расширения greasemonkey, если это имеет значение.

Энрико
источник
6
Перейти на stackoverflow.com/a/463134/632951
Pacerier,
@Pacerier экономия времени!
Эдуард

Ответы:

49

Я считаю, что единственный способ сделать это - добавить стиль в качестве нового объявления CSS с суффиксом '! Important'. Самый простой способ сделать это - добавить новый элемент <style> в заголовок документа:

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;}')

Правила, добавленные с помощью вышеуказанного метода, будут (если вы используете суффикс! Important) переопределят другие ранее установленные стили. Если вы не используете суффикс, обязательно примите во внимание такие понятия, как « специфичность ».

Джеймс
источник
8
Его можно заменить однострочным. См. Ниже: stackoverflow.com/questions/462537/…
Premasagar
2
Как вы найдете селектор, который действительно запускает стиль? Я думаю, что для этого потребуется разобрать все таблицы стилей, а это довольно сложная работа.
user123444555621 02
253

Для этого вы можете использовать несколько простых однострочников.

1) Установите для элемента атрибут «стиль» :

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

или...

2) Измените cssTextсвойство styleобъекта:

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

Либо сделает свою работу.

===

Кстати - если вам нужен полезный инструмент для управления !importantправилами в элементах, я написал плагин jQuery под названием «important»: http://github.com/premasagar/important

Premasagar
источник
Я думаю, что использовать cssText проще, чем добавить styleтег.
Guss
1
@Guss - Первый пример, который я привел, касается styleатрибута, а не тега / элемента.
Premasagar
53
Чтобы предотвратить переопределение других свойств, вы, мужчина, хотите использоватьelement.style.cssText += ';display:inline !important;';
user123444555621 02
5
Это лучший ответ, чем выбранный, наверняка +1 для повышения.
Натан С. Треш
2
@ user123444555621, Premasagar. Мог бы также использовать лучший вариант: element.style.setProperty.
Pacerier
184

element.styleимеет setPropertyметод, который может принимать приоритет в качестве третьего параметра:

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

Это не работало в старых IE, но должно быть нормально в текущих браузерах.

STH
источник
3
Работает в IE 9 msdn.microsoft.com/en-us/library/ie/ff975226%28v=vs.85%29.aspx
Салман фон Аббас
4
Лучшее решение, так как оно не отменяет весь атрибут стиля и является способом работы W3C.
stfn
его недостатком является то, что я не могу использовать имена свойств в верблюжьего какboxShadow
Паван
@Pavan Вместо этого просто использовать форму с дефисом или, если вам нужно автоматически преобразовать ее, просто напишите функцию.
nyuszika7h
3

Основываясь на отличном ответе @ Premasagar; если вы не хотите удалять все остальные встроенные стили, используйте это

//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' : '') + ';');
}

Невозможно использовать, removeProperty()потому что он не удаляет !importantправила в Chrome.
Невозможно использовать, element.style[property] = ''потому что он принимает только camelCase в FireFox.

Hashbrown
источник
Мог бы также использовать лучший вариант: element.style.setProperty.
Pacerier
1

Я только что обнаружил лучший метод: постарайтесь быть более конкретным, чем CSS страницы с вашими селекторами. Мне просто нужно было сделать это сегодня, и это работает как шарм! Дополнительная информация на сайте W3C: http://www.w3.org/TR/CSS2/cascade.html#specificity

Нак
источник
2
Нак, спасибо за содержательный ответ. Было бы еще полезнее, если бы вы нашли время, чтобы привести пример с использованием исходного кода вопроса.
Leif Wickland
1

Если вы хотите обновить / добавить один стиль в атрибут стиля элемента DOM, вы можете использовать эту функцию:

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 поддерживается всеми основными браузерами. .

Пример использования:

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

Вот ссылка на демо

Марек Скшиниарц
источник
Какую дополнительную информацию или улучшения дает этот ответ?
Погриндис
Эта функция короткая, простая и понятная. Вы можете добавить важную опцию. Он не удаляет все стили элементов. Он перезаписывает или добавляет один стиль в атрибут стилей элементов. Вам не нужны JS-фреймворки. И самое главное, что эта функция работает в каждом браузере.
Marek Skrzyniarz
0

Если все, что вы делаете, это добавляете CSS на страницу, я бы посоветовал вам использовать надстройку Stylish и написать пользовательский стиль вместо пользовательского скрипта, потому что пользовательский стиль более эффективен и уместен.

См. Эту страницу с информацией о том, как создать пользовательский стиль

erikvold
источник
Изменение css - это лишь часть того, что делает мое расширение gm
Энрико
0

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

использовать начальное свойство в 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
источник
Первоначальный сброс не важен. Вы устанавливаете не цвет p, а цвет em. Действительно, измените color: initial на color: green, и это тоже сработает.
Pacerier
0

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

Одним из вариантов переопределения класса CSS в JavaScript является использование идентификатора элемента стиля, чтобы мы могли обновить класс 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

Вместо того, чтобы вводить стиль, если вы вводите класс (например, 'show') через java-скрипт, он будет работать. Но здесь вам нужен css, как показано ниже. правило CSS добавленного класса должно быть ниже исходного правила.

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

td.EvenRow a.show{
  display: block !important;
}
Понс Пурушотаман
источник
0

Там у нас есть еще одна возможность удалить значение свойства из CSS.

Как при использовании метода replace в js. Но вы должны точно знать идентификатор стиля, или вы можете написать цикл for для его обнаружения (подсчитайте стили на странице, затем проверьте, включает ли какой-либо из этих `` включает '' или `` соответствует '' !importantзначение. И вы можете подсчитать также - сколько их содержит, или просто напишите глобальный метод замены [regexp: / str / gi])

Моя очень простая, но я прикрепляю jsBin, например:

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

Сначала я установил фон тела в CSS для желтого цвета !important, а затем заменил JS на darkPink.

Г-н Миллер
источник
-1

Ниже приведен фрагмент кода для установки важного параметра для атрибута стиля с помощью 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,";"));
};

Использование довольно простое: просто передайте объект, содержащий все атрибуты, которые вы хотите установить как важные.

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

Есть два дополнительных варианта.

1.Чтобы просто добавить важный параметр к уже имеющемуся атрибуту стиля, передайте пустую строку.

2. Чтобы добавить важный параметр для всех присутствующих атрибутов, ничего не передавайте. Он установит все атрибуты как важные.

Вот оно в действии. http://codepen.io/agaase/pen/nkvjr

agaase
источник