Tôi muốn làm động <div>
từ 200px
để auto
chiều cao. Tôi dường như không thể làm cho nó hoạt động mặc dù. Có ai biết làm thế nào không?
Đây là mã:
$("div:first").click(function(){
$("#first").animate({
height: "auto"
}, 1000 );
});
Tôi muốn làm động <div>
từ 200px
để auto
chiều cao. Tôi dường như không thể làm cho nó hoạt động mặc dù. Có ai biết làm thế nào không?
Đây là mã:
$("div:first").click(function(){
$("#first").animate({
height: "auto"
}, 1000 );
});
Câu trả lời:
Lưu chiều cao hiện tại:
var curHeight = $('#first').height();
Tạm thời chuyển chiều cao sang tự động:
$('#first').css('height', 'auto');
Lấy chiều cao tự động:
var autoHeight = $('#first').height();
Chuyển về curHeight
và hoạt hình thành autoHeight
:
$('#first').height(curHeight).animate({height: autoHeight}, 1000);
Và cùng nhau:
var el = $('#first'),
curHeight = el.height(),
autoHeight = el.css('height', 'auto').height();
el.height(curHeight).animate({height: autoHeight}, 1000);
.animated({height: autoHeight}, 1000, function(){ el.height('auto'); });
opacity: 0; position: absolute;
trong khi đo và loại bỏ phần tử đó sau khi bạn hoàn thành.
IMO đây là giải pháp sạch nhất và dễ nhất:
$("#first").animate({height: $("#first").get(0).scrollHeight}, 1000 );
Giải thích: DOM đã biết từ kết xuất ban đầu của nó, kích thước mà div mở rộng sẽ có khi được đặt thành chiều cao tự động. Thuộc tính này được lưu trữ trong nút DOM là scrollHeight
. Chúng ta chỉ cần tìm nạp Phần tử DOM từ Phần tử jQuery bằng cách gọi get(0)
và sau đó chúng ta có thể truy cập thuộc tính.
Thêm chức năng gọi lại để đặt chiều cao thành tự động cho phép phản hồi nhanh hơn sau khi hoạt ảnh hoàn tất (credit chris-williams ):
$('#first').animate({
height: $('#first').get(0).scrollHeight
}, 1000, function(){
$(this).height('auto');
});
clientHeight
, dường như không được hỗ trợ: developer.mozilla.org/en-US/docs/Web/ API / Element.clientHeight
$('#first').animate({ height: $('#first').get(0).scrollHeight }, 1000, function() { $(this).height('auto'); });
scrollWidth
hình ảnh động chiều rộng.
Đây là về cơ bản phương pháp tương tự như câu trả lời bằng cách Box9 nhưng tôi bọc nó trong một đẹp plugin jquery mà mất những lập luận tương tự như một Animate thường , khi bạn cần phải có các thông số hoạt hình hơn và cảm thấy mệt mỏi lặp lại cùng mã hơn và hơn :
;(function($)
{
$.fn.animateToAutoHeight = function(){
var curHeight = this.css('height'),
height = this.css('height','auto').height(),
duration = 200,
easing = 'swing',
callback = $.noop,
parameters = { height: height };
this.css('height', curHeight);
for (var i in arguments) {
switch (typeof arguments[i]) {
case 'object':
parameters = arguments[i];
parameters.height = height;
break;
case 'string':
if (arguments[i] == 'slow' || arguments[i] == 'fast') duration = arguments[i];
else easing = arguments[i];
break;
case 'number': duration = arguments[i]; break;
case 'function': callback = arguments[i]; break;
}
}
this.animate(parameters, duration, easing, function() {
$(this).css('height', 'auto');
callback.call(this, arguments);
});
return this;
}
})(jQuery);
chỉnh sửa: chainable và sạch hơn bây giờ
Một giải pháp tốt hơn sẽ không dựa vào JS để đặt chiều cao cho phần tử của bạn. Sau đây là giải pháp tạo hiệu ứng cho phần tử chiều cao cố định thành chiều cao đầy đủ ("tự động"):
var $selector = $('div');
$selector
.data('oHeight',$selector.height())
.css('height','auto')
.data('nHeight',$selector.height())
.height($selector.data('oHeight'))
.animate({height: $selector.data('nHeight')},400);
height
thành một giá trị cố định (ví dụ 122px). Phần tử của tôi đã thay đổi chiều cao sau một thời gian, vì vậy tôi phải thay thế đối số thời lượng (400) bằng các tùy chọn{duration: 400, complete: function() {$selector.css('height', 'auto');}}
Điều này đang hoạt động và nó đơn giản hơn các giải pháp trước:
CSS:
#container{
height:143px;
}
.max{
height: auto;
min-height: 143px;
}
JS:
$(document).ready(function() {
$("#container").click(function() {
if($(this).hasClass("max")) {
$(this).removeClass("max");
} else {
$(this).addClass("max");
}
})
});
Lưu ý: Giải pháp này yêu cầu UI UI
.addClass
và .removeClass
?
var h = document.getElementById('First').scrollHeight;
$('#First').animate({ height : h+'px' },300);
Bạn luôn có thể bọc các phần tử con của #first và lưu chiều cao chiều cao của trình bao bọc làm biến. Đây có thể không phải là câu trả lời đẹp nhất hoặc hiệu quả nhất, nhưng nó thực hiện các mẹo.
Đây là một câu đố trong đó tôi bao gồm một thiết lập lại.
nhưng với mục đích của bạn, đây là thịt & khoai tây:
$(function(){
//wrap everything inside #first
$('#first').children().wrapAll('<div class="wrapper"></div>');
//get the height of the wrapper
var expandedHeight = $('.wrapper').height();
//get the height of first (set to 200px however you choose)
var collapsedHeight = $('#first').height();
//when you click the element of your choice (a button in my case) #first will animate to height auto
$('button').click(function(){
$("#first").animate({
height: expandedHeight
})
});
});
Về cơ bản, chiều cao tự động chỉ có sẵn cho bạn sau khi phần tử được hiển thị. Nếu bạn đặt chiều cao cố định hoặc nếu phần tử của bạn không được hiển thị, bạn không thể truy cập nó mà không có bất kỳ thủ thuật nào.
May mắn thay, có một số thủ thuật bạn có thể sử dụng.
Sao chép phần tử, hiển thị nó bên ngoài khung nhìn cho nó độ cao tự động và bạn có thể lấy nó từ bản sao và sử dụng nó sau cho phần tử chính. Tôi sử dụng chức năng này và dường như hoạt động tốt.
jQuery.fn.animateAuto = function(prop, speed, callback){
var elem, height, width;
return this.each(function(i, el){
el = jQuery(el), elem = el.clone().css({"height":"auto","width":"auto"}).appendTo("body");
height = elem.css("height"),
width = elem.css("width"),
elem.remove();
if(prop === "height")
el.animate({"height":height}, speed, callback);
else if(prop === "width")
el.animate({"width":width}, speed, callback);
else if(prop === "both")
el.animate({"width":width,"height":height}, speed, callback);
});
}
SỬ DỤNG:
$(".animateHeight").bind("click", function(e){
$(".test").animateAuto("height", 1000);
});
$(".animateWidth").bind("click", function(e){
$(".test").animateAuto("width", 1000);
});
$(".animateBoth").bind("click", function(e){
$(".test").animateAuto("both", 1000);
});
bạn luôn có thể làm điều này:
jQuery.fn.animateAuto = function(prop, speed, callback){
var elem, height, width;
return this.each(function(i, el){
el = jQuery(el), elem = el.clone().css({"height":"auto","width":"auto"}).appendTo("body");
height = elem.css("height"),
width = elem.css("width"),
elem.remove();
if(prop === "height")
el.animate({"height":height}, speed, callback);
else if(prop === "width")
el.animate({"width":width}, speed, callback);
else if(prop === "both")
el.animate({"width":width,"height":height}, speed, callback);
});
}
đây là một câu đố: http://jsfiddle.net/Zuriel/faE9w/2/
.appendTo("body")
bởi.appendTo(el.parent())
Bộ chọn của bạn dường như không khớp. Phần tử của bạn có ID là 'đầu tiên' hay nó là phần tử đầu tiên trong mỗi div?
Một giải pháp an toàn hơn là sử dụng 'cái này':
// assuming the div you want to animate has an ID of first
$('#first').click(function() {
$(this).animate({ height : 'auto' }, 1000);
});
$(this)
bên trong trình xử lý nhấp chuột của bạn.
animate({height: 'auto'})
không có tác dụng gì. Ít nhất, không phải với jQuery 1.6.4.
Hãy thử cái này
var height;
$(document).ready(function(){
$('#first').css('height','auto');
height = $('#first').height();
$('#first').css('height','200px');
})
$("div:first").click(function(){
$("#first").animate({
height: height
}, 1000 );
});
Chào các cậu. Đây là một plugin jQuery tôi đã viết để làm tương tự, nhưng cũng tính đến sự khác biệt về chiều cao sẽ xảy ra khi bạn đã box-sizing
đặt border-box
.
Tôi cũng bao gồm một plugin "yShrinkOut" để che giấu phần tử bằng cách thu nhỏ nó dọc theo trục y.
// -------------------------------------------------------------------
// Function to show an object by allowing it to grow to the given height value.
// -------------------------------------------------------------------
$.fn.yGrowIn = function (growTo, duration, whenComplete) {
var f = whenComplete || function () { }, // default function is empty
obj = this,
h = growTo || 'calc', // default is to calculate height
bbox = (obj.css('box-sizing') == 'border-box'), // check box-sizing
d = duration || 200; // default duration is 200 ms
obj.css('height', '0px').removeClass('hidden invisible');
var padTop = 0 + parseInt(getComputedStyle(obj[0], null).paddingTop), // get the starting padding-top
padBottom = 0 + parseInt(getComputedStyle(obj[0], null).paddingBottom), // get the starting padding-bottom
padLeft = 0 + parseInt(getComputedStyle(obj[0], null).paddingLeft), // get the starting padding-left
padRight = 0 + parseInt(getComputedStyle(obj[0], null).paddingRight); // get the starting padding-right
obj.css('padding-top', '0px').css('padding-bottom', '0px'); // Set the padding to 0;
// If no height was given, then calculate what the height should be.
if(h=='calc'){
var p = obj.css('position'); // get the starting object "position" style.
obj.css('opacity', '0'); // Set the opacity to 0 so the next actions aren't seen.
var cssW = obj.css('width') || 'auto'; // get the CSS width if it exists.
var w = parseInt(getComputedStyle(obj[0], null).width || 0) // calculate the computed inner-width with regard to box-sizing.
+ (!bbox ? parseInt((getComputedStyle(obj[0], null).borderRightWidth || 0)) : 0) // remove these values if using border-box.
+ (!bbox ? parseInt((getComputedStyle(obj[0], null).borderLeftWidth || 0)) : 0) // remove these values if using border-box.
+ (!bbox ? (padLeft + padRight) : 0); // remove these values if using border-box.
obj.css('position', 'fixed'); // remove the object from the flow of the document.
obj.css('width', w); // make sure the width remains the same. This prevents content from throwing off the height.
obj.css('height', 'auto'); // set the height to auto for calculation.
h = parseInt(0); // calculate the auto-height
h += obj[0].clientHeight // calculate the computed height with regard to box-sizing.
+ (bbox ? parseInt((getComputedStyle(obj[0], null).borderTopWidth || 0)) : 0) // add these values if using border-box.
+ (bbox ? parseInt((getComputedStyle(obj[0], null).borderBottomWidth || 0)) : 0) // add these values if using border-box.
+ (bbox ? (padTop + padBottom) : 0); // add these values if using border-box.
obj.css('height', '0px').css('position', p).css('opacity','1'); // reset the height, position, and opacity.
};
// animate the box.
// Note: the actual duration of the animation will change depending on the box-sizing.
// e.g., the duration will be shorter when using padding and borders in box-sizing because
// the animation thread is growing (or shrinking) all three components simultaneously.
// This can be avoided by retrieving the calculated "duration per pixel" based on the box-sizing type,
// but it really isn't worth the effort.
obj.animate({ 'height': h, 'padding-top': padTop, 'padding-bottom': padBottom }, d, 'linear', (f)());
};
// -------------------------------------------------------------------
// Function to hide an object by shrinking its height to zero.
// -------------------------------------------------------------------
$.fn.yShrinkOut = function (d,whenComplete) {
var f = whenComplete || function () { },
obj = this,
padTop = 0 + parseInt(getComputedStyle(obj[0], null).paddingTop),
padBottom = 0 + parseInt(getComputedStyle(obj[0], null).paddingBottom),
begHeight = 0 + parseInt(obj.css('height'));
obj.animate({ 'height': '0px', 'padding-top': 0, 'padding-bottom': 0 }, d, 'linear', function () {
obj.addClass('hidden')
.css('height', 0)
.css('padding-top', padTop)
.css('padding-bottom', padBottom);
(f)();
});
};
Bất kỳ tham số nào tôi sử dụng có thể được bỏ qua hoặc đặt thành null để chấp nhận giá trị mặc định. Các tham số tôi đã sử dụng:
Chuyển đổi slide ( câu trả lời của Box9 được mở rộng)
$("#click-me").click(function() {
var el = $('#first'),
curHeight = el.height(),
autoHeight = el.css('height', 'auto').height(),
finHeight = $('#first').data('click') == 1 ? "20px" : autoHeight;
$('#first').data('click', $(this).data('click') == 1 ? false : true);
el.height(curHeight).animate({height: finHeight});
});
#first {width: 100%;height: 20px;overflow:hidden;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="first">
<div id="click-me">Lorem ipsum dolor sit amet, consectetur adipiscing elit</div>
Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
</div>
Tôi đang đăng câu trả lời này mặc dù chủ đề này đã cũ. Tôi không thể có được câu trả lời được chấp nhận để làm việc cho tôi. Cái này hoạt động tốt và khá đơn giản.
Tôi tải chiều cao của mỗi div tôi muốn vào dữ liệu
$('div').each(function(){
$(this).data('height',$(this).css('height'));
$(this).css('height','20px');
});
Sau đó, tôi chỉ sử dụng khi hoạt hình trên nhấp chuột.
$('div').click(function(){
$(this).css('height',$(this).data('height'));
});
Tôi đang sử dụng chuyển đổi CSS, vì vậy tôi không sử dụng hoạt hình jQuery, nhưng bạn có thể thực hiện hoạt động tương tự.
bạn có thể lưu trữ nó trong một thuộc tính dữ liệu.
$('.colapsable').each(function(){
$(this).attr('data-oheight',$(this).height());
$(this).height(100);
});
$('.colapsable h2:first-child').click(function(){
$(this).parent('.colapsable').animate({
height: $(this).parent('.colapsible').data('oheight')
},500);
}
});
Tôi cần chức năng này cho nhiều khu vực đọc nhiều hơn trên một trang thực hiện điều này thành một mã ngắn Wordpress mà tôi gặp phải vấn đề tương tự.
Về mặt kỹ thuật, tất cả các nhịp đọc trên trang đều có chiều cao cố định. Và tôi muốn có thể mở rộng chúng một cách riêng biệt lên một chiều cao tự động với một lần chuyển đổi. Nhấp chuột đầu tiên: 'mở rộng đến chiều cao đầy đủ của khoảng văn bản', nhấp chuột thứ hai: 'thu gọn trở lại chiều cao mặc định là 70px'
Html
<span class="read-more" data-base="70" data-height="null">
/* Lots of text determining the height of this span */
</span>
<button data-target='read-more'>Read more</button>
CSS
span.read-more {
position:relative;
display:block;
overflow:hidden;
}
Vì vậy, ở trên này trông rất đơn giản data-base
thuộc tính tôi cần để đặt chiều cao cố định cần thiết. Cácdata-height
thuộc tính tôi sử dụng để lưu trữ các (động) thực tế chiều cao của phần tử.
Phần jQuery
jQuery(document).ready(function($){
$.fn.clickToggle = function(func1, func2) {
var funcs = [func1, func2];
this.data('toggleclicked', 0);
this.click(function() {
var data = $(this).data();
var tc = data.toggleclicked;
$.proxy(funcs[tc], this)();
data.toggleclicked = (tc + 1) % 2;
});
return this;
};
function setAttr_height(key) {
$(key).each(function(){
var setNormalHeight = $(this).height();
$(this).attr('data-height', setNormalHeight);
$(this).css('height', $(this).attr('data-base') + 'px' );
});
}
setAttr_height('.read-more');
$('[data-target]').clickToggle(function(){
$(this).prev().animate({height: $(this).prev().attr('data-height')}, 200);
}, function(){
$(this).prev().animate({height: $(this).prev().attr('data-base')}, 200);
});
});
Đầu tiên tôi đã sử dụng chức năng clickToggle cho lần nhấp đầu tiên và lần thứ hai. Hàm thứ hai quan trọng hơn: setAttr_height()
Tất cả các .read-more
yếu tố có chiều cao thực tế của chúng được đặt khi tải trang trong base-height
thuộc tính. Sau đó, chiều cao cơ sở được thiết lập thông qua chức năng jquery css.
Với cả hai thuộc tính của chúng ta, giờ đây chúng ta có thể chuyển đổi giữa chúng một cách trơn tru. Chỉ data-base
thay đổi chiều cao (cố định) mong muốn của bạn và chuyển lớp .read-more cho ID của riêng bạn
Tất cả bạn có thể thấy nó hoạt động trong một FIDDLE Fiddle
Không cần giao diện người dùng jQuery
Nếu tất cả những gì bạn muốn là hiển thị và ẩn nói div, thì mã này sẽ cho phép bạn sử dụng jQuery animate. Bạn có thể có jQuery làm động phần lớn chiều cao bạn muốn hoặc bạn có thể đánh lừa hoạt hình bằng cách hoạt hình thành 0px. jQuery chỉ cần một chiều cao được thiết lập bởi jQuery để chuyển đổi nó thành tự động. Vì vậy, .animate thêm style = "" vào phần tử mà .css (height: auto) chuyển đổi.
Cách sạch nhất mà tôi đã thấy công việc này là tạo hiệu ứng cho chiều cao xung quanh bạn mong đợi, sau đó để nó tự động và nó có thể trông rất liền mạch khi được thực hiện đúng. Bạn thậm chí có thể làm động quá khứ những gì bạn mong đợi và nó sẽ quay lại. Hoạt ảnh xuống 0px với thời lượng 0 chỉ đơn giản là giảm chiều cao phần tử xuống chiều cao tự động của nó. Đối với mắt người, dù sao trông nó cũng hoạt hình. Thưởng thức..
jQuery("div").animate({
height: "0px"/*or height of your choice*/
}, {
duration: 0,/*or speed of your choice*/
queue: false,
specialEasing: {
height: "easeInCirc"
},
complete: function() {
jQuery(this).css({height:"auto"});
}
});
Xin lỗi tôi biết đây là một bài viết cũ, nhưng tôi cảm thấy nó có liên quan đến những người dùng đang tìm kiếm chức năng này với jQuery, người đã xem qua bài đăng này.
Tôi kết hợp một thứ gì đó làm chính xác những gì tôi đang tìm kiếm và trông thật tuyệt. Sử dụng scrollHeight của một phần tử giúp bạn có chiều cao khi được tải trong DOM.
var clickers = document.querySelectorAll('.clicker');
clickers.forEach(clicker => {
clicker.addEventListener('click', function (e) {
var node = e.target.parentNode.childNodes[5];
if (node.style.height == "0px" || node.style.height == "") {
$(node).animate({ height: node.scrollHeight });
}
else {
$(node).animate({ height: 0 });
}
});
});
.answer{
font-size:15px;
color:blue;
height:0px;
overflow:hidden;
}
<div class="row" style="padding-top:20px;">
<div class="row" style="border-color:black;border-style:solid;border-radius:4px;border-width:4px;">
<h1>This is an animation tester?</h1>
<span class="clicker">click me</span>
<p class="answer">
I will be using this to display FAQ's on a website and figure you would like this. The javascript will allow this to work on all of the FAQ divs made by my razor code. the Scrollheight is the height of the answer element on the DOM load. Happy Coding :)
Lorem ipsum dolor sit amet, mea an quis vidit autem. No mea vide inani efficiantur, mollis admodum accusata id has, eam dolore nemore eu. Mutat partiendo ea usu, pri duis vulputate eu. Vis mazim noluisse oportere id. Cum porro labore in, est accumsan euripidis scripserit ei. Albucius scaevola elaboraret usu eu. Ad sed vivendo persecuti, harum movet instructior eam ei.
</p>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>