¿Es posible eliminar estilos en línea con jQuery?

236

Un complemento jQuery está aplicando un estilo en línea ( display:block). Me siento flojo y quiero anularlo display:none.

¿Cuál es la mejor manera (perezosa)?

Haroldo
fuente
79
Pide ayuda en SO :)
Dave Swersky
15
La mejor manera y la manera perezosa no son necesariamente las mismas.
Joel
1
He escuchado a menudo el argumento de que los mejores desarrolladores son flojos ... blog.codinghorror.com/how-to-be-lazy-dumb-and-successful
kaelle
dos maneras pueden lograr i, e usando removeAttr () o .css () consulte codepedia.info/jquery-remove-inline-style
Satinder singh

Respuestas:

381

Actualización: mientras la siguiente solución funciona, hay un método mucho más fácil. Vea abajo.


Esto es lo que se me ocurrió, y espero que esto sea útil para usted o para cualquier otra persona:

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

Esto eliminará ese estilo en línea.

No estoy seguro de que esto sea lo que querías. Querías anularlo, lo cual, como ya se señaló, se hace fácilmente por$('#element').css('display', 'inline') .

Lo que estaba buscando era una solución para ELIMINAR completamente el estilo en línea. Necesito esto para un complemento que estoy escribiendo donde tengo que establecer temporalmente algunos valores CSS en línea, pero quiero eliminarlos más tarde; Quiero que la hoja de estilo recupere el control. Podría hacerlo almacenando todos sus valores originales y luego volviéndolos a poner en línea, pero esta solución me parece mucho más limpia.


Aquí está en formato de complemento:

(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 incluye este complemento en la página anterior a su secuencia de comandos, puede llamar

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

y eso debería hacer el truco.


Actualización : ahora me di cuenta de que todo esto es inútil. Simplemente puede configurarlo en blanco:

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

y se eliminará automáticamente por ti.

Aquí hay una cita de los documentos :

Establecer el valor de una propiedad de estilo en una cadena vacía, por ejemplo $('#mydiv').css('color', ''), elimina esa propiedad de un elemento si ya se ha aplicado directamente, ya sea en el atributo de estilo HTML, a través del .css()método de jQuery o mediante la manipulación DOM directa de la propiedad de estilo. Sin embargo, no elimina un estilo que se ha aplicado con una regla CSS en una hoja de estilo o <style>elemento.

No creo que jQuery esté haciendo magia aquí; Parece que el styleobjeto hace esto de forma nativa .

Joseph Silber
fuente
3
@ximi - Gracias hombre. He estado pensando en esto y decidí que no era una pérdida de tiempo. Se podría adoptar para verificar los estilos en línea, para los cuales actualmente no hay soporte para jQuery ( .css('property')le da el valor, pero no le dice si proviene de un estilo en línea).
Joseph Silber
Llegué a la misma conclusión de forma independiente: la cadena vacía parece hacer exactamente lo que queremos. No está oficialmente documentado en la API, pero esperamos que continúe funcionando.
Jon z
@Jonz: está documentado oficialmente (aunque no sé cuándo se agregó; no recuerdo haberlo visto allí cuando publiqué esto originalmente). Además, no creo que jQuery esté haciendo nada aquí. El styleobjeto nativo parece comportarse de la misma manera. Modifiqué mi respuesta con esta información.
Joseph Silber
¿Funciona esto con cosas como font-family, o el - estropea la expresión regular?
TMH
44
@mosh - ¿Por qué no lo usas $('#element').css('display', '')?
Joseph Silber
158

.removeAttr("style") para deshacerse de toda la etiqueta de estilo ...

.attr("style") para probar el valor y ver si existe un estilo en línea ...

.attr("style",newValue) para configurarlo en otra cosa

Heisenberg
fuente
18
Esto afectará a todos los estilos en línea, no solo display.
SLaks
1
suena bien, inténtalo y te digo que nunca uso estilos en línea normalmente tan felices de borrar todos los estilos en línea
Haroldo
11
@Slaks bien, eso es lo que quise decir con "deshacerse de toda la etiqueta de estilo";)
heisenberg
Hola. ¿hay alguna manera de verificar si se ha aplicado algún 'estilo' al ... $ ('*'), de cualquier fuente, como un estilo en línea, un atributo de estilo como fuente, b, fuerte, archivo css ... antes de intentar eliminar / restablecer algo o simplemente restablecer todo de una vez?
Milche Patern
Dado que eliminar cada estilo en línea individualmente no elimina el styleatributo (ahora vacío) , esto todavía es digno de mención.
Brilliand
26

La forma más fácil de eliminar estilos en línea (generados por jQuery) sería:

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

El código en línea debería desaparecer y su objeto debería adaptar el estilo predefinido en sus archivos CSS.

¡Trabajó para mi!

Rick van 't Wout Hofland
fuente
13

