2012-01-27 15 views
9

tengo el siguiente código HTMLjQuery slideDown con la altura set y desbordamiento

<div class="text">bla bla bla bla</div> 
<div class="button">Show</div> 

Y el CSS

.text{ 
    height:100px; 
    overflow:hidden; 
} 

Asumir .textdiv tiene forma más texto y lo que hago es ocultar la cantidad de texto debajo de 100px.

¿Cómo puedo slideDown() el div para que pueda ver el texto cuando hago clic en el botón?

El uso de $(".button").slideDown(); no funciona porque necesito eliminar la altura y luego slideDown(), pero esto tampoco funcionará.

+0

http://stackoverflow.com/questions/1369715/how-can-i-animate-an-element-to-its-natural-height-using-jquery – skybondsor

Respuesta

7

Prueba esto es muy simple y fácil sin crear ningún clon.

$(function(){ 
    $(".button").click(function(){ 
     var $text = $(".text"); 
     var contentHeight = $text 
          .addClass('heightAuto').height(); 
     $text.removeClass('heightAuto').animate({ 
      height: (contentHeight == $text.height() ? 100 : contentHeight) 
     }, 500); 

    }); 
}); 

Se ha añadido una nueva clase

.heightAuto{ 
    height:auto; 
} 

Demo

+0

Interesante; Pensé que el 'blip' que ocurriría cuando establezcas 'height: auto' sería mucho más notable. ¿Esto se debe a que el CSS no se procesa hasta que la función retorna (es decir, cuasi-threading)? – Kato

+0

Sucede dentro de una fracción de micro segundos, entonces. – ShankarSangoli

+0

Estoy pensando que ni siquiera sucede. Me he dado cuenta antes de que tengo que configurar TimeTimeout() cuando hago cambios de CSS y luego trato de utilizarlos de inmediato. Sospecho que el cambio de CSS no se aplicará hasta que finalice el método js. – Kato

1

Acabo de leer mal tu pregunta.

Desafortunadamente, realmente no se puede establecer en altura automática. Pero puedes animar a una altura establecida, usando .animate();

.animate({height:'200px'};

slideUp()' y .slideDown(); establezca los divs a display: none y display: block por lo que está bien, que no iba a funcionar para lo que estamos tratando de hacer.

EDITAR

Acabo de ver el post de Kato. Esa es probablemente la mejor opción para ti.

+0

Estás en el camino correcto, Tu primera respuesta tampoco fue mala. Solo necesitas la altura: automático en el CSS para que todo funcione :) – Kato

+0

Ah, no me di cuenta de que 'height: auto' funcionaba con' .slideDown(); '- ¿no es' display: none ¿? Además, no sabía que podrías hacer '.animate();' a 'height: auto' Ha, definitivamente no soy maestro de jQuery, así que todavía tengo mucho camino por recorrer. –

3

Opción limpia pero costosa: use animar directamente en lugar de slideDown(). Determine la altura a la que desea animar creando un clon y estableciendo la altura en automático.

$('.button').click(function() { 
    var $div = $('div.text'); 
    $div.animate({height: determineActualHeight($div)}); 
}); 

// if you can determine the div's height without this, it would be faster 
// what makes this expensive is inserting and removing an element from the dom 
// of course, you aren't doing this a thousand times a second, so it's probably no biggie 
function determineActualHeight($div) { 
    var $clone = $div.clone().hide().css('height', 'auto').appendTo($div.parent()), 
     height = $clone.height(); 
    $clone.remove(); 
    return height; 
} 

Una opción poco más feo, pero menos costoso: acaba de establecer la altura de automóviles, ocultar el elemento, a continuación, utilizar slideDown() para hacerlo:

$('.button').click(function() { 
    $('div.text').hide().css('height', 'auto').slideDown(); 
} 
+1

me pegó a ella jaja hice un violín para la segunda opción: O (el tuyo era un poco más limpio, sin embargo) http://jsfiddle.net/GordnFreeman/thJwU/9/ :) – Gordnfreeman

+0

Y ese es realmente el enigma de SO es ¿no? Responda a fondo o responda rápido? Por lo tanto, siempre trato de recomendar TODAS las respuestas útiles, y no solo la primera, particularmente si cada una contiene detalles útiles únicos. :) Si hiciste el trabajo, deberías publicar tu respuesta; Estoy seguro de que ayudará a alguien. – Kato

+0

bueno, no quiero esconderlo ... simplemente deslízate hacia abajo o animalo – fxuser

12

me gusta la solución de Shankar pero la funcionalidad se rompe después de los primeros dos clics .. Esto es porque la clase de automóviles se sobreescribe por el estilo de altura en línea. Así que, en cambio, modifiqué solo el atributo de altura.

Aquí es mi ir en él:

$(".button").click(function(){ 
    $box = $(".text"); 
    minimumHeight = 100; 

    // get current height 
    currentHeight = $box.height(); 

    // get height with auto applied 
    autoHeight = $box.css('height', 'auto').height(); 

    // reset height and revert to original if current and auto are equal 
    $box.css('height', currentHeight).animate({ 
     height: (currentHeight == autoHeight ? minimumHeight : autoHeight) 
    }) 
}); 

Un defecto es que si se agrega el relleno de la caja se obtiene alguna fea saltar. Abierto a las conversaciones sobre eso.

Here's a demo

Mejoras y sugerencias serán bienvenidas

0

bienes de uso scrollHeight, esto puede hacer que el script dinámico.

$('.button').click(function() { 
    $('.text').animate({ 'height': $('.text')[0].scrollHeight }, 1000); 
}); 
Cuestiones relacionadas