Как удалить стиль, добавленный с помощью функции .css ()?

868

Я изменяю CSS с помощью jQuery и хочу удалить стиль, который добавляю, основываясь на входном значении:

if(color != '000000') $("body").css("background-color", color); else // remove style ?

Как я могу это сделать?
Обратите внимание, что строка выше проходит всякий раз, когда цвет выбирается с помощью палитры цветов (т. Е. Когда мышь перемещается над цветовым кругом).

2-е примечание: я не могу сделать это, css("background-color", "none")потому что он удалит стиль по умолчанию из файлов CSS .
Я просто хочу удалить background-colorвстроенный стиль, добавленный jQuery .

Alex
источник
1
Возможный дубликат Как мне удалить атрибут CSS элемента, используя jQuery?
Крис Москини
лучше попробуйте добавить addClass / removeClass в зависимости от вашей функциональности. Это не повлияет на другие стили.
Прабхакаран

Ответы:

1333

Изменение свойства на пустую строку, кажется, делает работу:

$.css("background-color", "");
двойной звуковой сигнал
источник
4
@baacke Обидно, когда предполагаемый «стандарт» ужасно устарел и тратит много времени на разработку. Я мало сочувствую корпорациям, которые предпочитают использовать устаревшее программное обеспечение, я не понимаю, почему мне следует тратить дополнительное время на их разработку.
Andrewb
33
Я должен принять сторону @baacke здесь. Наш клиент по-прежнему имеет официальное минимальное требование IE6 (!!). Проблема в том, что их клиенты находятся по всему миру, включая менее развитые страны. «Клиенты клиента» могут использовать очень старые компьютеры для ведения бизнеса с нашим клиентом. Поэтому старый браузер должен быть хотя бы минимально поддержан, иначе они рискуют потерять бизнес ...
user1429080
8
Вы, ребята, не можете установить требования любого решения, которое вы разрабатываете для клиента. Если этот клиент хочет или нуждается в поддержке более старого браузера, это ваша работа, чтобы обеспечить его, точка. Вы, ребята, говорите о том, "кого это волнует", даете настоящим инженерам дурную славу.
Эд ДеГанье
5
@EdDeGagne - вам постоянно нужно прекратить поддерживать старые версии IE. Это улучшает вашу кодовую базу и мотивирует посетителей не использовать старый IE. Единственная трудная вещь - выяснить, когда вы можете отказаться от поддержки. Сайты Google с большим количеством посетителей, если они решили отказаться от старого IE, то вы можете доверять им, что это было хорошее решение. Одна компания даже зашла так далеко, что рассказала своим пользователям, что им выгоднее купить каждому старому пользователю IE современный компьютер, чем продолжать поддерживать их код IE (именно это они и предлагали).
Янко-м
5
Я перестал читать, когда увидел, что «IE8 по-прежнему является стандартом даже для Windows 7»
Capsule
544

Принятый ответ работает, но оставляет пустой styleатрибут на DOM в моих тестах. Ничего страшного, но это удаляет все это:

removeAttr( 'style' );

Предполагается, что вы хотите удалить все динамические стили и вернуться к стилю таблиц стилей.

ThinkingStiff
источник
Это идея хорошая , но глючит в JQuery см поданной ошибки: bugs.jquery.com/ticket/9500
Тоши
4
@Tosh Эта ошибка была устранена 25.08.2011: bugs.jquery.com/…
ThinkingStiff
Я знаю, но по крайней мере в версии 1.7 все еще глючит, я не проверял 1.8
Tosh
7
Это также удалит все другие свойства в атрибуте style. Так что выбирайте мудро.
кодирование ритм
1
Это умно! Принятый ответ не будет работать в ситуациях, когда встроенный стиль, созданный jquery, должен перезаписывать стили CSS, но этот метод отлично работает во всех ситуациях.
Farzad YZ
170

Есть несколько способов удалить свойство CSS с помощью jQuery:

1. Установка свойства CSS в его значение по умолчанию (начальное)

.css("background-color", "transparent")

См. Начальное значение свойства CSS в MDN . Здесь значением по умолчанию является transparent. Вы также можете использовать inheritнесколько свойств CSS для наследования атрибута от его родителя. В CSS3 / CSS4, вы можете также использовать initial, revertили , unsetно эти ключевые слова могут иметь ограниченную поддержку браузера.

2. Удаление свойства CSS

Пустая строка удаляет свойство CSS, т.е.

.css("background-color","")

Но будьте осторожны, как указано в документации jQuery .css () , это удаляет свойство, но у него есть проблемы совместимости с IE8 для некоторых свойств сокращения CSS, включая фон .

