2012-01-27 2 views
9

У меня есть следующий HTML-кодJQuery slideDown с заданной высоты и переливом

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

И CSS

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

Предположим .textdiv имеет намного больше текста и то, что я делаю, это скрыть количество текста ниже 100 пикселей.

Как я могу slideDown()div, чтобы я мог просматривать текст при нажатии кнопки?

Использование $(".button").slideDown(); не работает, потому что мне нужно удалить высоту, а затем slideDown(), но это тоже не сработает.

+0

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

ответ

7

Попробуйте это очень простой и легкий без создания клона.

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

    }); 
}); 

Добавлен новый класс

.heightAuto{ 
    height:auto; 
} 

Demo

+0

Интересно; Я думал, что «блипа», которое произойдет, когда вы установите «height: auto», будет гораздо более заметным. Это потому, что CSS не получается отображаться до тех пор, пока функция не вернется (т. Е. Квазипотоки)? – Kato

+0

Это происходит в течение нескольких секунд. – ShankarSangoli

+0

Я думаю, что этого не происходит. Я заметил, прежде чем я должен setTimeout(), когда я делаю изменения css, а затем попытаюсь использовать их сразу. Я подозреваю, что изменение CSS не применяется до тех пор, пока не выйдет метод js. – Kato

1

Я просто совершенно неправильно прочитал ваш вопрос.

К сожалению, вы не можете установить максимальную высоту. Но вы можете оживить высоту набора, используя .animate();

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

slideUp()' и .slideDown(); установить дивы в display: none и display: block Таким образом, вы правы, что не будет работать для того, что вы пытаетесь сделать.

EDIT

Я только что видел пост Като. Это, наверное, лучший вариант для вас.

+0

Вы находитесь на правильном пути, ваш первый ответ тоже неплох. Вам просто нужна высота: auto в css, чтобы получить что-то подвижное :) – Kato

+0

А я не понимал, что 'height: auto' работал с' .slideDown(); '- не по умолчанию' display: none '? Кроме того, я не знал, что вы могли бы сделать .animate(); 'to height: auto' Ha, я, конечно, не мастер jQuery, поэтому у меня все еще есть способы пойти. –

3

Чистый, но дорогой вариант: используйте вместо анимации вместо slideDown(). Определите высоту, которую хотите оживить, создав клон и установив высоту в 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; 
} 

Маленький уродливее но менее дорогой вариант: просто установите высоту на авто, скрыть элемент, а затем использовать slideDown(), чтобы сделать его:

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

избили меня, ха-ха, я сделал скрипку для второго варианта: O (твой был немного чище, однако) http://jsfiddle.net/GordnFreeman/thJwU/9/ :) – Gordnfreeman

+0

И это действительно головоломка SO не это? Ответьте на это тщательно или ответьте быстро? Таким образом, я всегда стараюсь выдвигать ВСЕ полезные ответы, а не только первый, особенно если каждый содержит некоторые уникальные полезные детали. :) Если вы сделали эту работу, вы должны отправить свой ответ; Я уверен, что это поможет кому-то. – Kato

+0

ну, я не хочу скрыть это ... просто slideDown это или оживить его – fxuser

12

Мне нравится решение Шанкар, но функциональность ломается после первых двух кликов .. Это потому, что автомобиль класса получает перезаписаны стиль строчной высоты. Поэтому вместо этого я изменил атрибут высоты.

Вот мой пойти на это:

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

Один недостаток заключается в том, что если добавить отступы к коробке вы получаете некоторые уродливые прыжки. Открыты для этого.

Here's a demo

Улучшения и предложения приветствуются

0

использование scrollHeight свойство, это может сделать ваш скрипт динамический.

$('.button').click(function() { 
    $('.text').animate({ 'height': $('.text')[0].scrollHeight }, 1000); 
}); 
Смежные вопросы