Est-il possible de supprimer des styles en ligne avec jQuery?

236

Un plugin jQuery applique un style en ligne ( display:block). Je me sens paresseux et je veux passer outre display:none.

Quelle est la meilleure façon (paresseuse)?

Haroldo
la source
79
Demandez de l'aide sur SO :)
Dave Swersky
15
La meilleure façon et la manière paresseuse ne sont pas nécessairement les mêmes.
Joel
1
J'ai souvent entendu l'argument selon lequel les meilleurs développeurs sont paresseux ... blog.codinghorror.com/how-to-be-lazy-dumb-and-successful
kaelle
deux façons peuvent atteindre i, e en utilisant removeAttr () ou .css () référez-vous à codepedia.info/jquery-remove-inline-style
Satinder singh

Réponses:

381

Mise à jour: bien que la solution suivante fonctionne, il existe une méthode beaucoup plus simple. Voir ci-dessous.


Voici ce que j'ai trouvé, et j'espère que cela vous sera utile - pour vous ou quelqu'un d'autre:

$('#element').attr('style', function(i, style)
{
    return style && style.replace(/display[^;]+;?/g, '');
});

Cela supprimera ce style en ligne.

Je ne suis pas sûr que ce soit ce que tu voulais. Vous vouliez le remplacer, ce qui, comme déjà souligné, est facilement réalisé par $('#element').css('display', 'inline').

Ce que je cherchais, c'était une solution pour SUPPRIMER complètement le style en ligne. J'en ai besoin pour un plugin que j'écris où je dois temporairement définir certaines valeurs CSS en ligne, mais je veux les supprimer plus tard; Je veux que la feuille de style reprenne le contrôle. Je pourrais le faire en stockant toutes ses valeurs d'origine, puis en les remettant en ligne, mais cette solution me semble beaucoup plus propre.


Le voici au format plugin:

(function($)
{
    $.fn.removeStyle = function(style)
    {
        var search = new RegExp(style + '[^;]+;?', 'g');

        return this.each(function()
        {
            $(this).attr('style', function(i, style)
            {
                return style && style.replace(search, '');
            });
        });
    };
}(jQuery));

Si vous incluez ce plugin dans la page avant votre script, vous pouvez alors simplement appeler

$('#element').removeStyle('display');

et cela devrait faire l'affaire.


Mise à jour : j'ai maintenant réalisé que tout cela était inutile. Vous pouvez simplement le mettre à blanc:

$('#element').css('display', '');

et il sera automatiquement supprimé pour vous.

Voici une citation des documents :

Définir la valeur d'une propriété de style sur une chaîne vide - par exemple $('#mydiv').css('color', '')- supprime cette propriété d'un élément si elle a déjà été directement appliquée, que ce soit dans l'attribut de style HTML, via la .css()méthode de jQuery ou via la manipulation DOM directe de la propriété de style. Cependant, il ne supprime pas un style qui a été appliqué avec une règle CSS dans une feuille de style ou un <style>élément.

Je ne pense pas que jQuery fasse de la magie ici; il semble que l' styleobjet le fasse nativement .