Установка значения свойства стиля в пустую строку - например, $ ('# mydiv'). Css ('color', '') - удаляет это свойство из элемента, если оно уже было применено напрямую, будь то в стиле HTML атрибута, с помощью метода jcuery .css () или прямого DOM-манипулирования свойством style. Однако он не удаляет стиль, который был применен с помощью правила CSS в таблице стилей или элементе. Предупреждение: одним заметным исключением является то, что для IE 8 и ниже, удаление сокращенного свойства, такого как border или background, полностью удалит этот стиль из элемента, независимо от того, что установлено в таблице стилей или элементе .

3. Удаление всего стиля элемента

.removeAttr("style")
KrisWebDev
источник
49

Я получил способ удалить атрибут стиля с помощью чистого JavaScript, чтобы вы знали, как использовать чистый JavaScript

var bodyStyle = document.body.style;
if (bodyStyle.removeAttribute)
    bodyStyle.removeAttribute('background-color');
else        
    bodyStyle.removeProperty('background-color');
Марван
источник
11
Парень уже использует jQuery ... зачем беспокоиться о повторной реализации кросс-браузерного метода!?!?
Билли
32
потому что jquery - это не все, потому что она или, возможно, я должен сказать, что каждый из нас, как разработчик, должен знать, что означает совместимость и как делать такие вещи с основными языками, как JavaScript, возможно, это моя теория, я уже создал свою собственную структуру Исходя из своих знаний о базовом JavaScript, я отказываюсь использовать другие вещи, у меня есть своя собственная концепция и мой образ мышления :) и, кстати, спасибо за ваше (-), мне просто нужно было добавить ценность :), а также, кстати, парень она не парень, которого она зовут Алекс
Марван
1
Я просто хочу отметить, что вы не должны проверять document.all, если вы не используете его. Возможно, вы должны проверить это следующим образом: if (elm.style.removeProperty) {elm.style.removeProperty (propertyName); } else if (elm.style.removeAttribute) {elm.style.removeAttribute (attributeName); }
Ричард
ну, вы правы, это должно быть так, если (navigator.appName == "Microsoft Internet Explorer") document.body.style.removeAttribute ('background-color'); иначе document.body.style.removeProperty ('background-color'); и с другой стороны, ваше решение тоже верно :) спасибо за ваше замечание
Марван
9
Нет, вам определенно следует проверить, существует ли эта функция, а не проверять браузер. Что если MS решит изменить имя функции в следующей версии IE? Затем вы идете и проверить версию IE также?
J03W
24

Это удалит полный тег:

  $("body").removeAttr("style");
SURJEET SINGH Бишт
источник
Это грубое решение и не будет работать всегда, потому что оно удаляет полный стиль элемента
Константин
19

любая из этих функций jQuery должна работать:

$("#element").removeAttr("style");
$("#element").removeAttr("background-color") 
Махеш Гайквад
источник
22
Чтобы удалить только одно свойство css:var cssObject = $('selector').prop('style'); cssObject.removeProperty('background-color');
ilgaar
igar - ваше решение самое подходящее. Я поместил его в цикл «.each» для кучи ячеек таблицы, которые должны были отображать «display: none», но с другими свойствами, которые должны были остаться. Это сработало безупречно, просто сняв дисплей: нет и оставив остальные.
Роб фон Нессельроде
9

Просто используя:

$('.tag-class').removeAttr('style');

или

$('#tag-id').removeAttr('style');
Альберто Черкейра
источник
Это также удалит другие встроенные стили, а не только цвет.
LongInt
7

Как насчет чего-то вроде:

var myCss = $(element).attr('css');
myCss = myCss.replace('background-color: '+$(element).css('background-color')+';', '');
if(myCss == '') {
  $(element).removeAttr('css');
} else {
  $(element).attr('css', myCss);
}
nclu
источник
Мне нравится этот! Вы удаляете указанное свойство и больше ничего.
Джоэл
7

Используйте мой плагин:

$.fn.removeCss=function(all){
        if(all===true){
            $(this).removeAttr('class');
        }
        return $(this).removeAttr('style')
    }

Для вашего случая используйте его следующим образом:

$(<mySelector>).removeCss();

или

$(<mySelector>).removeCss(false);

если вы хотите удалить также CSS, определенный в его классах:

