微信小程序之内容的动画展开与收回

先上效果图:
1.展开状态
在这里插入图片描述

2.显示状态
在这里插入图片描述

3.收回状态
在这里插入图片描述

先说一下实现原理:
1.给列表一个动画效果。
2.使用animotion来创建动画。
3.使列表的高度从0到n开始变化,使用setTimeout做延时处理。
4.收回则与上面相反。
5.animotion的用法请查看官方文档
传送门https://developers.weixin.qq.com/miniprogram/dev/api/ui/animation/wx.createAnimation.html

下面是wxml代码:

<view class='container'>
    <button class='text' bindtap="{{ stopBtn ? 'showContent' : 'hideContent' }}">内容的展开与收回</button> 
    <view wx:for="{{companyInfo}}" wx:if="{{choose}}" class='companyInfo' wx:for-index="idx" wx:key="0" animation='{{animationData}}'>
        <view class='companyInfo-left'>
            <text>{{item.company_base}}</text>
            <text>{{item.content}}</text>
        </view>
        <view class='companyInfo-right'>
            <button class='small-button' wx:if="{{idx > 1}}" id="{{idx}}" data-set="{{item.content}}" disabled='{{stopBtn}}'>拨打</button>
            <button class='small-button' wx:else bindtap='copyToClipboard' id="{{idx}}" data-content="{{item.content}}" disabled='{{stopBtn}}'>复制</button>
        </view>
    </view>
</view>

然后是wxss代码:

.container {
 
} 
.text {
  width: 100%;
  position: relative;
  height: 100rpx;
  line-height: 100rpx;
  border: 1px solid #ccc;
}
.companyInfo{
    display: flex;
    flex-direction: row;
    width: 100%;
    line-height: 60rpx;
    height: 60rpx;
    justify-content: space-between;
    align-items: center;
}
.companyInfo-left{
    display: flex;
    flex-direction: row;
    line-height: 60rpx;
    height: 60rpx;
    font-size: 30rpx;
}
.companyInfo-right{
    display: flex;
    align-items: center;
    line-height: 60rpx;
    height: 60rpx;
}
.small-button{
    font-size: 24rpx;
    background: lightgreen;
    height: 50rpx;
    display: flex;
    justify-content: center;
    align-items: center;
}

最后是js代码:

const app = getApp()

Page({
  data: {
      choose: false,
      animationData: {},
      stopBtn: true,//动画未执行完之前禁用按钮
      companyInfo: [{
          company_base: '公司名称:',
          content: '某某公司'
      }, {
          company_base: '公司地址:',
          content: '某某地址'
      }, {
          company_base: '公司电话:',
          content: '1234567890'
      }, {
          company_base: '公司座机:',
          content: '987654'
      }]
  },

  onLoad: function () {

  },
    showContent: function (e) {
        // 用that取代this,防止setTimeout内使用this出错
        var that = this;
        // 创建一个动画实例
        var animation = wx.createAnimation({
            // 动画持续时间
            duration: 500,
            // 定义动画效果,当前是匀速
            timingFunction: 'linear'
        })
        // 将该变量赋值给当前动画
        that.animation = animation
        //用step()完成一个动画, 高度为0,透明度为不可见
        animation.height("0").opacity(0).step()
        // 用setData改变当前动画
        that.setData({
            // 通过export()方法导出数据
            animationData: animation.export(),
            // 改变显示条件
            choose: true
        })
        // 设置setTimeout来改变高度以及透明度,实现有感觉的展开
        setTimeout(function () {
            animation.height("60rpx").opacity(1).step({ duration: 500 })
            that.setData({
                animationData: animation.export(),
            })
        }, 50)
        //在动画时间禁用按钮
        setTimeout(function () {
            that.setData({
                stopBtn: false
            })
        }, 500)
    },

    // 隐藏
    hideContent: function (e) {
        var that = this;
        var animation = wx.createAnimation({
            duration: 500,
            timingFunction: 'linear'
        })
        that.animation = animation
        animation.height(0).opacity(0).step({ duration: 500 })
        that.setData({
            animationData: animation.export()
        })
        setTimeout(function () {
            animation.height("60rpx").step();
            that.setData({
                animationData: animation.export(),
                choose: false,
            })
        }, 500)
        //收回动画开始禁用按钮
        that.setData({
            stopBtn: true,
        })
    },
})

有什么问题欢迎大家指出,一起学习,一起进步。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值