效果圖:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiETPwJWZ3ZCMwcTP39jZpdmLENTJENTJnpFck1GT3VFRPVTRU5UNjRUT4BTeOh3aU1UMJpXTwUEROhXTE1ENFRUT5BTaOJTWE1EMBRVT21ERNRTRE1Ue4kmTykFRNBTQU1kdjJjYzpkMMRXOykVdNNjW2hXbZVnTtxENFRUT51EWa5mRXJGc5kHT20ESjBjUIF2Lc12bj5SYphXa5VWen5WY35iclN3Ztl2Lc9CX6MHc0RHaiojIsJye.gif)
實作原理:點選按鈕,往需要動畫的div中添加或移除擁有動畫效果的class。
由于微信小程式中不能操作page這個根節點,是以,隻有用一個div(view)來模仿page根節點。
1.結構
<view class=\'page {{isFix?"pageShow":"pageHide"}}\' >
<view class=\'header\'>
<view class=\'h-toggle iconfont icon-list\' bindtap=\'pageBtn\'></view>
</view>
</view>
<view class=\'r-box {{isFix?"fixShow":"fixHide"}}\' bindtap=\'fixHide\'>
<view class=\'r-list\' catchtap=\'fixStopBu\'>
<view class=\'rl-close\' catchtap=\'fixClose\'>
<text class=\'iconfont icon-close\'></text>
</view>
</view>
</view>
上面的是最主要的結構,其它的内容就不貼了。
(1) isFix是切換動畫名的狀态
(2) r-box設定了bindtap點選事件之後,r-list也設定了一個不冒泡的catchtap事件,是為了實作點選r-box的空白處時,不冒泡的效果。
2.樣式
page {
height: 100%;
width: 100%;
}
.page {
width: 100%;
height: 100%;
box-shadow: 0 0 10px rgba(26,26,26,.1);
}
.r-box {
position: fixed;
top: 0;
right: 0;
width: 100%;
height: 100%;
}
.r-box .r-list {
float: right;
width: 66%;
height: 100%;
background: white;
}
.fixHide {
transition: all .3s ease;
transform: translateX(100%);
}
.fixShow {
transition: all .3s ease;
transform: translateX(0%);
}
.pageHide {
transition: all .3s ease;
transform: translateX(0) scaleY(1);
}
.pageShow {
transition: all .3s ease;
transform: translateX(-70%) scaleY(0.9);
}
這些是最主要的樣式:
(1) class為page的div(view),就是模拟整個page頁面,是以寬高需要設為100%。
(2) r-box是右邊側滑的div(view)
(3) fixHide,fixShow這是側滑欄的動畫效果。
(4) pageHide,pageShow這是整個頁面的動畫效果
(5) 由于transform隻能出現一次,是以當有兩個即以上的動畫效果時,隻寫在一個transform裡,然後把不同的動畫效果分開就行。
(6) 過渡效果的速度曲線我使用的是ease,如果用linear,在手機上會感覺很卡頓。
3.js
Page({
data:{
isFix:false,//右側清單是否顯示
},
// 右側清單顯示按鈕
pageBtn:function(){
this.setData({
isFix:true
})
},
//右側清單空白點選
fixHide:function(){
this.setData({
isFix: false
})
},
//右側清單防冒泡,必須有,雖然沒内容
fixStopBu: function () {},
//右側清單關閉按鈕
fixClose:function(){
this.setData({
isFix:false
})
},
})
實作的過程大緻就是這樣。還是挺簡單的。不知道用小程式的動畫api做起來會不會簡單一些或者更順暢一點,這個就看自己勤不勤了。