天天看点

微信小程序之实现页面缩放式侧滑效果

效果图:

微信小程序之实现页面缩放式侧滑效果

实现原理:点击按钮,往需要动画的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做起来会不会简单一些或者更顺畅一点,这个就看自己勤不勤了。