动画任意定位的display:inline元素移动到position:相对最终位置
Animate movement of arbitrarily positioned display:inline elements into a position:relative final position
HTML代码包含一个div,它的span有两种类型:"hide"answers"keep "。"
<div>
<span class"hide">Lorem ipsum dolor sit amet, </span>
<span class="keep">consectetur</span>
<span class"hide"> adipisicing elit, sed do </span>
<span class="keep">eiusmod</span>
</div>
JQuery代码在适当的地方选择span类隐藏,使他们可能会消失,只留下"keep"类的span在div内可见:
last.children("span.hide").fadeOut();
问题:我如何使"keep"跨度从文本中的原始位置移动到其最终可见位置?
只要每个span的初始位置和最终位置能够被识别,动画代码的编写就不是一个挑战。挑战(我怀疑)是,一旦隐藏了"hide"类跨度,确定每个跨度的最终位置。请注意,尽管是我的示例代码,但div中有任意数量的"hide"answers"keep"span,每个span都有任意大的内容。注意:使用JQuery 1.6+
附加问题:我怎么能动画的运动"保持"跨度回到他们的原始位置在"隐藏"跨度褪色后?
这是我的原始想法,几乎没有经过测试:
- 获取"keep"元素的位置
- 用
display: none
隐藏" Hide "元素 - 获取keep元素的新位置
- 再次显示"hide"元素
- 用
visibility: hidden
隐藏" Hide "元素(这样他们就保留了在布局中的位置) - 使"keep"元素相对于正常位置的位置动画化。
因为你做了所有这些而没有让步,用户应该只看到动画(实时示例):
var hide, keep, deltas;
hide = $(".hide");
keep = $(".keep");
// Get current positions
deltas = [];
keep.each(function(index) {
deltas[index] = $(this).offset();
});
// Hide and query new position
hide.hide();
keep.each(function(index) {
var pos = $(this).offset();
deltas[index].left -= pos.left;
deltas[index].top -= pos.top;
});
// Show again, hide whilst keeping space, then animate
hide.show().css("visibility", "hidden");
keep.each(function(index) {
$(this).animate({
left: -deltas[index].left,
top: -deltas[index].top
});
});
这是完全未优化的,你可能想在所有动画完成后做一些事情,但这是一个开始,实时复制确实有效。
关于附加问题:这部分很简单,只要animate
回到left: 0px
/top: 0px
。
这是一个带有切换的版本,并添加了渐变(live copy):
var hide, keep, deltas;
// Get the spans
hide = $(".hide");
keep = $(".keep");
// Showing or hiding?
showing = !showing;
if (showing) {
// Showing, this is easy
hide.css("visibility", "").hide().fadeIn();
keep.animate({
left: 0,
top: 0
});
}
else {
// Hiding -- get current positions
deltas = [];
keep.each(function(index) {
deltas[index] = $(this).offset();
});
// Hide and query new position
hide.hide();
keep.each(function(index) {
var pos = $(this).offset();
deltas[index].left -= pos.left;
deltas[index].top -= pos.top;
});
// Show again, hide whilst keeping space, then animate
hide.show().fadeOut(function() {
$(this).show().css("visibility", "hidden");
});
keep.each(function(index) {
$(this).animate({
left: -deltas[index].left,
top: -deltas[index].top
});
});
}
我认为最好的方法是在隐藏它们之前循环遍历每个隐藏跨度,并获得下一个元素("keep")元素并将其位置存储在变量中。然后你需要将它设置为绝对位置它的顶部和左侧位置设置为你刚刚得到的。此时,您还需要获取并存储"hide"元素的位置,并使用存储的变量将淡出和从"keep"位置移动到"hide"位置的动画化。
简单的起点。添加JqueryUI以获得更多效果
$(document).ready(function() {
$("span:last.hide").fadeOut(function(){
$("span.keep").animate({paddingLeft:"+=5px",opacity:".5"});
});
});
你也可以试试CSS3:transitions !可以创建一些神奇的效果,比如
相关文章:
- 我可以获得相对于被点击元素的确切点击位置吗
- 固定位置菜单时滚动,直到它击中一个相对容器的底部
- 可以用'吗/'在相对路径中
- JavaScript:单击时相对于父级增加变量值
- 在不移动元件的情况下从相对位置更改为固定位置
- 打开相对于鼠标位置的CSS3/HTML5模式对话框
- 抵消在具有pageY计算的相对容器中位于顶部
- position 是 JavaScript 或 jQuery 中的一个数组
- Chrome原生拖放相对容器并不能正确渲染重影
- 如何确定相对较新版本的IE的高度和宽度(IE8不喜欢从JavaScript设置这种样式吗?
- 绝对链接/相对链接均未获胜't在菜单中工作
- 相对于角度控制器中的另一个阵列过滤阵列项目
- Javascript元素相对于屏幕的位置
- 使用systemJS的相对动态加载,使用ES6/Babel语法
- 块相对于父对象的位置
- 如何创建js常量对象与"依赖/相对;价值观
- 如果元素在容器外部,是否可以相对于容器以绝对定位来定位该元素
- 如何使用Javascript获得相对Xpath
- 动画任意定位的display:inline元素移动到position:相对最终位置
- JQuery position()返回safari中的相对位置