Joseph Silber
la source
3
@ximi - Merci mec. J'y ai pensé, et j'ai décidé que ce n'était pas une telle perte de temps. Il pourrait être adopté pour vérifier les styles en ligne, pour lesquels il n'y a actuellement pas de prise en charge dans jQuery ( .css('property')vous donne la valeur, mais il ne vous dit pas s'il provient d'un style en ligne).
Joseph Silber
Je suis arrivé à la même conclusion indépendamment - une chaîne vide semble faire exactement ce que nous voulons. Ce n'est pas officiellement documenté dans l'API, mais j'espère qu'il continuera à fonctionner.
Jon z
@ Jonz - Il est officiellement documenté (bien que je ne sache pas quand il a été ajouté; je ne me souviens pas l'avoir vu là-bas lorsque j'ai posté cela à l'origine). De plus, je ne pense pas que jQuery fasse quoi que ce soit ici. L' styleobjet natif semble se comporter de la même manière. J'ai modifié ma réponse avec cette information.
Joseph Silber
Est-ce que cela fonctionne avec des choses comme la famille de polices, ou est-ce que - gâcher l'expression régulière?
TMH
4
@mosh - Pourquoi n'utilisez-vous pas simplement $('#element').css('display', '')?
Joseph Silber
158

.removeAttr("style") pour se débarrasser de la balise de style entière ...

.attr("style") pour tester la valeur et voir si un style en ligne existe ...

.attr("style",newValue) pour le régler sur autre chose

heisenberg
la source
18
Cela affectera tous les styles en ligne, pas seulement display.
SLaks
1
ça sonne bien, essayez-le et faites-le moi savoir, je n'utilise jamais les styles en ligne normalement si heureux d'effacer tous les styles en ligne
Haroldo
11
@Slaks bien, c'est ce que je voulais dire par "se débarrasser de la balise de style entière";)
heisenberg
Salut. Existe-t-il un moyen de vérifier si un «style» a été appliqué au ... $ («*»), à partir de n'importe quelle source comme un style en ligne, en attribuant un style comme police, b, fort, fichier css .. avant d'essayer de supprimer / réinitialiser quelque chose ou simplement réinitialiser tout d'un coup?
Milche Patern
Étant donné que la suppression de chaque style en ligne individuellement ne supprime pas l' styleattribut (maintenant vide) , cela mérite tout de même d'être noté.
Brilliand
26

La façon la plus simple de supprimer des styles en ligne (générés par jQuery) serait:

$(this).attr("style", "");

Le code en ligne devrait disparaître et votre objet devrait adapter le style prédéfini dans vos fichiers CSS.

A travaillé pour moi!

Rick van 't Wout Hofland
la source
13

Vous pouvez définir le style en utilisant la cssméthode de jQuery :

$('something:visible').css('display', 'none');
SLaks
la source
@Kobi: Il pose des questions sur n'importe quel style en ligne.
SLaks
euh, quoi? Je ne comprends probablement pas quelque chose. Je pense à <div style="display:block;">, $('div').hide().
Kobi
3
@Kobi: hiderésout un cas particulier de modification des styles en ligne. Cette réponse concerne tous les cas. ( hide/showont également une limitation car deux dont deux valeurs sont basculées. ie aucun-> bloc ou aucun-> en ligne.)
Joel
@Joel: hide/ showse souviendra de l'ancienne valeur de displayet la restaurera correctement.
SLaks
@SLaks: Cool. Cela a dû être ajouté récemment, car je me souviens avoir eu des problèmes avec cela auparavant.
Joel
12

vous pouvez créer un plugin jquery comme celui-ci:

jQuery.fn.removeInlineCss = (function(){
    var rootStyle = document.documentElement.style;
    var remover = 
        rootStyle.removeProperty    // modern browser
        || rootStyle.removeAttribute   // old browser (ie 6-8)
    return function removeInlineCss(properties){
        if(properties == null)
            return this.removeAttr('style');
        proporties = properties.split(/\s+/);
        return this.each(function(){
            for(var i = 0 ; i < proporties.length ; i++)
                remover.call(this.style, proporties[i]);
        });
    };
})();

usage

$(".foo").removeInlineCss(); //remove all inline styles
$(".foo").removeInlineCss("display"); //remove one inline style
$(".foo").removeInlineCss("color font-size font-weight"); //remove several inline styles
Yukulélé
la source
1
Cette réponse contient une astuce très soignée d'une ligne qui est utile même sans jQuery et que peu de développeurs peuvent connaître - l'appel elem.style.removeProperty('margin-left')supprimera juste margin-leftde l' styleattribut (et retournera la valeur de cette propriété). Pour IE6-8, c'est elem.style.removeAttribute().
craigpatik
9

La manière paresseuse (qui incitera les futurs designers à maudire votre nom et à vous assassiner dans votre sommeil):

#myelement 
{
    display: none !important;
}

Avertissement: je ne préconise pas cette approche, mais c'est certainement la voie paresseuse.

Joel
la source
2
C'est clairement la meilleure réponse à la question car c'est dans l'esprit de la mauvaise pratique "paresseux". À votre santé!
ktamlyn
6
$('div[style*=block]').removeAttr('style');
patte
la source
Qu'en est-il seulement de $ ('div [style]'). RemoveAttr ('style') ;?
Skybondsor
@skybondsor ne le supprimerait pas uniquement pour les éléments de bloc, comme il le voulait
antpaw
Ah oui. Je pensais qu'il voulait supprimer les styles en ligne de tout.
skybondsor
6
$("[style*=block]").hide();
David Morton
la source
6

Si vous souhaitez supprimer une propriété dans un attribut de style - pas simplement la définir sur autre chose - vous utilisez la removeProperty()méthode:

document.getElementById('element').style.removeProperty('display');

MISE À JOUR:
J'ai créé un violon interactif pour jouer avec les différentes méthodes et leurs résultats. Apparemment, il n'y a pas beaucoup de différence entre set to empty string, set to faux valueet removeProperty(). Ils entraînent tous le même repli - qui est soit une règle CSS pré-donnée, soit la valeur par défaut du navigateur.

WoodrowShigeru
la source
5

Dans le cas où l'affichage est le seul paramètre de votre style, vous pouvez exécuter cette commande afin de supprimer tout style:

$('#element').attr('style','');

Signifie que si votre élément ressemblait à ceci auparavant:

<input id="element" style="display: block;">

Maintenant, votre élément ressemblera à ceci:

<input id="element" style="">
paulalexandru
la source
3

Voici un filtre de sélection inlineStyle que j'ai écrit qui se branche sur jQuery.

$("div:inlineStyle(display:block)") // will select all divs with an inline style of display: block set

Dans votre cas, vous pouvez utiliser ceci comme:

$("div:inlineStyle(display:block)").hide();
Ruisseau Corban
la source
2

Modifiez le plugin pour ne plus appliquer le style. Ce serait bien mieux que de supprimer le style par la suite.

Josh Stodola
la source
1
d'où le «paresseux»! ne peut pas être arsed pour trouver de quel plugin il s'agit!
Haroldo
4
Je ne sais pas comment vous définissez paresseux, j'ai juste répondu comment je le ferais. Semble logique de résoudre le problème d'origine plutôt que de corriger les choses en dehors du plugin. Je prévois des désordres en le faisant de cette façon.
Josh Stodola
Quelle direction? Si vous modifiez le plugin, vous pouvez rencontrer des problèmes après la mise à jour vers une nouvelle version qui annulera votre modification et gâchera la mise en page. Qui se souviendra dans un an ou deux que vous y avez fait ce petit ajustement? J'essaie toujours de trouver une autre solution que de modifier le code source du plugin
Zefiryn
2

$el.css({ height : '', 'margin-top' : '' });

etc...

Laissez simplement le 2e param vide!

Bert
la source
1
Si vous votez contre quelque chose, veuillez laisser un commentaire.
He Nrik
1
Je suppose que vous avez les downvotes parce que vous n'avez pas répondu à la question posée : "jQuery plugin is applying an inline style (display:block). I'm feeling lazy and want to override it with display:none". Bien que votre texte soit correct, votre code ne résout pas la question.
Fin du codage
Résolu le problème que j'avais. Tnx.
yodalr
0

$("#element").css({ display: "none" });

Au début, j'ai essayé de supprimer le style en ligne dans CSS, mais cela ne fonctionne pas et un nouveau style comme l'affichage: aucun ne sera écrasé. Mais dans JQuery cela fonctionne comme ça.

Cocoa3338
la source
0

J'ai eu un problème similaire avec la propriété width. Je ne pouvais pas supprimer le! Important du code, et comme il avait besoin de ce style sur un nouveau modèle, j'ai ajouté un identifiant (modalstyling) à l'élément et ensuite j'ai ajouté le code suivant au modèle:

<script type="text/javascript">
    $('#modalstyling').css('width', '');    //Removal of width !important
    $('#modalstyling').width('75%');        //Set custom width
</script>
Mbotet
la source