Видаліть CSS з Div за допомогою JQuery


169

Я новачок у JQuery. У своєму додатку у мене є таке:

$("#displayPanel div").live("click", function(){
  $(this).css({'background-color' : 'pink', 'font-weight' : 'bolder'});
});

Коли я натискаю на Div, колір цього Div змінюється. У цій функції Click у мене є деякі функції. Зрештою, я хочу видалити застосований Css з Div. Як я міг це зробити в JQuery?


Хлопчик, ти відкрив консервну глисти!
Пінч

Відповіді:


163

Поставте свої властивості CSS у клас, а потім зробіть щось подібне:

$("#displayPanel div").live("click", function(){
   $(this).addClass('someClass');
});

Тоді, де ваші "інші функції", роблять щось на кшталт:

$("#myButton").click(function(){
   $("#displayPanel div").removeClass('someClass');
});

3
@Aruna: Я трохи наляканий зараз - як будуть ви покласти стиль на елемент? Якщо ваш CSS не знаходиться в таблиці / блоці стилів, це не CSS.
annakata

8
@annakata: Звичайно, це <div style="xxx"/>все-таки CSS ... це не дуже вдалий спосіб зробити це, але він працює.
mpen

127
Ця відповідь допомагає не всім випадкам, коли ви щось змінюєте під час руху для анімації чи складного візуалізації. Питання полягало не в тому, як організувати CSS, а як видалити CSS-варіант.
FMaz008

5
@ FMaz008 - Анімація та складна візуалізація - це поза тим, що він просив. Прочитайте питання: "... Зрештою, що я хочу видалити застосований Css з Div". Таким чином , він може використовувати addClassабо removeClassчи , removeAttr('style')як в @ відповідь Торреса.
karim79

1
Хоча внизу працювали і для мене, я вважаю, що це було найкращим рішенням, оскільки я вважаю за краще робити ВСЕ стилізацію або, принаймні, наскільки це можливо в моїх таблицях стилів. Я закінчив робити так.
LondonGuy

307

Ви можете видалити специфічний css, що знаходиться в елементі, подібному до цього:

$(this).css({'background-color' : '', 'font-weight' : ''});

Хоча я погоджуюся з karim, що ви, ймовірно, повинні використовувати класи CSS.


Це призведе до видалення попередніх налаштувань для фонового кольору та ваги шрифту
Philippe Leybaert

@Dave прекрасно працював в IE7 для мене, щоб видалити стилі, безпосередньо застосовані в рядку до елемента , а не видаляти стилі, застосовані через класи css.
ErikE

Проблема полягає в тому, що при встановленні фону на '' IE7 із задоволенням додає параметри за замовчуванням для всіх різних властивостей фону *. Це означає, що якщо у вас властивість background- * встановлено інакше (наприклад, через класи), вони будуть очищені цим. Мені довелося розібратися з цим конкретним питанням у нашому продукті.
Дейв Ван ден Ейнде

Добре працюйте для мене, хоча я в кінцевому підсумку використовую addClass, бачачи, що стилізацію слід робити в таблицях стилів. Я особисто люблю організовувати речі.
LondonGuy

