2012-01-27 9 views
9

Mam następujący kod HTMLjQuery slideDown z zadanej wysokości i przepełnienie

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

I CSS

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

Załóżmy .textdiv ma sposób więcej tekstu i co mogę zrobić, to ukryć ilość tekstu poniżej 100 pikseli.

Jak mogę slideDown() z div, więc mogę wyświetlić tekst po kliknięciu przycisku?

Używanie $(".button").slideDown(); nie działa, ponieważ muszę usunąć wysokość, a następnie slideDown(), ale to też nie zadziała.

+0

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

Odpowiedz

7

Spróbuj to jest bardzo proste i łatwe bez tworzenia żadnego klonu.

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

    }); 
}); 

Dodano nową klasę

.heightAuto{ 
    height:auto; 
} 

Demo

+0

Interesujące; Myślałem, że "blip", który wystąpiłby po ustawieniu 'height: auto' byłby dużo bardziej zauważalny. Czy to dlatego, że CSS nie jest renderowany, dopóki funkcja nie wróci (to jest quasi-wątkowanie)? – Kato

+0

Zdarza się to w granicach ułamka mikrosekund. – ShankarSangoli

+0

Myślę, że to się nigdy nie zdarza. Zauważyłem wcześniej, że muszę ustawićTimeout(), kiedy wprowadzam zmiany css, a następnie spróbuj je wykorzystać od razu. Podejrzewam, że zmiana CSS nie zostanie zastosowana, dopóki metoda js nie zostanie zakończona. – Kato

1

Po prostu błędnie przeczytałem twoje pytanie.

Niestety, tak naprawdę nie można ustawić wysokości automatycznej. Ale możesz animować do ustawionej wysokości używając .animate();

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

slideUp()' i .slideDown(); ustawić div do display: none i display: block Tak masz rację, że nie będzie działać na co próbujesz zrobić.

EDIT

Widziałem tylko słupek Kato. To prawdopodobnie najlepsza opcja dla ciebie.

+0

Jesteś na dobrej drodze, twoja pierwsza odpowiedź też nie była zła. Po prostu potrzebujesz wysokości: auto w css, aby wszystko zaczęło się toczyć :) – Kato

+0

Ah, nie zdawałem sobie sprawy, że 'height: auto' działa z' .slideDown(); '- czy nie jest domyślnie' display: none '? Ponadto, nie wiedziałem, że możesz zrobić '.animate();' to 'height: auto' Ha, na pewno nie jestem mistrzem jQuery, więc wciąż mam sposoby, aby odejść. –

3

Czysta, ale droga opcja: użyj animacji bezpośrednio zamiast slajdu(). Określ wysokość, którą chcesz animować, tworząc klon i ustawiając wysokość na 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; 
} 

Trochę brzydsze ale tańsza opcja: wystarczy ustawić wysokość na auto, ukryć element, a następnie użyj slideDown(), aby uczynić go:

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

pobili mnie do tego haha ​​zrobiłem skrzypce dla drugiej opcji: O (twój był nieco czyściejszy) jednak http://jsfiddle.net/GordnFreeman/thJwU/9/ :) – Gordnfreeman

+0

I to naprawdę jest zagadką SO jest nie jest? Odpowiedz na nią dokładnie lub odpowiedz szybko? Dlatego zawsze staram się przegłosować WSZYSTKIE użyteczne odpowiedzi, a nie tylko pierwsze, szczególnie jeśli każdy zawiera jakieś unikalne pomocne szczegóły. :) Jeśli wykonałeś pracę, powinieneś zamieścić swoją odpowiedź; Jestem pewien, że to komuś pomoże. – Kato

+0

cóż, nie chcę tego ukrywać ... po prostu ślizgaj się lub animuj to – fxuser

12

Lubię rozwiązanie Shankara ale funkcjonalność zepsuje po pierwszych dwóch kliknięć .. To dlatego, że klasa auto zostaje zastąpione przez wbudowany styl wysokości. Zamiast tego zmieniłem tylko atrybut wysokości.

Oto mój go na to:

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

Jedną wadą jest to, że jeśli dodać dopełnienie do skrzynki masz jakieś brzydkie skoków. Otwarte na to.

Here's a demo

Ulepszenia i sugestie są mile widziane

0

nieruchomość użycie scrollHeight, może to zrobić skrypt dynamiczny.

$('.button').click(function() { 
    $('.text').animate({ 'height': $('.text')[0].scrollHeight }, 1000); 
}); 
Powiązane problemy