微信小程序自定义模态对话框实例详解


Posted in Javascript onAugust 16, 2017

由于官方API提供的显示模态弹窗,只能简单地显示文字内容,不能对对话框内容进行自定义,欠缺灵活性,所以自己从模态弹窗的原理角度来实现了自定义的模态对话框。

wx.showModal(OBJECT)
自定义
模态对话框

涉及文件

界面 wxml
样式 wxcss
事件及方法 js

效果图

微信小程序自定义模态对话框实例详解

微信小程序自定义模态对话框实例详解

界面代码 .wxml

<button class="show-btn" bindtap="showDialogBtn">弹窗</button>

<!--弹窗-->
<view class="modal-mask" bindtap="hideModal" catchtouchmove="preventTouchMove" wx:if="{{showModal}}"></view>
<view class="modal-dialog" wx:if="{{showModal}}">
 <view class="modal-title">添加数量</view>
 <view class="modal-content">
 <view class="modal-input">
  <input placeholder-class="input-holder" type="number" maxlength="10" bindinput="inputChange" class="input" placeholder="请输入数量"></input>
 </view>
 </view>
 <view class="modal-footer">
 <view class="btn-cancel" bindtap="onCancel" data-status="cancel">取消</view>
 <view class="btn-confirm" bindtap="onConfirm" data-status="confirm">确定</view>
 </view>
</view>

样式 .wxss

.show-btn {
 margin-top: 100rpx;
 color: #22cc22;
}

.modal-mask {
 width: 100%;
 height: 100%;
 position: fixed;
 top: 0;
 left: 0;
 background: #000;
 opacity: 0.5;
 overflow: hidden;
 z-index: 9000;
 color: #fff;
}

.modal-dialog {
 width: 540rpx;
 overflow: hidden;
 position: fixed;
 top: 50%;
 left: 0;
 z-index: 9999;
 background: #f9f9f9;
 margin: -180rpx 105rpx;
 border-radius: 36rpx;
}

.modal-title {
 padding-top: 50rpx;
 font-size: 36rpx;
 color: #030303;
 text-align: center;
}

.modal-content {
 padding: 50rpx 32rpx;
}

.modal-input {
 display: flex;
 background: #fff;
 border: 2rpx solid #ddd;
 border-radius: 4rpx;
 font-size: 28rpx;
}


.input {
 width: 100%;
 height: 82rpx;
 font-size: 28rpx;
 line-height: 28rpx;
 padding: 0 20rpx;
 box-sizing: border-box;
 color: #333;
}

input-holder {
 color: #666;
 font-size: 28rpx;
}

.modal-footer {
 display: flex;
 flex-direction: row;
 height: 86rpx;
 border-top: 1px solid #dedede;
 font-size: 34rpx;
 line-height: 86rpx;
}

.btn-cancel {
 width: 50%;
 color: #666;
 text-align: center;
 border-right: 1px solid #dedede;
}

.btn-confirm {
 width: 50%;
 color: #ec5300;
 text-align: center;
}

事件及方法 .js

Page({
 data: {
  showModal: false,
 },
 onLoad: function () {
 },
 /**
  * 弹窗
  */
 showDialogBtn: function() {
  this.setData({
  showModal: true
  })
 },
 /**
  * 弹出框蒙层截断touchmove事件
  */
 preventTouchMove: function () {
 },
 /**
  * 隐藏模态对话框
  */
 hideModal: function () {
  this.setData({
  showModal: false
  });
 },
 /**
  * 对话框取消按钮点击事件
  */
 onCancel: function () {
  this.hideModal();
 },
 /**
  * 对话框确认按钮点击事件
  */
 onConfirm: function () {
  this.hideModal();
 }
})

实现思路解读及原理

界面解读:

用一个蒙层+弹窗来组成,用绑定的数据{{showModal}}来控制弹窗的显示和隐藏

事件及方法解读:
让弹窗显示的方法:

showDialogBtn: function() {
  this.setData({
  showModal: true
  })
 }

让弹窗消失的方法:

hideModal: function () {
  this.setData({
  showModal: false
  });
 }

这里有个要特别注意的地方,就是下面这个方法:

preventTouchMove: function () {
 }

为什么是空方法?因为要结合界面wxml看,蒙层view里有一个事件绑定catchtouchmove="preventTouchMove"。这养写的原因是阻断事件向下传递,避免在弹窗后还可以点击或者滑动蒙层下的界面。如果不这样写的话,如果主界面是一个可以滚动的界面,想想看,当弹窗弹出的时候用户还可以操作滚动列表,我想你的产品经理会来找你的。

 3. 样式解读:(这个标题没加代码块标识,但还是像代码块一样被显示了,这是个bug!!!- -)

