Як я можу видалити стиль, доданий за допомогою функції .css ()?


868

Я змінюю CSS з jQuery і хочу видалити стилі, які я додаю, виходячи з вхідного значення:

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

Як я можу це зробити?
Зауважте, що рядок вище працює, коли колір вибирається за допомогою вибору кольору (наприклад, коли миша рухається по кольоровому колесо).

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



краще спробуйте addClass / removeClass, виходячи з вашої вигідності. Це не вплине на інші стилі.
Прабхакаран

Відповіді:


1332

Зміна властивості на порожній рядок, схоже, виконує завдання:

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

4
@baacke Прикро, коли передбачуваний "стандарт" жахливо застарів і витрачає багато часу на розробку. У мене мало симпатій до корпорацій, які обирають використовувати застаріле програмне забезпечення, я не бачу, навіщо мені витрачати додатковий час на їх розробку.
andrewb

33
Я маю осторонь тут @baacke. Наш клієнт все ще має офіційну мінімальну вимогу IE6 (!!). Проблема в тому, що їхні клієнти є у всьому світі, включаючи менш розвинені країни. "Клієнти замовника", можливо, використовують дуже старі комп'ютери для ведення бізнесу з нашим замовником. Тож старий веб-переглядач повинен бути принаймні мінімально підтримуваний, або вони ризикують втратити бізнес ...
user1429080

8
Ви не можете встановити вимоги будь-якого рішення, розробленого для клієнта. Якщо цей клієнт хоче або потребує підтримки для старшого веб-переглядача, це ваше завдання, щоб надати його, періодично. Ви, хлопці, говорите про те, "кого це хвилює", дайте справжнім інженерам погану назву.
Ed DeGagne

5
@EdDeGagne - Вам постійно потрібно припиняти підтримувати старіші версії IE. Це покращує вашу кодову базу та мотивує відвідувачів не використовувати старий IE. Єдине складне - з’ясувати, коли можна кинути підтримку. Веб-сайти Google, які мають багато відвідувачів, якщо вони вирішили скинути старий IE, то ви можете довіряти їм, що це було гарне рішення. Одна компанія навіть пішла, щоб сказати своїм користувачам, що їм окупається більше, щоб придбати кожному старому користувачеві IE сучасний комп'ютер, ніж продовжувати підтримувати свій код IE (саме те, що вони запропонували).
janko-m

5
Я перестав читати, коли побачив, що "IE8 все ще є стандартом, навіть для Windows 7"
Capsule

544

Прийнята відповідь працює, але залишає порожній styleатрибут DOM у моїх тестах. Нічого страшного, але це все видаляє:

removeAttr( 'style' );

Це передбачає, що ви хочете видалити всі динамічні стилі та повернутися до стилів таблиці стилів.


Це хороша ідея, але баггі в jQuery, дивіться поданий помилку: bugs.jquery.com/ticket/9500
Tosh,

4
@Tosh Ця помилка була вирішена 25.08.2011: bugs.jquery.com/…
ThinkingStiff

Я знаю, але принаймні у версії 1.7 це все-таки баггі, я не перевіряв 1,8
Tosh,

7
Це також видалить усі інші властивості в атрибуті стилю. Тож обирайте розумно.
кодуючий ритм

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 атрибут, через метод .Qss () jQuery's, або через пряме DOM-маніпулювання властивістю стилю. Однак це не видаляє стиль, застосований із правилом CSS у таблиці стилів або елементі. Попередження: один помітний виняток полягає в тому, що для IE 8 і нижче видалення властивості скорочення, наприклад, межі або фону, видалить цей стиль повністю з елемента, незалежно від того, що встановлено у таблиці стилів чи елементів .

3. Видалення всього стилю елемента

.removeAttr("style")

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, якщо ви не використовуєте його. Можливо, ви перевірите це так: якщо (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 ('фон-колір'); else document.body.style.removeProperty ('фон-колір'); а з іншого боку, ваше рішення теж правильне :) дякую за вашу замітку
Marwan

9
Ні, вам обов'язково слід перевірити, чи існує ця функція, а не перевірити браузер. Що робити, якщо MS вирішить змінити ім'я функції в наступній версії IE? Тоді ви також підете і перевіряєте на версію IE?
j03w


19

будь-яка з цих функцій jQuery повинна працювати:

$("#element").removeAttr("style");
$("#element").removeAttr("background-color") 

22
Щоб видалити лише одну властивість css:var cssObject = $('selector').prop('style'); cssObject.removeProperty('background-color');
ilgaar

igaar - ваше рішення є найновішим. Я помістив його в цикл ".each" для купи стільникових комірок, які мали "display: none", який повинен був перейти, але з іншими властивостями, які повинні залишитися. Він працював бездоганно, просто знявши дисплей: жодного та залишивши решту.
Роб фон Нессельрод


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

Мені подобається цей! Ви видаляєте вказане властивість і більше нічого.
Джоель

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? Я не думаю, що так
Абденнор TOUMI

Я говорю про removeAttrвсередині вашого плагіна, де thisвже є елемент jQuery. $(this)є зайвим.
Еміль Бержерон

2
А-а! Гаразд ОК .. @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.

Дякую


Єдина проблема вашої "видалити існуючу" полягає в тому, що вона також перекриє фон таблиці таблиць стилів, якщо є один набір.
Jtbs

6

Якщо ви використовуєте стиль CSS, ви можете використовувати:

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

а потім замінити на:

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

Якщо ви не використовуєте стиль CSS і у вас є атрибут у елементі HTML, ви можете використовувати:

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



2

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

(видаліть клас, якщо він присутній, і додайте його, якщо його немає.)

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



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/

Застереження:

  • Не перевірений широко.
  • Не можна включати важливі чи інші директиви в нове значення. Будь-які такі існуючі директиви будуть втрачені завдяки цій маніпуляції.
  • Лише зміни вперше знайшли виникнення стилюSelector. Не додає та не видаляє цілі стилі, але це можна зробити за допомогою щось більш досконалого.
  • Будь-які недійсні / непридатні значення будуть проігноровані або помилка кидання.
  • У Chrome (принаймні), не локальні (як на крос-сайті) правила CSS не піддаються впливу об'єкта document.styleSheets, тому це не працюватиме на них. Потрібно було б додати локальне скасування та маніпулювати цим, маючи на увазі поведінку цього коду «вперше знайденого».
  • document.styleSheets не особливо прихильний до маніпуляцій загалом, не сподівайтеся, що це буде працювати для агресивного використання.

Виділення стилю таким чином - це те, що стосується CSS, навіть якщо маніпулювання ним не є. Маніпулювання правилами CSS НЕ є тим, що стосується jQuery, jQuery маніпулює елементами DOM та використовує для цього вибіркові CSS.


1

У веб-розробці просто дешево. Я рекомендую використовувати порожній рядок під час видалення певного стилю

$(element).style.attr = '  ';

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.