微信小程序实现自定义动画弹框/提示框的方法实例


Posted in Javascript onNovember 06, 2020

前言

在小程序中,用户与界面进行交互时,有一些用户反馈提示,例如:触发某个按钮,从底部弹出框,从顶部弹出等

如今,有一些现成的 UI 库,虽然已经实现了的,但若只是为了实现一个底部弹出框或者自定义提示框,不引用第三方 UI 库

怎么手动原生方式去实现呢,最主要的是怎么去实现动画

css3 实现动画

如下是wxml代码

<view>
 <view class="click-btn" catchtap="onBottomBox">弹出底部弹出框</view>
 <view class="click-btn" bindtap="onTopBox">弹出顶部提示框</view>
 <view wx:if="{{isBottom}}" class="bottom-box">
 <div class="mask" bindtap="onHideBox"></div>
 <div class="pop">底部弹出内容</div>
 </view>
 <div wx:if="{{isTop}}" class="top-box">通知内容</div>
</view>

如下是wxss代码

/* pages/customalertbox/customalertbox.wxss */
.click-btn {
 width: 120px;
 height: 40px;
 line-height: 40px;
 text-align: center;
 margin: 20px auto;
 border: 1px solid #ccc;
 border-radius: 5px;
}

.top-box {
 width: 100%;
 height: 30px;
 background: #f56c6c;
 border-radius: 0 0 8px 8px;
 color: #fff;
 text-align: center;
 line-height: 30px;
 font-size: 28rpx;
 position: absolute;
 top: 0px;
 left: 0;
 animation-duration: 0.5s;
 animation-name: slidetop;
}

.mask {
 width: 100%;
 height: 100%;
 position: fixed;
 top: 0;
 left: 0;
 background: rgba(0, 0, 0, 0.5);
}

.pop {
 position: absolute;
 width: 100%;
 height: 180px;
 background: #42b983;
 border-radius: 8px 8px 0 0;
 position: absolute;
 bottom: 0px;
 animation-duration: 0.5s;
 animation-name: slidein;
}

@keyframes slidein {
 from {
 transform: translateY(70%);
 }
 to {
 transform: translateY(0);
 }
}

@keyframes slidetop {
 from {
 transform: translateY(-30px);
 }
 to {
 transform: translateY(0px);
 }
}

如下是逻辑代码

// pages/customalertbox/customalertbox.js
Page({
 /**
 * 页面的初始数据
 */
 data: {
 isBottom: false,
 isTop: false,
 },

 /**
 * 生命周期函数--监听页面加载
 */
 onLoad: function(options) {},

 onBottomBox() {
 this.setData({
 isBottom: true,
 });
 },

 onHideBox() {
 this.setData({
 isBottom: false,
 });
 },

 onTopBox() {
 this.setData({
 isTop: true,
 });

 setTimeout(() => {
 this.setData({
 isTop: false,
 });
 }, 2000);
 },
});

在小程序中实现动画,如上实现的动画,是通过css3中的@keyframes实现的,如下所示

.pop {
 /* ... */
 animation-duration: 0.5s;
 animation-name: slidein; // 动画的名称
}

@keyframes slidein {
 // 定义动画的名称
 from {
 transform: translateY(70%); // 平移,垂直方向上
 }
 to {
 transform: translateY(0);
 }
}

.top-box {
 /* ... */
 animation-duration: 0.5s;
 animation-name: slidetop;
}

@keyframes slidetop {
 from {
 transform: translateY(-30px);
 }
 to {
 transform: translateY(0px);
 }
}

通过 css3 中的@keyframes以及变换transform,垂直方向上平移,实现动画

示例效果如下所示

微信小程序实现自定义动画弹框/提示框的方法实例

以上是通过 css3 的动画animation结合@keyframes动画帧实现的,那么在小程序当中,也可以通过官方的动画API实现的

小程序动画 API-实现动画

创建一个动画实例 animation,调用实例的方法来描述动画。最后通过动画实例的 export 方法导出动画数据传递给组件的 animation 属性