.modal-mask和.modal-dialog样式的写法需要特别注意。

主要是层级关系,弹窗要保证在最上层,不被界面遮挡,然后蒙层要遮挡住界面,但是不可遮挡弹窗。所以.modal-mask和.modal-dialog的z-index值要注意。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
北京奥运官方网站幻灯切换效果flash版打包下载
Jan 30 Javascript
Javascript 入门基础学习
Mar 10 Javascript
10分钟学会写Jquery插件实例教程
Sep 06 Javascript
jQuery实现简单隔行变色的方法
Feb 20 Javascript
jquery弹出遮掩层效果【附实例代码】
Apr 28 Javascript
jQuery插件dataTables添加序号列的方法
Jul 06 Javascript
bootstrap模态框消失问题的解决方法
Dec 02 Javascript
jQuery中select与datalist制作下拉菜单时的区别浅析
Dec 30 Javascript
微信小程序实现瀑布流布局与无限加载的方法详解
May 12 Javascript
JS SetInterval 代码实现页面轮询
Aug 11 Javascript
JavaScript实现多张图片放大镜效果示例【不限定图片尺寸,rem单位】
May 14 Javascript
Vue.js 中制作自定义选择组件的代码附演示demo
Feb 28 Javascript
浅析webpack 如何优雅的使用tree-shaking(摇树优化)
Aug 16 #Javascript
JavaScript实现三级联动菜单效果
Aug 16 #Javascript
ionic3 懒加载
Aug 16 #Javascript
JavaScript仿微信(电话)联系人列表滑动字母索引实例讲解(推荐)
Aug 16 #Javascript
理解 Node.js 事件驱动机制的原理
Aug 16 #Javascript
JavaScript选取(picking)和反选(rejecting)对象的属性方法
Aug 16 #Javascript
JavaScript-定时器0~9抽奖系统详解(代码)
Aug 16 #Javascript
You might like
extJs 常用到的增,删,改,查操作代码
2009/12/28 Javascript
javascript操作cookie的文章(设置,删除cookies)
2010/04/01 Javascript
JSON.stringify 语法实例讲解
2012/03/14 Javascript
Javascript 闭包引起的IE内存泄露分析
2012/05/23 Javascript
通过jQuery源码学习javascript(一)
2012/12/27 Javascript
JS脚本defer的作用示例介绍
2014/01/02 Javascript
node.js Web应用框架Express入门指南
2014/05/28 Javascript
javascript用函数实现对象的方法
2015/05/14 Javascript
js改变style样式和css样式的简单实例
2016/06/28 Javascript
JavaScript中在光标处插入添加文本标签节点的详细方法
2017/03/22 Javascript
微信小程序实现换肤功能
2018/03/14 Javascript
详解JS实现简单的时分秒倒计时代码
2019/04/25 Javascript
IDEA安装vue插件图文详解
2019/09/26 Javascript
Jquery如何使用animation动画效果改变背景色的代码
2020/07/20 jQuery
py2exe 编译ico图标的代码
2013/03/08 Python
Python实现windows下模拟按键和鼠标点击的方法
2015/03/13 Python
利用Python爬取可用的代理IP
2016/08/18 Python
Django URL传递参数的方法总结
2016/08/28 Python
使用python遍历指定城市的一周气温
2017/03/31 Python
python高效过滤出文件夹下指定文件名结尾的文件实例
2018/10/21 Python
python实现转圈打印矩阵
2019/03/02 Python
PyTorch中topk函数的用法详解
2020/01/02 Python
浅谈python元素如何去重,去重后如何保持原来元素的顺序不变
2020/02/28 Python
Expected conditions模块使用方法汇总代码解析
2020/08/13 Python
如何用Python进行时间序列分解和预测
2021/03/01 Python
斯洛伐克时尚服装网上商店:Cellbes
2016/10/20 全球购物
办公室文秘岗位职责
2013/11/15 职场文书
英文留学推荐信范文
2014/01/25 职场文书
外语系大学生自荐信范文
2014/03/01 职场文书
《骑牛比赛》教后反思
2014/04/22 职场文书
入职担保书范文
2014/05/21 职场文书
关于青春的演讲稿800字
2014/08/22 职场文书
狂人日记读书笔记
2015/06/30 职场文书
python3实现无权最短路径的方法
2021/05/12 Python
Mysql忘记密码解决方法
2022/02/12 MySQL
解决MySQL添加新用户-ERROR 1045 (28000)的问题
2022/03/03 MySQL