2012-01-27 40 views
9

Tôi có đoạn code HTML saujQuery slideDown với chiều cao thiết lập và tràn

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

Và CSS

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

Giả .textdiv có văn bản cách hơn và những gì tôi làm là ẩn số lượng văn bản dưới 100px.

Làm cách nào để có thể slideDown() số div để tôi có thể xem văn bản khi tôi nhấp vào nút?

Sử dụng $(".button").slideDown(); không hoạt động vì tôi cần phải loại bỏ chiều cao và sau đó slideDown() nhưng điều này sẽ không hoạt động.

+0

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

Trả lời

7

Hãy thử điều này nó rất đơn giản và dễ dàng mà không tạo bất kỳ bản sao nào.

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

    }); 
}); 

Added một lớp mới

.heightAuto{ 
    height:auto; 
} 

Demo

+0

Thú vị; Tôi nghĩ 'blip' sẽ xảy ra khi bạn đặt 'height: auto' sẽ đáng chú ý hơn nhiều. Đây có phải là vì CSS không được hiển thị cho đến khi hàm trả về (tức là quasi-luồng)? – Kato

+0

Nó xảy ra trong vòng một phần nhỏ của micro giây. – ShankarSangoli

+0

Tôi nghĩ rằng nó thậm chí không xảy ra. Tôi đã nhận thấy trước khi tôi phải setTimeout() khi tôi thực hiện thay đổi css sau đó cố gắng sử dụng chúng ngay lập tức. Tôi nghi ngờ thay đổi CSS không được áp dụng cho đến khi thoát khỏi phương thức js. – Kato

1

Tôi hoàn toàn hiểu sai câu hỏi của bạn.

Thật không may, bạn thực sự không thể đặt thành chiều cao tự động. Nhưng bạn có thể animate đến một chiều cao được thiết lập, sử dụng .animate();

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

slideUp()'.slideDown(); thiết lập các divs để display: nonedisplay: block Vì vậy, bạn nói đúng, điều đó sẽ không làm việc cho những gì bạn đang cố gắng làm.

EDIT

Tôi chỉ thấy bài Kato của. Đó có lẽ là lựa chọn tốt nhất cho bạn.

+0

Bạn đang đi đúng hướng, câu trả lời đầu tiên của bạn cũng không tệ. Bạn chỉ cần chiều cao: tự động trong css để có được những điều lăn :) – Kato

+0

Ah, tôi đã không nhận ra 'chiều cao: auto' đã làm việc với' .slideDown(); '- nó không mặc định là' display: none '? Ngoài ra, tôi đã không biết bạn có thể làm '.animate();' to 'height: auto' Ha, tôi chắc chắn không có chủ jQuery, vì vậy tôi vẫn có một cách để đi. –

3

Tùy chọn sạch sẽ nhưng tốn kém: Sử dụng trực tiếp animate thay vì slideDown(). Xác định chiều cao bạn muốn tạo hiệu ứng bằng cách tạo bản sao và đặt chiều cao thành tự động.

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

Một chút xấu xí nhưng ít tốn kém tùy chọn: chỉ cần thiết lập chiều cao để tự động, ẩn yếu tố, sau đó sử dụng slideDown() để làm cho nó:

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

đánh bại tôi với nó haha ​​tôi đã thực hiện một fiddle cho tùy chọn thứ hai: O (của bạn là một chút sạch hơn tuy nhiên) http://jsfiddle.net/GordnFreeman/thJwU/9/ :) – Gordnfreeman

+0

Và đó thực sự là câu hỏi hóc búa của SO là nó không? Trả lời kỹ hoặc trả lời nhanh? Vì vậy, tôi luôn cố gắng để upvote TẤT CẢ các câu trả lời hữu ích, và không chỉ là một trong những đầu tiên, đặc biệt là nếu mỗi có chứa một số chi tiết hữu ích duy nhất. :) Nếu bạn đã làm công việc, bạn nên đăng câu trả lời của bạn; Tôi chắc chắn nó sẽ giúp một ai đó. – Kato

+0

tôi cũng không muốn giấu nó ... chỉ cần trượt nó hoặc làm động nó – fxuser

12

Tôi thích giải pháp Shankar nhưng các chức năng bị phá vỡ sau khi hai lần nhấp chuột đầu tiên .. Điều này là do lớp tự động được ghi đè bởi kiểu chiều cao nội tuyến. Vì vậy, thay vào đó tôi chỉ thay đổi thuộc tính chiều cao.

Dưới đây là đường đi của tôi lúc đó:

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

Một lỗ hổng ở đây là nếu bạn thêm đệm vào hộp bạn nhận được một số nhảy xấu xí. Mở để slutions trên đó.

Here's a demo

Cải tiến và đề nghị được rất đáng hoan nghênh

0

sử dụng scrollHeight tài sản, điều này có thể làm cho kịch bản của bạn năng động.

$('.button').click(function() { 
    $('.text').animate({ 'height': $('.text')[0].scrollHeight }, 1000); 
}); 
Các vấn đề liên quan