Зауважте, що це НЕ те саме, що $ element.css ('top', '') ;, що не видаляє стиль. Ви повинні передати об’єкт: $ element.css ({'top:' '});
Том МакКензі

223

Ви можете використовувати метод removeAttr, якщо ви хочете видалити весь стиль вбудованого тексту, який ви додали вручну за допомогою JavaScript. Краще використовувати класи CSS, але ніколи не знаєш.

$("#displayPanel div").removeAttr("style")


18
Це краще рішення, ніж використання додаткового класу +1.
o15a3d4l11s2

6
Хороша відповідь - .css('style-name', 'style-value')функція jQuery додає стилі вбудованих елементів до елементу - і є важливим для оновлення стилів на ходу. Сценарій перетягнути / падіння може змінити topі leftстилі абсолютно позиціонується - екземпляр , де використання класів недоцільно.
leepowers

Це краще, ніж інші варіанти, оскільки нам просто потрібно видалити стиль.
gautamlakum

4
Так само, як додати, що хром не впорається з цим правильно, як бачимо тут, більш безпечним варіантом буде використання `attr ('style', '').
Андрій

Чудова відповідь. Поки ви впевнені, що у вас є лише вбудований CSS, який ви хочете видалити, як тільки це виконується (як це часто буває для анімації), тоді це шлях.
Джейкоб Стамм

40

Ви можете видалити вбудовані властивості таким чином:

$(selector).css({'property':'', 'property':''});

Наприклад:

$(actpar).css({'top':'', 'opacity':''});

Це по суті згадується вище, і це, безумовно, робить трюк.

До речі, це корисно в таких випадках, коли потрібно очистити стан після анімації. Звичайно, я можу написати півдюжини класів для вирішення цього питання, або я можу використовувати свій базовий клас та #id зробити якусь математику та очистити стиль вбудовування, який застосовує анімація.

$(actpar).animate({top:0, opacity:1, duration:500}, function() {
   $(this).css({'top':'', 'opacity':''});
});

просто щось, що я шукав, видаляє стилі вбудованого .. спасибі
Naveen

12
jQuery.fn.extend
({
    removeCss: function(cssName) {
        return this.each(function() {
            var curDom = $(this);
            jQuery.grep(cssName.split(","),
                    function(cssToBeRemoved) {
                        curDom.css(cssToBeRemoved, '');
                    });
            return curDom;
        });
    }
});

/*example code: I prefer JQuery extend so I can use it anywhere I want to use.

$('#searchJqueryObject').removeCss('background-color');
$('#searchJqueryObject').removeCss('background-color,height,width'); //supports comma separated css names.

*/

АБО

//this parse style & remove style & rebuild style. I like the first one.. but anyway exploring..
jQuery.fn.extend
({
    removeCSS: function(cssName) {
        return this.each(function() {

            return $(this).attr('style',

            jQuery.grep($(this).attr('style').split(";"),
                    function(curCssName) {
                        if (curCssName.toUpperCase().indexOf(cssName.toUpperCase() + ':') <= 0)
                            return curCssName;
                    }).join(";"));
        });
    }
});

Чи є спосіб за допомогою цього видалити всі властивості css?
Саймон Арнольд

Я спробував перший, і він прекрасно працює! Для всіх новачків, які, можливо, не знали: css ('attr', '') - це не те, що видалити цей attr!
Анонім

7

Як примітка, залежно від властивості ви можете встановити його на автоматичне.


5

Встановіть значення за замовчуванням, наприклад:

$ (this) .css ("висота", "авто");

або у випадку інших функцій CSS

$ (this) .css ("висота", "успадковувати");


5

Насправді найкращий спосіб, який я знайшов, щоб це зробити, коли потрібно робити складні стилі на основі jquery, наприклад, якщо у вас є модал, який потрібно відображати, але йому потрібно обчислити зміщення сторінки, щоб отримати правильні параметри, до яких потрібно буде зайти функція jQuery ("x"). css ({}).

Отже, тут налаштування стилів, вихід змінних, які були обчислені на основі різних факторів.

$(".modal").css({ border: "1px solid #ccc", padding: "3rem", position: "absolute", zIndex: 999, background: "#fff", top: "30", visibility: "visible"})

Для того, щоб очистити ці стилі. а не встановлювати щось подібне

$(".modal").css({ border: "", padding: "", position: "", zIndex: 0, background: "", top: "", visibility: ""})

Простий спосіб був би

$(".modal").attr("style", "")

Коли jquery маніпулює елементами на dom, стилі записуються до елемента в атрибуті "style" так, як ніби ви писали стилі в рядку. Все, що вам потрібно зробити - це очистити цей атрибут і елемент слід відновити до його початкових стилів

Сподіваюся, це допомагає


4

У мене теж проблема, просто видаліть значення

<script>
      $("#play").toggle(function(){$(this).css("background","url(player.png) -100px 0px no-repeat");},
      function(){$(this).css("background","");});
</script>

2

Якщо ви не хочете використовувати класи (які ви насправді повинні), єдиний спосіб здійснити те, що ви хочете, - спочатку зберегти зміни стилів:

var oldFontSize = $(this).css("font-size");
var oldBackgroundColor = $(this).css("background-color");

// set style
// do your thing

$(this).css("font-size",oldFontSize);
// etc...

2

Я використовував друге рішення користувача147767

Однак тут є друкарська помилка. Вона повинна бути

curCssName.toUpperCase (). indexOf (cssName.toUpperCase () + ':') <0

не <= 0

Я також змінив цю умову для:

! curCssName.match (новий RegExp (cssName + "(-. +) ?:"), "mi")

як іноді ми додаємо властивість css через jQuery, і вона додається по-різному для різних браузерів (тобто властивість border буде додана як "border" для Firefox, а "border-top", "border-top" тощо для IE ).


1

Перед додаванням класу слід перевірити, чи в ньому вже був клас методом .hasClass ()

Для вашого конкретного питання. Ви повинні помістити свої речі в каскадний таблицю стилів. Найкраща практика розділяти дизайн та функціональність.

тому запропоноване рішення додавання та видалення назв класів є найкращою практикою.

проте, коли ви маніпулюєте елементами, ви не контролюєте, як вони відображаються. removeAttr ('style') - НАЙКРАЩИЙ спосіб видалити всі стилі вбудованого типу.


1

Я змінив user147767 ігрового рішення трохи , щоб зробити його можна використовувати strings, arraysі в objectsякості вхідних даних:

/*!
 * jquery.removecss.js v0.2 - https://stackoverflow.com/a/17196154/1250044
 * Remove multiple properties from an element in your DOM.
 *
 * @author Yannick Albert | #yckart
 * @param {Array|Object|String} css
 *
 * Copyright (c) 2013 Yannick Albert (http://yckart.com)
 * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php).
 * 2013/06/19
 **/

$.fn.removeCss = function (css) {
    var properties = [];
    var is = $.type(css);

    if (is === 'array') properties = css;
    if (is === 'object') for (var rule in css) properties.push(rule);
    if (is === 'string') properties = css.replace(/,$/, '').split(',');

    return this.each(function () {
        var $this = $(this);
        $.map(properties, function (prop) {
            $this.css(prop, '');
        });
    });
};

// set some styling
$('body').css({
    color: 'white',
    border: '1px solid red',
    background: 'red'
});

// remove it again
$('body').removeCss('background');
$('body').removeCss(['border']);
$('body').removeCss({
    color: 'white'
});

http://jsfiddle.net/ARTsinn/88mJF/

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