解决display无法使用transfrom过渡效果

demo (如果没有显示,请查看源地址http://jsfiddle.net/ihardcoder/HNduT/2/)所示,基本的效果是在点击“Translate”按钮后,蓝色区域透明度变为0,然后隐藏display:none;点击Reset按钮后,首先显示蓝色区域display:block,然后透明度逐渐恢复至1,代码如下:
 1 var btn1 = $("#testbtn1");
 2 var btn2 = $("#testbtn2");
 3 var container = $("#container");
 4 
 5 btn1.on('click', function(e) {
 6     container.css({
 7         "transition": "opacity 1s",
 8         "-webkit-transition": "opacity 1s",
 9         "-moz-transition": "opacity 1s",
10         "-o-transition": "opacity 1s",
11         "-ms-transition": "opacity 1s",
12         "opacity": "0.1"
13          });
14     setTimeout(function() {
15         container.css("display", "none");
16     }, 1000);
17 });
18 btn2.on('click', function(e) {
19     container.css("display","block");
20     container.css("display");
21     container.css("opacity","1");
22 });
上述代码中第20行看起来很奇怪,可能会有人疑问这句代码的作用,事实是,如果没有这句代码,在点击Reset后得到的效果是: 蓝色区域瞬间显示出来,并没有透明度改变的过渡效 果 。 至于产生这种现象的原因,深层次的机制我也尚未搞明白,暂时理解为CSS3的 transition过渡不支持display的改变,直接操作display会破坏transition的动画 ,所以在第14行通过setTimeout将opacity的transition动画与display的操作分隔。 而第20行代码的目的,我是这样理解的,浏览器的UI线程在处理UI操作时,将多个css属性的 set 操作加入在同一个tick中处理(关于浏览器处理tick机制,请参考http://www.infoq.com/cn/articles/javascript-high-performance-animation-and-page-rendering?utm_source=infoq&utm_medium=popular_links_homepage),也就是说,如果不插入第20行代码,第19行和第21行的css属性set操作将会被同时执行,所以将会得到瞬间显示出来的效果;第20行代码其实是css属性的get操作,我的理解是,如果在 两个css属性的set操作中间插入get操作,UI线程在处理的时候将会按顺序执行 ,display的操作和opacity的操作在不同的tick中被执行,这样便的到我们想要的过渡效果。
本文作者: Mrcxt
查看更多内容: 进入Mrcxt的wordpress博客
在uni-app,如果自定义tabbar出现闪烁问题,可以通过使用样式过渡来优化。具体的做法是:在tabbar组件定义一个变量,用于记录当前选的索引,然后使用`uni-transition`组件来实现样式的过渡效果。 以下是一个示例代码: ```vue <template> <view class="tabbar"> <view class="tabbar-item" :class="{active: activeIndex === 0}" @click="switchTab(0)"> <uni-icons type="home"></uni-icons> <view class="tabbar-item-text">首页</view> </view> <view class="tabbar-item" :class="{active: activeIndex === 1}" @click="switchTab(1)"> <uni-icons type="search"></uni-icons> <view class="tabbar-item-text">搜索</view> </view> <view class="tabbar-item" :class="{active: activeIndex === 2}" @click="switchTab(2)"> <uni-icons type="settings"></uni-icons> <view class="tabbar-item-text">设置</view> </view> <uni-transition :name="transitionName"> <view class="tabbar-slider" :style="{transform: 'translateX(' + activeIndex * 100 + '%)'}"></view> </uni-transition> </view> </template> <script> export default { data() { return { activeIndex: 0, // 当前选的索引 transitionName: '' // 过渡效果名称 } }, methods: { switchTab(index) { if (this.activeIndex !== index) { this.transitionName = 'slide-' + (index > this.activeIndex ? 'left' : 'right'); // 根据切换方向设置过渡效果名称 this.activeIndex = index; // 更新选索引 } } } } </script> <style> .tabbar { height: 50px; display: flex; justify-content: space-around; align-items: center; background-color: #fff; box-shadow: 0px -1px 3px rgba(0, 0, 0, 0.1); } .tabbar-item { display: flex; flex-direction: column; justify-content: center; align-items: center; font-size: 14px; color: #999; transition: color 0.3s; } .tabbar-item.active { color: #007aff; } .tabbar-slider { position: absolute; left: 0; bottom: 0; width: 100%; height: 2px; background-color: #007aff; transition: transform 0.3s; } .tabbar-item-text { margin-top: 5px; } .slide-left-enter-active, .slide-left-leave-active, .slide-right-enter-active, .slide-right-leave-active { transition: all 0.3s ease-out; } .slide-left-enter, .slide-left-leave-to, .slide-right-enter, .slide-right-leave-to { opacity: 0; transform: translateX(50%); } .slide-left-enter-to, .slide-left-leave, .slide-right-enter-to, .slide-right-leave { opacity: 1; transform: translateX(0); } </style> ``` 上述代码,我们使用了`uni-transition`组件来实现样式的过渡效果。在`switchTab`方法,根据当前选的索引和目标索引的大小关系来设置过渡效果的名称,然后更新选索引。过渡效果的具体实现是通过设置过渡效果名称对应的样式类来实现的,这些样式类定义了过渡效果的动画和持续时间。 需要注意的是,为了保证过渡效果能够正常工作,组件内部的样式必须要使用`transition`属性来定义过渡效果。此外,为了避免过渡效果和其他样式产生冲突,我们还需要给过渡效果的样式类加上一个前缀,比如本例使用的是`slide-`前缀。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值