从DOM中删除兄弟元素时,创建块元素的平滑过渡
我有一个类似于mac os中的通知的容器 – 元素被添加到队列中并在某个超时后被删除。 这很好用,但有一个不和谐的视觉副作用。
当从DOM中删除它们时,对UI进行锯齿状更新,因为堆栈中的下一个元素填充了前一个元素创建的空白。 我希望堆栈中的下面的元素能够顺利地向上移动到那个空间,理想情况下是使用css3,但是添加了一个transition: all 0.5s ease-in-out
当删除它的兄弟时,对于.notice
类的transition: all 0.5s ease-in-out
进入对该对象都没有影响。
最小的JS干涉:
$('#add').click(function(e) { e.preventDefault(); $('#container').append('Notice #
'); }); $('body').on('click','p.notice', function(e) { $(this).fadeOut(); });
更好的是在这里摆弄:
http://jsfiddle.net/kMxqj/
我正在使用MVC框架对这些对象进行数据绑定,因此一些原生css / jQuery比Jq插件更受欢迎。
这应该删除具有淡出效果的单击元素,然后平滑地向下移动所有内容。 这适用于堆栈中的任何notice
div,无论它在堆栈中的位置如何。
尝试:
$('body').on('click','p.notice', function(e) { $(this).fadeOut(500,function(){ $(this).css({"visibility":"hidden",display:'block'}).slideUp(); }); });
在这里小提琴
2018年8月7日更新:
正如一位用户对使用纯JS执行slideUpfunction所要求的那样,我使用requestAnimationFrame组合了一个快速演示来动画元素的高度。 小提琴可以在这里找到。
jQuery的Animate()方法是一个很好的学习工具,因为你不仅可以淡入淡出你的对象,而且可以同时移动它们。
CSS:
.notice { position:relative; top:20px; width: 100%; height: 50px; background-color: #ccc; opacity:0; }
jQuery:
$('#add').click(function(e) { e.preventDefault(); $('#container').append('Notice #
'); $('.notice').animate({opacity: 1, top:0}, 1000); }); $('body').on('click','p.notice', function(e) { $(this).fadeOut(); });
和我的jsFiddle演示
这样做的一个简单方法是设置高度和边距属性的动画 – http://jsfiddle.net/kMxqj/14/
$('#add').click(function(e) { e.preventDefault(); $('#container').append('Notice #
'); }); $('body').on('click','p.notice', function(e) { $(this).animate({'height':0,'margin':'0'}); $(this).fadeOut(); });
这会将高度和边距设置为0,同时淡出对象,从而实现平滑过渡。 还可以在通知框中添加隐藏的溢出,以便在动画发生时覆盖内部的任何内容。
这小提琴怎么样?
CSS
.notice { width: 0; height: 0; background-color: #ccc; }
JS
$('#add').click(function(e) { e.preventDefault(); $('#container').append('Notice #
'); $('#container p.notice:last-child').animate({ width: 100%, height: 50px }); }); $('body').on('click','p.notice', function(e) { $(this).fadeOut(); });
根据需要调整值,但这样的事情应该完成你想要的 – 听起来像animate()可能是你想要的
没有JQuery:
优选方式是max-width
:
HTML
child removable child child child
CSS
.myspan { display: inline-block; font-size: 30px; display: inline-block; max-width: 200px; transition: all 1s; overflow: hidden; } .myspan:hover { max-width: 0; }