解决删除元素动画的bug

效果说明

首先说明一下我需要做到的效果

其实很简单---点击删除按钮的时候,加入删除动画

删除动画是这样的,高度和宽度都会均匀的变小,内部的元素需要被隐藏(因为会有文字挤在一起);直到变为0结束,时长为0.5s

一开始我是这样做的;

在base文件中创建一个删除类名,为它赋予一些样式

.delete {
  transition: all 0.5s;
  overflow: hidden;
  width: 0 !important;
  height: 0 !important;
}
.delete * {
  opacity: 0;
}

点击删除按钮的时候,为被删除元素 .deleteObj 添加类名delete,这样的话,系统会将父元素的宽度和高度变为0,然后添加过渡效果;

被删除元素的样式是这样的

/*元素层级关系*/

.deleteObj
  p 111
  p 111
  p 111
  .delete-icon 删除

/*元素样式*/
.deleteObj {
    width: 500px;
    border: 2px solid ;
    padding: 20px;
    margin: 20px;
    p {
        margin-top: 30px;
    }
}

点击后,为被删除元素添加删除动画的js,这里直接引入了jquery

1 $(‘.delete-icon‘).click(function() {
2     $(this).parent().addClass(‘delete‘);
3 })

结果如下

发现宽度确实按照过渡效果出现了,但是高度确实一瞬间就变为了0,而且也没有我们想象中的,最终宽高都变为0;

那么是什么原因呢?

分析

首先,最终宽高没有变为0的问题是因为这个

因为有padding的存在,所以即使宽高都变为0,最终的元素还是会有一定的高度和宽度,那么我们可以在删除样式中,添加 padding: 0 !important; 代码重置掉padding

但是,还有一个很重要的问题,那就是没有高度动画;

这里其实涉及到浏览器执行过渡动画的规则

在动画发生的时候,浏览器不会计算元素的实际宽高等大小,而是直接将变化后最终的css进行比较,如果发现css并没有设置属性,那么浏览器将会直接赋予该属性,而不是想象中的进行过渡动画;

解决方式1

那么我们可以为被删除元素添加高度,这样浏览器将会得知被删除元素之前的高度与最终的高度,进行动画,代码如下

 1 .delete {
 2     box-sizing: border-box;
 3     overflow: hidden;
 4     width: 0 !important;
 5     height: 0 !important;
 6     padding: 0 !important;
 7     transition: all .5s;
 8 }
 9 .delete * {
10     opacity: 0;
11 }
12 .deleteObj {
13     width: 500px;
14     border: 2px solid ;
15     padding: 20px;
16     height: 100px;
17     margin: 20px;
18     p {
19         margin-top: 30px;
20     }
21 }

结果如下:

动画是有了,但是我们发现,有一部分元素超出了被删除元素,那是因为我们强制为被删除元素设置了高度;

可是如果我们不想为元素设置高度,还想拥有高度动画怎么办??

解决方法二

我们去掉 .deleteObj 中强制设置的高度,使用js设置被删除元素的高度为实际高度,并且通知浏览器重排,重排之后再执行删除动画,代码如下

1 $(‘.delete-icon‘).click(function() {
2     var deleteObj = $(this).parent();//被删除的父元素
3     deleteObj.css(‘height‘,deleteObj.outerHeight());//设置被删除元素的css高度
4     deleteObj.outerHeight();//触发浏览器重排
5     deleteObj.addClass(‘delete‘);//添加删除动画
6 })

结果如下:

这样既不会影响布局,而且删除效果也出现了;



这里给出一些触发浏览器重排的属性

offsetTop、offsetLeft、 offsetWidth、offsetHeight、scrollTop、scrollLeft、scrollWidth、scrollHeight、 clientTop、clientLeft、clientWidth、clientHeight、getComputedStyle() (currentStyle in IE)

时间: 2024-10-05 04:55:25

解决删除元素动画的bug的相关文章

解决图片元素下多余空白的BUG