$(<mySelector>).removeCss(true);
Абденнур ТУМИ
источник
$(this).removeAttrизбыточно и this.removeAttrдолжно быть достаточно.
Эмиль Бержерон
Удалит ли removeAttr также classattr? я так не думаю
Abdennour TOUMI
Я говорю о removeAttrвашем плагине, где thisуже есть элемент jQuery. $(this)избыточно
Эмиль Бержерон
2
AH! OK OK .. @EmileBergeron, старый jquery предоставляет thisкак HTMLElementэкземпляр, сопоставленный с элементом jQuery ... Как вы видите, мой ответ старый ... вот почему ... в любом случае, я могу сказать вам, почему они это изменяют, они делают это из-за функции стрелки, которая появилась в ES6. .. и thisстановится бесполезным, и его заменилиevent.currentTarget
Abdennour TOUMI
1
Справедливо! ;) Забавно, как 3 года в мире JS.
Эмиль Бержерон
7

Попробуй это:

$('#divID').css({"background":"none"});// remove existing

$('#divID').css({"background":"#bada55"});// add new color here.

Спасибо

uihelp
источник
Единственная проблема с вашим «удалить существующее» состоит в том, что он также переопределит фон таблицы стилей, если есть один набор.
Jtbs
6

Если вы используете стиль CSS, вы можете использовать:

$("#element").css("background-color","none"); 

и затем заменить на:

$("#element").css("background-color", color);

Если вы не используете стиль CSS и у вас есть атрибут в элементе HTML, вы можете использовать:

$("#element").attr("style.background-color",color);
Луис
источник
6

2018

для этого есть собственный API

element.style.removeProperty(propery)
мимон
источник
2

Этот тоже работает !!

$elem.attr('style','');
dazzafact
источник
2

Почему бы не сделать стиль, который вы хотите удалить класс CSS? Теперь вы можете использовать: .removeClass(). Это также открывает возможность использования:.toggleClass()

(удалите класс, если он есть, и добавьте его, если его нет.)

Добавление / удаление класса также менее запутанно для изменения / устранения неполадок при работе с проблемами компоновки (в отличие от попытки выяснить, почему исчез конкретный стиль).

Нил Джирарди
источник
2
let el = document.querySelector(element)
let styles = el.getAttribute('style')

el.setAttribute('style', styles.replace('width: 100%', ''))
Камильский Океан
источник
1

Это более сложно, чем некоторые другие решения, но может предложить большую гибкость в сценариях:

1) Создайте определение класса, чтобы изолировать (инкапсулировать) стиль, который вы хотите применять / удалять выборочно. Может быть пустым (и для этого случая, вероятно, должно быть):

.myColor {}

2) используйте этот код, основываясь на http://jsfiddle.net/kdp5V/167/ из этого ответа от gilly3 :

function changeCSSRule(styleSelector,property,value) {
    for (var ssIdx = 0; ssIdx < document.styleSheets.length; ssIdx++) {
        var ss = document.styleSheets[ssIdx];
        var rules = ss.cssRules || ss.rules;
        if(rules){
            for (var ruleIdx = 0; ruleIdx < rules.length; ruleIdx++) {
                var rule = rules[ruleIdx];
                if (rule.selectorText == styleSelector) {
                    if(typeof value == 'undefined' || !value){
                        rule.style.removeProperty(property);
                    } else {
                        rule.style.setProperty(property,value);
                    }
                    return; // stops at FIRST occurrence of this styleSelector
                }
            }
        }
    }
}

Пример использования: http://jsfiddle.net/qvkwhtow/

Предостережения:

  • Не всесторонне проверено.
  • Не могу включить ! Важные или другие директивы в новое значение. Любые такие существующие директивы будут потеряны в результате этой манипуляции.
  • Изменяет только первое найденное вхождение styleSelector. Не добавляет и не удаляет целые стили, но это можно сделать с помощью чего-то более сложного.
  • Любые недопустимые / неиспользуемые значения будут проигнорированы или будут выданы ошибки.
  • В Chrome (по крайней мере) нелокальные (как в межсайтовых) CSS-правила не отображаются через объект document.styleSheets, поэтому это не сработает. Можно было бы добавить локальные переопределения и манипулировать этим, имея в виду «первое найденное» поведение этого кода.
  • document.styleSheets не особенно удобен для манипуляций в целом, не ожидайте, что это сработает для агрессивного использования.

Таким образом, CSS - это изоляция стиля, даже если это не манипулирование. Манипулирование правилами CSS - это НЕ то, чем занимается jQuery, jQuery манипулирует элементами DOM и использует селекторы CSS для этого.

dkloke
источник
1

Просто дешево в веб-разработке. Я рекомендую использовать пустую строку при удалении определенного стиля

$(element).style.attr = '  ';
Виктор Майкл
источник
1

Попробуй это

$(".ClassName").css('color','');
Or 
$("#Idname").css('color','');
Базантские правила
источник