¿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)?


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 .


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


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!


13

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

$('something:visible').css('display', 'none');

@ 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

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.


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

¿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

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.


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="">


2

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


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!


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í.


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>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.