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


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 相关文章推荐
javascript模拟select,jselect的方法实现
Nov 08 Javascript
使用Chrome浏览器调试AngularJS应用的方法
Jun 18 Javascript
高性能JavaScript 重排与重绘(2)
Aug 11 Javascript
AngularJS仿苹果滑屏删除控件
Jan 18 Javascript
微信小程序 使用picker封装省市区三级联动实例代码
Oct 28 Javascript
jqGrid翻页时数据选中丢失问题的解决办法
Feb 13 Javascript
vue checkbox 全选 数据的绑定及获取和计算方法
Feb 09 Javascript
jQuery实现的简单对话框拖动功能示例
Jun 05 jQuery
通过实践编写优雅的JavaScript代码
May 30 Javascript
JS面向对象之单选框实现
Jan 17 Javascript
js模拟实现百度搜索
Jun 28 Javascript
解决Mint-ui 框架Popup和Datetime Picker组件滚动穿透的问题
Nov 04 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
论坛头像随机变换代码
2006/10/09 PHP
PHP获取mysql数据表的字段名称和详细信息的方法
2014/09/27 PHP
php实现约瑟夫问题的方法小结
2015/03/23 PHP
CodeIgniter分页类pagination使用方法示例
2016/03/28 PHP
PHP快速推送微信模板消息
2017/04/14 PHP
Joomla框架实现字符串截取的方法示例
2017/07/18 PHP
ThinkPHP框架中使用Memcached缓存数据的方法
2018/03/31 PHP
PHP实现的数据对象映射模式详解
2019/03/20 PHP
javascript 图片上一张下一张链接效果代码
2010/03/12 Javascript
关于用Jquery的height()、width()计算动态插入的IMG标签的宽高的问题
2010/12/08 Javascript
js中如何把字符串转化为对象、数组示例代码
2013/07/17 Javascript
js简单实现HTML标签Select联动带跳转
2013/10/23 Javascript
jQuery实现点击图片翻页展示效果的方法
2015/02/16 Javascript
Backbone.js 0.9.2 源码注释中文翻译版
2015/06/25 Javascript
JavaScript对象数组排序实例方法浅析
2016/06/15 Javascript
vue-resource调用promise取数据方式详解
2017/07/21 Javascript
基于JQuery的Ajax方法使用详解
2017/08/16 jQuery
微信小程序实现弹出菜单
2018/07/19 Javascript
JS如何实现动态添加的元素绑定事件
2019/11/12 Javascript
详解Vue+elementUI build打包部署后字体图标丢失问题
2020/07/13 Javascript
vue项目中播放rtmp视频文件流的方法
2020/09/17 Javascript
[02:16]卖萌的僵尸 DOTA2神话信使飞僵小宝来袭
2014/03/24 DOTA
[04:10]2018年度CS GO玩家最喜爱的主播-完美盛典
2018/12/16 DOTA
python开发之基于thread线程搜索本地文件的方法
2015/11/11 Python
Python使用BeautifulSoup库解析HTML基本使用教程
2016/03/31 Python
Python3一行代码实现图片文字识别的示例
2018/01/15 Python
运用TensorFlow进行简单实现线性回归、梯度下降示例
2018/03/05 Python
pandas.loc 选取指定列进行操作的实例
2018/05/18 Python
Python从数据库读取大量数据批量写入文件的方法
2018/12/10 Python
高中生评语大全
2014/04/25 职场文书
售后服务质量承诺书
2015/04/29 职场文书
小兵张嘎观后感
2015/06/03 职场文书
傲慢与偏见电影观后感
2015/06/10 职场文书
vue使用v-model进行跨组件绑定的基本实现方法
2021/04/28 Vue.js
教你使用Pandas直接核算Excel中快递费用
2021/05/12 Python
JavaScript利用html5新方法操作元素类名详解
2021/11/27 Javascript