计算一个元素未来的高度
Calculate the future height of a element
我的意图是使用CSS3动画的高度过渡时,一个元素的子div得到扩展
<div id="container">
<div id="content">
<span>Small Conent</span>
<div id="big">
<p>
This is way bigger content, will be visible after you have clicked the
"Expand" button.
</p>
<p>It should animate up to the correct position.</p>
</div>
</div>
<button id="expand">Expand</button>
</div>
我想出了这个hack,使用max-height
。但是有几个问题:
- max-height必须有一个值
- 动画将根据
max-height
给定的值开始和停止,所以如果你插入一个疯狂的值,如2000px
,动画将有很大的延迟。
为了更好地说明这个问题,我创建了一个Fiddle: http://jsfiddle.net/egDsE/3/
获得精确动画的唯一方法是插入正确的max-height值。
我的目的是计算使用JavaScript(和JavaScript仅)什么高度的父将是一旦子扩展。当然,我需要在实际转换发生之前计算它。
这可能吗?
实际上,您不需要做所有的克隆和东西…只是给元素高度auto,检查大小并将高度设置为0。它会发生得如此之快,以至于浏览器没有机会重新绘制。
现在,这就像一个魅力,但问题是,在Javascript中立即设置高度将导致过渡失败。我只是抛出一个100毫秒的超时,然后它工作得很好。
Javascript:document.getElementById('expand').addEventListener('click', function () {
var el = document.getElementById('big');
if (!el.className) {
el.className = 'expanded';
document.getElementById('expand').innerHTML = 'Retract';
var elH = getHeight(el);
window.setTimeout(function() {
el.style.height = elH+'px';
}, 100);
} else {
el.className = '';
el.style.height = '0';
document.getElementById('expand').innerHTML = 'Expand';
}
});
function getHeight(el) {
el.style.height = 'auto';
elHeight = el.offsetHeight;
el.style.height = '0';
return elHeight;
}
CSS: #container {
border: 1px solid gray;
padding: 20px;
}
#big {
overflow: hidden;
height: 0;
transition: height 0.5s ease-in-out;
-webkit-transition: height 0.5s ease-in-out;
-moz-transition: height 0.5s ease-in-out;
-o-transition: height 0.5s ease-in-out;
}
HTML: no changes to your markup
<div id="container">
<div id="content"> <span>Small Conent</span>
<div id="big">
<p>This is way bigger content, will be visible after you have clicked the "Expand" button.</p>
<p>It should animate up to the correct position.</p>
</div>
</div>
<button id="expand">Expand</button>
</div>
演示我已经用Bartdude在评论中提出的解决方案更新了Fiddle,尽可能优化它的性能。
http://jsfiddle.net/egDsE/5/var calculateHeight = function(e) {
var outside = document.getElementById('outside');
var clone = e.cloneNode(true);
outside.appendChild(clone);
var elHeight = outside.offsetHeight;
outside.removeChild(clone);
return elHeight;
}
外部div有非常基本的css:
#outside {
position: absolute;
top: -1000;
left: -1000;
}
如果涉及到图像,我不推荐这个解决方案,它们会显著降低操作速度。
不是那样的人但是如果你不想那么密集的话我会使用LESS
相关文章:
- 检测未来元素的存在并采取行动
- 如果选择了当前年份,则在Select元素中仅显示当前和未来月份
- Mobile Safari、jQuery以及绑定到未来的DOM元素
- j查询未来元素选择器
- 未来元素不会与 on() 绑定
- j查询未来媒体元素的功能
- 如何创建一个可以处理未来元素的函数
- 在jQuery中隐藏一些未来的元素
- Javascript:替换 html 中的字符串,而不破坏未来事件处理程序的元素
- 如何将FUNCTION附加到未来元素
- CanJS未来元素事件绑定
- 我可以在文档上使用什么来不时应用函数,包括未来元素
- 当前和未来元素的事件侦听器Without jQuery
- Angular -附加指令到未来的元素
- 如何将此方法应用于所有未来的匹配元素
- 计算一个元素未来的高度
- 在电流&上运行匿名函数;未来的元素
- 对所有未来的元素应用CSS规则
- jquery 淡出在未来元素上
- jQuery .on('click')不能处理未来添加的元素