Puede configurar el estilo utilizando el cssmétodo de jQuery :

$('something:visible').css('display', 'none');
SLaks
fuente
@ Kobi: Él está preguntando sobre cualquier estilo en línea.
SLaks
err, que? Probablemente no entiendo algo. Estoy pensando <div style="display:block;">, $('div').hide().
Kobi
3
@Kobi: hideaborda un caso especial de modificación de estilos en línea. Esta respuesta aborda todos los casos. ( hide/showtambién tiene una limitación como dos, que son dos valores alternados, es decir, ninguno-> bloque o ninguno-> en línea).
Joel
@Joel: hide/ showrecordará el valor anterior displayy lo restaurará correctamente.
SLaks
@SLaks: Genial. Eso debe haberse agregado recientemente, ya que recuerdo haber tenido problemas con eso antes.
Joel
12

puedes crear un complemento jquery como este:

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

uso

$(".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é
fuente
1
Esta respuesta contiene un truco muy ordenado de una línea que es útil incluso sin jQuery y que no muchos desarrolladores pueden saber: las llamadas elem.style.removeProperty('margin-left')se eliminarán solo margin-leftdel styleatributo (y devolverán el valor de esa propiedad). Para IE6-8 es elem.style.removeAttribute().
craigpatik
9

La manera perezosa (que hará que los futuros diseñadores maldigan tu nombre y te asesinen mientras duermes):

#myelement 
{
    display: none !important;
}

Descargo de responsabilidad: no defiendo este enfoque, pero sin duda es la manera perezosa.

Joel
fuente
2
Esta es claramente la mejor respuesta a la pregunta porque está en el espíritu de la mala práctica "vago". ¡Salud!
ktamlyn
6
$('div[style*=block]').removeAttr('style');
pata de hormiga
fuente
¿Qué pasa con solo $ ('div [style]'). RemoveAttr ('style') ;?
skybondsor
@skybondsor no retirarlo sólo para los elementos de bloque, como si quisiera que
antpaw
Ah, sí. Pensé que quería eliminar los estilos en línea de todo.
skybondsor
6
$("[style*=block]").hide();
David Morton
fuente
6

Si desea eliminar una propiedad dentro de un atributo de estilo, no solo establecerla en otra cosa, utilice el removeProperty()método:

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

ACTUALIZACIÓN:
Hice un violín interactivo para jugar con los diferentes métodos y sus resultados. Aparentemente, no hay mucha diferencia entre set to empty string, set to faux valuey removeProperty(). Todos dan como resultado la misma alternativa, que es una regla CSS predeterminada o el valor predeterminado del navegador.

WoodrowShigeru
fuente
5

En caso de que la pantalla sea el único parámetro de su estilo, puede ejecutar este comando para eliminar todo el estilo:

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

Significa que si su elemento se veía así antes:

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

Ahora su elemento se verá así:

<input id="element" style="">
paulalexandru
fuente
3

Aquí hay un filtro selector de inlineStyle que escribí que se conecta a jQuery.

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

En su caso, podría usar esto como:

$("div:inlineStyle(display:block)").hide();
Corban Brook
fuente
2

Cambie el complemento para que ya no aplique el estilo. Eso sería mucho mejor que eliminar el estilo posterior.

Josh Stodola
fuente
1
¡De ahí el 'perezoso'! ¡no se puede determinar qué bit de qué plugin es!
Haroldo
44
No sé cómo se define perezoso, solo respondí cómo lo haría. Parece tener sentido solucionar el problema donde se origina en lugar de parchear las cosas fuera del complemento. Preveo desordenes al hacerlo de esa manera.
Josh Stodola
De que manera Si edita el complemento, puede tener problemas después de actualizar a una nueva versión que anulará su cambio y estropeará el diseño. ¿Quién recordará en un año más o menos que hiciste ese pequeño ajuste allí? Siempre trato de encontrar otra solución que no sea modificar el código fuente del complemento
Zefiryn
2

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

etc ...

¡Solo deja el segundo parámetro en blanco!

Bert
fuente
1
Si ustedes votan en contra de algo, por favor dejen un comentario.
Él Nrik
1
Yo supongo que tienes los downvotes porque no ha respondido a la pregunta planteada : "jQuery plugin is applying an inline style (display:block). I'm feeling lazy and want to override it with display:none". Aunque su texto es correcto, su código no resuelve la pregunta.
Gone Coding
Resuelto el problema que tenía. Tnx.
Yodalr
0

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

Al principio traté de eliminar el estilo en línea en CSS, pero no funciona y el nuevo estilo como pantalla: ninguno se sobrescribirá. Pero en JQuery funciona así.

Cacao3338
fuente
0

Tuve un problema similar con la propiedad de ancho. No pude eliminar el! Important del código, y dado que necesitaba este estilo en una nueva plantilla, agregué un Id (modalstyling) al elemento y luego agregué el siguiente código a la plantilla:

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