示例效果如下所示

微信小程序实现自定义动画弹框/提示框的方法实例

如下是实例代码

<view>
 <view class="click-btn" bindtap="onBottomBox">弹出底部弹出框</view>
 <view class="click-btn" bindtap="onTopBox">弹出顶部提示框</view>
 <view
 wx:if="{{isBottom}}"
 style="position: absolute;width: 100%;height: 100%;bottom: 0px;"
 >
 <div class="mask" bindtap="onHideBox"></div>
 <div class="pop" animation="{{animationData}}">底部弹出内容</div>
 </view>
 <div wx:if="{{isTop}}" class="top-box">通知内容</div>
</view>

主要是给想要添加动画的元素添加了一个animation属性,现在的动画是通过js去控制,而非css

如下代码所示

// pages/customalertbox/customalertbox.js
Page({
 /**
 * 页面的初始数据
 */
 data: {
 isBottom: false,
 isTop: false,
 animationData: {}, // 定义动画对象
 },

 /**
 * 生命周期函数--监听页面加载
 */
 onLoad: function(options) {},

 onBottomBox() {
 // 创建动画
 var animation = wx.createAnimation({
  duration: 2000,
  timingFunction: 'ease',
 });

 this.animation = animation;
 // 先在y轴偏移180,然后用step()完成一个动画
 animation.translateY(180).step();
 this.setData({
  animationData: animation.export(),
  isBottom: true,
 });

 // 设置setTimeout来改变y轴偏移量,实现有感觉的滑动,回到初始位置
 setTimeout(() => {
  animation.translateY(0).step();
  this.setData({
  animationData: animation.export(),
  });
 }, 200);
 },

 // 点击遮罩层隐藏弹框
 onHideBox() {
 var animation = wx.createAnimation({
  duration: 2000,
  timingFunction: 'ease',
 });
 this.animation = animation;
 // 先在y轴偏移180,然后用step()完成一个动画
 animation.translateY(180).step();
 this.setData({
  animationData: animation.export(),
 });
 setTimeout(() => {
  animation.translateY(0).step();
  this.setData({
  animationData: animation.export(),
  isBottom: false,
  });
 }, 200);
 },

 onTopBox() {
 this.setData({
  isTop: true,
 });

 setTimeout(() => {
  this.setData({
  isTop: false,
  });
 }, 2000);
 },
});

以上就是通过微信小程序中动画API实现的完成的动画,代码要比 css3 要多一些,可以实现更加复杂的动画效果

注意

如果是底部弹出框,拖动里面时,若遮罩层底部会跟着滚动,具体解决办法也可以在外层添加catchtouchmove="true"即可解决

<view>
 <view class="click-btn" bindtap="onBottomBox">弹出底部弹出框</view>
 <view
 catchtouchmove="true"
 wx:if="{{isBottom}}"
 style="position: absolute;width: 100%;height: 100%;bottom: 0px;"
 >
 <div class="mask" bindtap="onHideBox"></div>
 <div class="pop" animation="{{animationData}}">底部弹出内容</div>
 </view>
 <div wx:if="{{isTop}}" class="top-box">通知内容</div>
</view>

结语

在小程序当中实现动画可以用css3的animation结合@keyframes实现,同样也可以通过小程序动画的api去实现

到此这篇关于微信小程序实现自定义动画弹框/提示框的文章就介绍到这了,更多相关微信小程序自定义动画弹框/提示框内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

相关文档

小程序动画 API

