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


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 相关文章推荐
对textarea框的代码调试,而且功能上使用非常方便,酷
Jun 30 Javascript
Javascript遍历Html Table示例(包括内容和属性值)
Jul 08 Javascript
javascript实现的图片切割多块效果实例
May 07 Javascript
JavaScript如何调试有哪些建议和技巧附五款有用的调试工具
Oct 28 Javascript
特殊日期提示功能的实现方法
Jun 16 Javascript
JavaScript事件详细讲解
Jun 27 Javascript
JavaScript toUpperCase()方法使用详解
Aug 26 Javascript
jquery获取transform里的值实现方法
Dec 12 jQuery
Vue formData实现图片上传
Aug 20 Javascript
vue路由传参三种基本方式详解
Dec 09 Javascript
js+canvas实现画板功能
Sep 13 Javascript
Node.js利用Express实现用户注册登陆功能(推荐)
Oct 26 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
用php+mysql一个名片库程序
2006/10/09 PHP
php设计模式 Adapter(适配器模式)
2011/06/26 PHP
PHP可变变量学习小结
2015/11/29 PHP
php获取远程图片并下载保存到本地的方法分析
2016/10/08 PHP
PHP中SERIALIZE和JSON的序列化与反序列化操作区别分析
2016/10/11 PHP
Laravel 自动转换长整型雪花 ID 为字符串的实现
2020/10/27 PHP
来自qq的javascript面试题
2010/07/24 Javascript
QQ空间顶部折页撕开效果示例代码
2014/06/15 Javascript
JavaScript中Cookie操作实例
2015/01/09 Javascript
jQuery中outerHeight()方法用法实例
2015/01/19 Javascript
详解angularJs中关于ng-class的三种使用方式说明
2017/06/02 Javascript
vue.js源代码core scedule.js学习笔记
2017/07/03 Javascript
详解Vuejs2.0 如何利用proxyTable实现跨域请求
2017/08/03 Javascript
JS实现利用两个队列表示一个栈的方法
2017/12/13 Javascript
页面点击小红心js实现代码
2018/05/26 Javascript
Node.js console控制台简单用法分析
2019/01/04 Javascript
Javascript数组方法reduce的妙用之处分享
2019/06/10 Javascript
js实现无缝轮播图效果
2020/03/09 Javascript
[00:39]DOTA2上海特级锦标赛 Liquid战队宣传片
2016/03/04 DOTA
Python version 2.7 required, which was not found in the registry
2014/08/26 Python
python标准算法实现数组全排列的方法
2015/03/17 Python
Python实现列表转换成字典数据结构的方法
2016/03/11 Python
浅谈python numpy中nonzero()的用法
2018/04/02 Python
python pandas 组内排序、单组排序、标号的实例
2018/04/12 Python
Python 取numpy数组的某几行某几列方法
2019/10/24 Python
django框架ModelForm组件用法详解
2019/12/11 Python
Python守护进程实现过程详解
2020/02/10 Python
浅析Python 多行匹配模式
2020/07/24 Python
python 中 .py文件 转 .pyd文件的操作
2021/03/04 Python
全天然狗零食:Best Bully Sticks
2016/09/22 全球购物
团日活动总结书
2014/05/08 职场文书
大学生入党积极分子党校学习思想汇报
2014/10/25 职场文书
儿园租房协议书范本
2014/12/02 职场文书
校本课程教学计划
2015/01/19 职场文书
英文版辞职信
2015/02/28 职场文书
公司副总经理岗位职责
2015/04/08 职场文书