Usuń CSS z Div za pomocą JQuery

169

Jestem nowy w JQuery. W mojej aplikacji mam:

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

Kiedy klikam element DIV, kolor tego elementu DIV ulega zmianie. W ramach tej funkcji Click mam kilka funkcji do wykonania. Po tym wszystkim chcę usunąć zastosowany CSS z Div. Jak mogłem to zrobić w JQuery?

useranon
źródło
chłopcze, otworzyłeś puszkę robaków!
Pinch

Odpowiedzi:

163

Umieść swoje właściwości CSS w klasie, a następnie zrób coś takiego:

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

Następnie, gdzie są twoje `` inne funkcje '', zrób coś takiego:

$("#myButton").click(function(){
   $("#displayPanel div").removeClass('someClass');
});
karim79
źródło
3
@Aruna: Jestem trochę przestraszony teraz - jak się masz oddanie styl na elemencie? Jeśli twój CSS nie jest w arkuszu stylów / bloku, to nie jest CSS.
annakata
8
@annakata: Jasne, że ... <div style="xxx"/>to nadal CSS ... to nie jest dobry sposób, aby to zrobić, ale działa.
mpen
127
Ta odpowiedź nie pomaga we wszystkich przypadkach, w których modyfikujesz coś w locie w celu wykonania animacji lub złożonego renderowania. Pytanie nie dotyczyło tego, jak zorganizować CSS, ale jak usunąć opcję CSS.
FMaz008,
5
@ FMaz008 - Animacja i złożone renderowanie wykraczają poza to, o co prosił. Przeczytaj pytanie: „... W końcu chcę usunąć zastosowany CSS z DIV”. Więc mógł użyć addClasslub removeClasslub removeAttr('style')jak w odpowiedzi @ ToRrEs.
karim79,
1
Chociaż poniżej również dla mnie zadziałało, uważam, że to było najlepsze rozwiązanie, ponieważ wolę robić WSZYSTKIE stylizacje lub przynajmniej tak dużo, jak to możliwe w moich arkuszach stylów. Skończyło się na tym, że robiłem to w ten sposób.
LondonGuy
307

Możesz usunąć określony plik CSS znajdujący się w elemencie w następujący sposób:

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

Chociaż zgadzam się z karimem, prawdopodobnie powinieneś używać klas CSS.

