CSS3动画与display:none冲突的解决办法

在前端开发中,CSS3无法直接在display:none和display:block之间做动画。本文介绍了两种解决方法:1) 利用绝对定位和visibility属性,2) 使用setTimeout配合visibility属性。通过这些技巧,可以在元素淡入淡出时避免尺寸变化的问题,实现平滑的过渡效果。

最近在做项目,前端用VUE做数据大屏,想用CSS3动画实现淡入淡出效果,
但是发现盒子会伸缩,最后翻阅大神操作,得以解决,记录一下,原文链接:https://www.cnblogs.com/yangzhou33/p/9119596.html

概述
css不能在display:none和display:block之间进行动画,并且也不能在height:0和height:auto之间进行动画。这里我研究了一下在display:none和display:block之间进行动画的解决方案,记录下来供以后开发时参考,相信对其他人也有用。

参考资料:
CSS3 Animation and Display None
解决transition动画与display冲突的几种方法

机制
我的理解是这样的:由于display:none会引起页面的重绘事件,所以它是一个异步的延时事件,所以浏览器其实会先解析animate的代码,然后再执行display:none。

这样就引发了一个问题:如果我们要设置类似淡入淡出的效果怎么办?就是让元素在消失/出现的同时产生动画怎么办?这里我研究了2个解决方案。

利用绝对定位和visiblity
不利用display:none,而是利用它的替代方式:

opacity: 0;
visibility: hidden;
但是这样会占据空间。如果不想占据空间的话,只能使用绝对定位,把元素独立出去。这个时候会有一个层叠问题,所以需要搭配z-index控制层叠关系使它出现或者消失。

示例如下:

//自身css效果
.animate {
position: absolute;
top: 0;
left: 0;

transition: 1s;
opacity: 0;
visibility: hidden;
z-index: 0;

}

//出现时的效果
.cur {
opacity: 1;
visibility: visible;
z-index: 10;
}
利用timeout
jquery里面也有淡入淡出的方法,它是怎么实现的呢?通过查资料可以知道,它是通过deferred对象通过延时display: none来实现的。好处是能够适用于出现时占据空间,消失时又不占据空间的情况。实例如下:

//css
.div {
display: none;
}
.div-animate1 {
display: block;
visibility: hidden;
opacity: 0;
transform: translate3d(100px, 0, 0);
transition: 1s;
}
.div-animate2 {
visibility: visible;
opacity: 1;
transform: translate3d(0, 0, 0);
}

//js
function divAnimate1($div, divClass1, divClass2) {
$div.addClass(divClass1);

setTimeout(function(){
    $div.addClass(divClass2);
});

}
function divAnimate2($div, divClass1, divClass2) {
$div.removeClass(divClass2);

setTimeout(function(){
    $div.removeClass(divClass1);
}, 1000); //1s是动画时间。

}
其它
我还试过用transitionend事件,window.requestanimationframe来实现,但是都或多或少的有副作用。

另外总结一下:

如果消失前后都需要占据空间,则用visiblity。
如果消失前后都不需要占据空间,则用绝对定位和visiblity。
如果消失前需要占据空间但是消失后不需要占据空间,则用timeout和visiblity。

数据集介绍:无人机航拍海岸船舶多目标检测数据集一、基础信息数据集名称:无人机航拍海岸船舶多目标检测数据集图片规模:- 训练集:2,797张航拍图片- 验证集:936张航拍图片- 测试集:250张航拍图片分类类别:- coast_multi:海岸区域复合目标(包含近岸设施、自然地貌等)- ship:海上航行船舶目标- water:开放水域区域- multi:通用多类别目标- multi_224:224像素尺度多目标- ok:无显著目标的常规区域标注格式:YOLO格式边界框标注,支持目标检测任务数据特性:无人机高空视角采集,涵盖多种海岸环境船舶航行场景二、适用场景海事智能监控系统:支持船舶识别追踪算法开发,应用于港口调度、非法捕捞监测等场景海岸带管理:用于海岸线变化监测、近岸设施检测等环境管理AI系统无人机视觉算法优化:提供高空俯视视角数据,优化小目标检测复杂背景下的模型性能多目标识别研究:包含密集目标检测场景,支持船舶编队识别等复杂任务研究三、数据集优势场景覆盖全面:包含船舶航行、近岸设施、开放水域等多类场景,覆盖目标尺度从大型船舶到小型浮标标注专业化:严格遵循YOLO标注规范,标注框精准匹配目标物理边界,已通过三轮人工质检航拍特性显著:专为无人机视角优化,包含俯视角度目标变形、光照反射等真实航拍特性任务适配性强:可直接应用于YOLO系列模型训练,同时支持转换为其他检测框架输入格式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值