1.将图片转换为块级对象     即,设置img为"display:block;".在本例中添加一组CSS代码:"#sub img {display:block;}".2.设置图片的垂直对齐方式     即设置图片的vertical-align属性为"top,text-top,bottom,text-bottom"也可以解决.如本例中增加一组CSS代码:"#sub img {vertical-align:top;}".3.设置

java 集合遍历时删除元素

本文探讨集合在遍历时删除其中元素的一些注意事项,代码如下 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 import java.util.ArrayList; import java.util.Iterator; import java

js数组依据下标删除元素

最近在项目中遇到了一些问题,基础性的东西记得不牢固,就总结一下放在这里备再次查找,对操作js数组的一些问题一些常用的记录! 1.创建数组 var array = new Array(); var array = new Array(size);//指定数组的长度 var array = new Array(item1,item2……itemN);//创建数组并赋值 2.取值.赋值 var item = array[index];//获取指定元素的值 array[index] = value;//

js数组 删除元素

一直在使用js相关的东西,但很少作总结,今天遇到操作js数组的一些问题,对js的数组有了更进一步的认识! 1.创建数组var array = new Array();var array = new Array(size);//指定数组的长度var array = new Array(item1,item2……itemN);//创建数组并赋值 2.取值.赋值var item = array[index];//获取指定元素的值array[index] = value;//为指定元素赋值 3.添加新元

Java 集合(List、Set)遍历、判断、删除元素时的小陷阱

开发中,常有场景:遍历集合,依次判断是否符合条件,如符合条件则删除当前元素. 不知不觉中,有些陷阱,不知你有没有犯. 1. 一.漏网之鱼-for循环递增下标方式遍历集合,并删除元素 如果你用for循环递增下标方式遍历集合,在遍历过程中删除元素,你可能会遗漏了某些元素.说那么说可能也说不清楚,看以下示例: import java.util.ArrayList; import java.util.List; public class ListTest_Unwork { public static v

Jquery 动态添加删除元素 用js添加的元素无法删除问题

用jquery方法的绑定侦听和销毁来解决动态div的增加删除: 正确代码: <script type="text/javascript" > $(document).ready(function(){  bindListener(); }) function addimg(){  $("#mdiv").append('<div ><input type="file" name="img[]" /&

iOS数组的去重,判空,删除元素,删除重复元素 等

一: 去重 有时需要将NSArray中去除重复的元素,而存在NSArray中的元素不一定都是NSString类型.今天想了想,加上朋友的帮助,想到两种解决办法,先分述如下. 1.利用NSDictionary的AllKeys(AllValues)方法 可以将NSArray中的元素存入一个字典,然后利用AllKeys或者AllValues取得字典的所有键或值,这些键或值都是去重的. 示例代码: NSArray *arr = @[@111,@222,@111]; NSMutableDictionary

解决IE6双倍边距BUG

解决IE6双倍边距BUG,只要满足下面3个条件才会出现这个BUG: 1)要为块状元素; 2)要左侧浮动; 3)要有左外边距(margin-left); 解决这个BUG很容易,只需要在相应的块状元素的CSS属性中加入“display:inline;”,代码如下: #redBlock{width:200px;height:200px;background:#900;margin-top:20px;margin-left:20px;float:left;display:inline;}

JQuery UI中的Tabs与base元素摩擦的BUG

JQuery UI中的Tabs与base元素冲突的BUG 以前一直使用jquery-ui-1.8,最近打算试一下目前最新的版本1.11.但对于Tabs,页面是乱的,怎么也不正常.折腾了好几个小时,最后发现页面中使用的base元素,对Tabs有破坏性的影响. 没有想清楚具体的原因,先记下来再说吧. 到了晚上,又想起这个问题.这个问题实在讨厌,我的系统中所有页面中都使用了base元素,不解决这个冲突实在是不爽.经过几个小时的跟踪调试,终于发现的问题所在: 新版本的jquery UI中,Tabs的代码