2010-08-24 10 views
14

Estoy recuperando el ancho de elementos usando jQuery y lo preferiría si pudiera tener una indicación de si había un ancho (y una altura) explícitos especificados.Detección de ancho: automático en jQuery

<div id="test"></div> 
<script type="text/javascript"> 
$(function() { alert($('#test').css('width')); }); 
</script> 

Esto alertará el ancho implícito del div en términos de cuántos píxeles ocupa en la pantalla del cliente. ¿Hay alguna forma de que, si falta el ancho o se establece como width: auto, se puede verificar con jQuery?

Es decir, en lugar de que el ejemplo anterior devuelva un entero, devolvería auto o undefined. O, alternativamente, ¿existe un equivalente de una función isAuto?

+0

Un poco diferente pero relacionado pregunta: http://stackoverflow.com/q/8816660/583539 – moey

Respuesta

8

No creo que sea posible por el momento. Al menos no en otro navegador que no sea IE. IE implementa element.currentStyle que representa los estilos en que fueron escritos en el archivo CSS. Por otro lado, el resto de los exploradores implementan window.getComputedStyle, que devuelve valores calculados de esos estilos. Eso es lo que recibes allí, un valor numérico en lugar de automático.

La única forma de evitarlo sería analizar las declaraciones de CSS desde document.styleSheets.

Referencias:

+0

Consulte la respuesta de @prdatur en .prop(). Esto puede devolver 'auto'. –

+1

@RobertWaddell que solo funciona para los estilos declarados dentro de un atributo 'style' * *. No funcionará para nada más. https://jsfiddle.net/6m3p4rqp/ –

+0

@ ionut-g-stan curiosamente, hay un término medio: si el ancho está establecido en auto programáticamente (jQuery), el uso de .prop() para recuperar el ancho funciona. No es de extrañar que haya inconsistencia entre las soluciones en esto. Parece funcionar si se establece en línea o mediante programación, pero no si se establece únicamente en reglas de CSS. Puedes ver este violín para ver la nota anterior en acción. https://jsfiddle.net/bvh1e5ud/ Por cierto, eliminaría mi downvote, pero está bloqueado. –

0

No estoy seguro de si estoy respondiendo su pregunta correctamente, pero si usa width() function, obtendrá un número entero que representa el ancho en píxeles.

+0

Sí, el problema que hace que incluso si no hay ancho especificado explícitamente en el CSS para el elemento.

devolverá un valor entero. Quiero que vuelva "automático" (o para encontrar una manera de saber si es automático o no). –

+2

Esta es una pregunta difícil, porque incluso el uso de '$ ('elemento'). Css (" ancho ");' parece devolver siempre un valor de ancho de píxel para un objeto. Incluso si está configurado en 100%. Esto es esencialmente lo mismo que usar el estilo getComputedStyle sugerido en la primera respuesta. – Nilloc

0
  1. función Crear
  2. pase elemento css ID para funcionar
  3. escribir un caso en el comunicado que se lleva a cabo en la propiedad ancho de la Identificación del elemento

NOTA: para usar en Mulitple elementos sería aconsejable utilizar un bucle con una serie de nombres de elementos

4

$('#test')[0].style.width=="auto" debería funcionar: http://jsfiddle.net/KxTLE/ http://jsfiddle.net/KxTLE/1/ y Trate

jQuery.fn.isAuto=function() { 
if(this[0]) { 
    var ele=$(this[0]); 
    if(this[0].style.width=='auto' || ele.outerWidth()==ele.parent().width()) { 
     return true; 
    } else { 
     return false; 
    } 
} 
return undefined; 
}; 

y ejemplo: http://jsfiddle.net/KxTLE/6/

+0

Bonito concepto, pero this.style está limitado estrictamente a los estilos en línea. Supongo que no especifiqué, pero obviamente va a ser un problema. Aunque por lo que parece, va a haber un problema sin importar qué. –

2

Hasta donde yo sé, no existe una función jQuery nativa para detectar anchos o alturas automáticos. Entonces escribí un complemento para hacerlo.

$.fn.isAuto = function(dimension){ 
    if (dimension == 'width'){ 
     var originalWidth = this.innerWidth(); 
     var marginLeft = parseInt(this.css('margin-left')); 
     var testMarginWidth = marginLeft+50; 
     this.css('margin-left', testMarginWidth); 
     var newWidth = this.innerWidth(); 
     this.css('margin-left', marginLeft); 
     if(newWidth<originalWidth){ 
      return true;  
     } 
     else{ 
      return false; 
     } 
    } 
    else if(dimension == 'height'){ 
     var originalHeight = this.height(); 
     this.append('<div id="test"></div>'); 
     var testHeight = originalHeight+500; 
     $('#test').css({height: testHeight}); 
     var newHeight = this.height(); 
     $('#test').remove(); 
     if(newHeight>originalHeight){ 
      return true;  
     } 
     else{ 
      return false; 
     } 
    } 
}; 

Originalmente, lo había escrito para hacer la altura, por lo que acabo de ampliar para incluir el ancho.Que acaba de llamar así:

$('#element').isAuto('width'); 

o

$('#element').isAuto('height'); 

Aquí es una fiddle demostrar la funcionalidad del plugin.

+0

Esto me dio la pista que necesitaba. Necesitaba verificar si un bloque ha configurado su altura manualmente o no. Agregar rápidamente un div 1px y comprobar si la altura cambió parece ser el truco. Bueno ... al menos en Chrome hasta el momento. – notacouch

+0

Su isAuto ('ancho') no funcionó en mi aplicación en IE10. Cambiar el margen no tuvo ningún efecto (ni siquiera marginal;)) en el innerWidth. Sin embargo, el código adjunto que es más similar al código de altura funcionó correctamente. –

8

Esto obtendrá la cadena "auto" o "180px" en valores absolutos.

$('element').prop('style').width 

para la anchura o

$('element').prop('style').height 

para la altura.

Cuestiones relacionadas