thatismatt
źródło
Spowodowałoby
@Dave działał pięknie w IE7, usuwając style bezpośrednio zastosowane w elemencie , a nie usuwając style zastosowane przez klasy css.
ErikE,
Problem polega na tym, że ustawiając tło na „”, IE7 szczęśliwie dodaje wartości domyślne dla wszystkich różnych właściwości background- *. Co oznacza, że ​​jeśli masz właściwość background- * ustawioną inaczej (na przykład przez klasy), zostaną przez to wyczyszczone. Miałem do czynienia z tym konkretnym problemem w naszym produkcie.
Dave Van den Eynde
U mnie działa dobrze, chociaż ostatecznie użyłem addClass, ponieważ stylizacja powinna być wykonana w arkuszach stylów. Osobiście lubię porządkować sprawy.
LondonGuy
Zauważ, że to NIE to samo, co $ element.css ('top', '');, co nie usuwa stylu. Musisz przekazać obiekt: $ element.css ({'top:' '});
Tom McKenzie,
223

Możesz użyć metody removeAttr, jeśli chcesz usunąć cały styl wbudowany dodany ręcznie za pomocą javascript. Lepiej jest używać klas CSS, ale nigdy nie wiadomo.

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

jeroen.verhoest
źródło
18
To lepsze rozwiązanie niż użycie dodatkowej klasy +1.
o15a3d4l11s2
6
Dobra odpowiedź - .css('style-name', 'style-value')funkcja jQuery dodaje style wbudowane do elementu - i jest niezbędna do aktualizowania stylów w locie. Skrypt typu „przeciągnij / upuść” może zmienić topi leftstyle elementu pozycjonowanego absolutnie - sytuacja, w której użycie klas jest niepraktyczne.
leepowers
Jest lepszy niż inne opcje, ponieważ musimy tylko usunąć styl.
gautamlakum
4
Chciałem tylko dodać, że chrome nie poradzi sobie z tym poprawnie, jak widać tutaj, bezpieczniejszą opcją byłoby użycie `attr ('style', '').
Andrew,
Świetna odpowiedź. Dopóki masz pewność, że masz tylko wbudowany CSS, który chcesz usunąć po wykonaniu tego (jak to często ma miejsce w przypadku animacji), to jest droga do zrobienia.
Jacob Stamm
40

Możesz usunąć właściwości wbudowane w ten sposób:

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

Na przykład:

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

Jest to zasadniczo wspomniane powyżej i zdecydowanie pomaga.

BTW, jest to przydatne w sytuacjach, gdy trzeba wyczyścić stan po animacji. Jasne, mógłbym napisać pół tuzina klas, aby sobie z tym poradzić, lub użyć mojej klasy bazowej i #id zrobić trochę matematyki i wyczyścić styl wbudowany, którego dotyczy animacja.

$(actpar).animate({top:0, opacity:1, duration:500}, function() {
   $(this).css({'top':'', 'opacity':''});
});
Czad
źródło
po prostu coś, czego szukałem, usuwa style wbudowane ... dzięki
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.

*/

LUB

//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(";"));
        });
    }
});
niebieskawy
źródło
Czy istnieje sposób, aby usunąć za pomocą tego wszystkie właściwości CSS?
Simon Arnold,
Wypróbowałam pierwszą i działa pięknie! Dla wszystkich początkujących, którzy mogli nie wiedzieć: css ('attr', '') to nie to samo, co usunięcie atr!
Anonimowy
7

Uwaga: w zależności od właściwości możesz ustawić ją na auto.

Jeff Davis
źródło
5

Ustaw wartość domyślną, na przykład:

$ (this) .css ("wysokość", "auto");

lub w przypadku innych funkcji CSS

$ (this) .css ("wysokość", "dziedziczenie");

somid3
źródło
5

Właściwie to najlepszy sposób, jaki znalazłem, aby to zrobić, gdy muszę robić złożone stylizacje oparte na jquery, na przykład, jeśli masz modal, który musisz wyświetlić, ale musi obliczyć przesunięcia stron, aby uzyskać prawidłowe parametry, które będą musiały przejść funkcja a jQuery ("x"). css ({}).

Oto ustawienie stylów, wynik zmiennych obliczonych na podstawie różnych czynników.

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

Aby usunąć te style. zamiast ustawiać coś podobnego

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

Byłby prosty sposób

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

Kiedy jquery manipuluje elementami w domenie, style są zapisywane do elementu w atrybucie „style”, tak jakbyś pisał style w tekście. Wszystko, co musisz zrobić, to wyczyścić ten atrybut, a przedmiot powinien zresetować się do swoich oryginalnych stylów

Mam nadzieję że to pomoże

user3198542
źródło
4

mam ten sam problem, po prostu usuń wartość

<script>
      $("#play").toggle(function(){$(this).css("background","url(player.png) -100px 0px no-repeat");},
      function(){$(this).css("background","");});
</script>
Fauzan Rofiq
źródło
2

Jeśli nie chcesz używać klas (co naprawdę powinieneś), jedynym sposobem na osiągnięcie tego, co chcesz, jest zapisanie najpierw zmienianych stylów:

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

// set style
// do your thing

$(this).css("font-size",oldFontSize);
// etc...
Philippe Leybaert
źródło
2

Użyłem drugiego rozwiązania user147767

Jednak jest tu literówka. Powinno być

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

nie <= 0

Zmieniłem również ten warunek dla:

! curCssName.match (new RegExp (cssName + "(-. +) ?:"), "mi")

ponieważ czasami dodajemy właściwość css przez jQuery i dodajemy ją w inny sposób dla różnych przeglądarek (np. właściwość border zostanie dodana jako „border” dla przeglądarki Firefox i „border-top”, „border-bottom” itp. dla IE ).

biały Królik
źródło
1

Przed dodaniem klasy należy sprawdzić, czy ma ona już klasę z metodą .hasClass ()

Na Twoje konkretne pytanie. Powinieneś umieścić swoje rzeczy w Cascading Stylesheet. Najlepszą praktyką jest oddzielenie projektu od funkcjonalności.

więc proponowane rozwiązanie dodawania i usuwania nazw klas jest najlepszą praktyką.

jednak kiedy manipulujesz elementami, nie masz kontroli nad sposobem ich renderowania. removeAttr ('style') to NAJLEPSZY sposób na usunięcie wszystkich wbudowanych stylów.

PDA
źródło
1

I zmodyfikowane user147767 męska rozwiązanie trochę, aby go można użyć strings, arraysa objectsjako dane wejściowe:

/*!
 * 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/

yckart
źródło