2012-01-27 23 views
9

Ho il seguente codice HTMLjQuery slideDown con altezza impostata e troppo pieno

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

E il CSS

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

Si supponga .textdiv ha modo più testo e quello che faccio è nascondere la quantità di testo sotto 100 px.

Come posso slideDown() il div così posso visualizzare il testo quando faccio clic sul pulsante?

L'utilizzo di $(".button").slideDown(); non funziona perché è necessario rimuovere l'altezza e quindi slideDown() ma non funzionerà.

+0

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

risposta

7

Prova questa è molto semplice e facile senza creare alcun clone.

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

    }); 
}); 

Aggiunta una nuova classe

.heightAuto{ 
    height:auto; 
} 

Demo

+0

Interessante; Ho pensato che il "blip" che si sarebbe verificato quando aveste impostato "height: auto" sarebbe stato molto più evidente. Questo perché il CSS non viene renderizzato fino a quando la funzione non ritorna (cioè quasi-threading)? – Kato

+0

Succede in una frazione di micro secondi così. – ShankarSangoli

+0

Sto pensando che non accada nemmeno. Ho notato prima che devo impostare TimeTime() quando apporto le modifiche css, quindi provate a utilizzarle immediatamente. Sospetto che la modifica del CSS non venga applicata fino a quando non si esce dal metodo js. – Kato

1

Ho appena letto in modo errato la tua domanda.

Sfortunatamente, non è possibile impostare l'altezza automatica. Ma puoi animare a un'altezza impostata, usando .animate();

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

slideUp()' e .slideDown(); impostare i div per display: none e display: block Quindi hai ragione, non avrebbe funzionato per quello che stai cercando di fare.

EDIT

Ho appena visto il post di Kato. Questa è probabilmente l'opzione migliore per te.

+0

Sei sulla strada giusta, anche la tua prima risposta non è stata male. Hai solo bisogno dell'altezza: auto nel css per far girare le cose :) – Kato

+0

Ah, non mi rendevo conto che 'height: auto' ha funzionato con' .slideDown(); '- non è predefinito per' display: none '? Inoltre, non ero consapevole del fatto che potessi fare '.animate();' a 'height: auto' Ha, non sono certamente un maestro jQuery, quindi ho ancora dei modi per andare. –

3

Opzione pulita ma costosa: utilizzare animare direttamente anziché slideDown(). Determina l'altezza alla quale vuoi animare creando un clone e impostando l'altezza su Auto.

$('.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; 
} 

Un'opzione poco più brutto, ma meno costoso: basta impostare l'altezza su auto, nascondere l'elemento, quindi utilizzare slideDown() per renderlo:

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

mi ha battuto ad esso haha ​​ho fatto un violino per la seconda opzione: O (il tuo era un po 'più pulito comunque) http://jsfiddle.net/GordnFreeman/thJwU/9/ :) – Gordnfreeman

+0

E questo è veramente l'enigma di SO è no? Rispondi esaurientemente o rispondi velocemente? Pertanto, cerco sempre di sviare TUTTE le risposte utili, e non solo il primo, in particolare se ognuna contiene alcuni dettagli utili unici. :) Se hai fatto il lavoro, dovresti pubblicare la tua risposta; Sono sicuro che aiuterà qualcuno. – Kato

+0

beh non lo voglio nascondere ... semplicemente lo fai scorrere o lo animiamo – fxuser

12

Mi piace la soluzione di Shankar ma la funzionalità si rompe dopo le prime due clic .. Questo è perché la classe auto viene sovrascritta da lo stile di altezza in linea. Così invece ho modificato solo l'attributo altezza.

Ecco il mio andare a esso:

$(".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 difetto è che se si aggiunge imbottitura per la casella si ottiene qualche brutto salto. Aperto alle slitte su questo.

Here's a demo

miglioramenti e suggerimenti sono i benvenuti

0

proprietà utilizzo scrollHeight, questo può rendere lo script dinamici.

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