Javascript 相关文章推荐
初识Node.js
Sep 03 Javascript
jquery实现页面百叶窗走马灯式翻滚显示效果的方法
Mar 12 Javascript
基于jquery实现图片相关操作(重绘、获取尺寸、调整大小、缩放)
Dec 25 Javascript
深入理解关于javascript中apply()和call()方法的区别
Apr 12 Javascript
JS组件Bootstrap实现下拉菜单效果代码
Apr 26 Javascript
微信小程序商城项目之商品属性分类(4)
Apr 17 Javascript
微信网页授权并获取用户信息的方法
Jul 30 Javascript
使用pkg打包Node.js应用的方法步骤
Oct 19 Javascript
vue-cli3环境变量与分环境打包的方法示例
Feb 18 Javascript
详解如何提升JSON.stringify()的性能
Jun 12 Javascript
VUE渲染后端返回含有script标签的html字符串示例
Oct 28 Javascript
javascript实现异形滚动轮播
Nov 28 Javascript
微信小程序自定义tabBar的踩坑实践记录
Nov 06 #Javascript
浅谈nuxtjs校验登录中间件和混入(mixin)
Nov 06 #Javascript
nuxt.js 在middleware(中间件)中实现路由鉴权操作
Nov 06 #Javascript
vue中的计算属性和侦听属性
Nov 06 #Javascript
nuxt.js添加环境变量,区分项目打包环境操作
Nov 06 #Javascript
使用Vue实现一个树组件的示例
Nov 06 #Javascript
Nuxt.js 静态资源和打包的操作
Nov 06 #Javascript
You might like
功能齐全的PHP发送邮件类代码附详细说明
2008/07/10 PHP
PHP 基于Yii框架中使用smarty模板的方法详解
2013/06/13 PHP
PHP中time(),date(),mktime()区别介绍
2013/09/28 PHP
php模板引擎技术简单实现
2016/03/15 PHP
PHP登录验证码的实现与使用方法
2016/07/07 PHP
Yii2语言国际化自动配置详解
2018/08/22 PHP
JavaScript 模块化编程(笔记)
2015/04/08 Javascript
基于Bootstrap使用jQuery实现输入框组input-group的添加与删除
2016/05/03 Javascript
AngularJS学习第二篇 AngularJS依赖注入
2017/02/13 Javascript
nodejs个人博客开发第二步 入口文件
2017/04/12 NodeJs
Vue.js 实现微信公众号菜单编辑器功能(一)
2018/05/08 Javascript
关于vue的语法规则检测报错问题的解决
2018/05/21 Javascript
微信小程序的部署方法步骤
2018/09/04 Javascript
浅谈一个webpack构建速度优化误区
2019/06/24 Javascript
微信小程序 scroll-view 水平滚动实现过程解析
2019/10/12 Javascript
Vue如何提升首屏加载速度实例解析
2020/06/25 Javascript
如何检测JavaScript中的死循环示例详解
2020/08/30 Javascript
python自动登录12306并自动点击验证码完成登录的实现源代码
2018/04/25 Python
pytorch cnn 识别手写的字实现自建图片数据
2018/05/20 Python
python使用scrapy发送post请求的坑
2018/09/04 Python
解决Python下json.loads()中文字符出错的问题
2018/12/19 Python
python2使用bs4爬取腾讯社招过程解析
2019/08/14 Python
Python3常见函数range()用法详解
2019/12/30 Python
Python搭建Keras CNN模型破解网站验证码的实现
2020/04/07 Python
Python基于字典实现switch case函数调用
2020/07/22 Python
Python加载数据的5种不同方式(收藏)
2020/11/13 Python
如何利用python生成MD5并去重
2020/12/07 Python
自定义html标记替换html5新增元素
2008/10/17 HTML / CSS
关于HTML5你必须知道的28个新特性,新技巧以及新技术
2012/05/28 HTML / CSS
新西兰优惠网站:Treat Me
2019/07/04 全球购物
致跳高运动员加油稿
2014/02/12 职场文书
幼儿园六一儿童节主持节目串词
2014/03/21 职场文书
《开国大典》教学反思
2014/04/19 职场文书
Tensorflow与RNN、双向LSTM等的踩坑记录及解决
2021/05/31 Python
Redis基本数据类型Zset有序集合常用操作
2022/06/01 Redis
Go语言怎么使用变长参数函数
2022/07/15 Golang