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


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 相关文章推荐
iis6+javascript Add an Extension File
Jun 13 Javascript
详解jQuery向动态生成的内容添加事件响应jQuery live()方法
Nov 02 Javascript
JavaScript实现带播放列表的音乐播放器实例分享
Mar 07 Javascript
javascript 动态脚本添加的简单方法
Oct 11 Javascript
JavaScript中如何判断一个值的类型
Sep 15 Javascript
Javascript中的作用域及块级作用域
Dec 08 Javascript
Vue2.x中利用@font-size引入字体图标报错的解决方法
Sep 28 Javascript
angularjs获取到My97DatePicker选中的值方法
Oct 02 Javascript
解决layer.open后laydate失效的问题
Sep 06 Javascript
vue实现倒计时获取验证码效果
Apr 17 Javascript
在实例中重学JavaScript事件循环
Dec 03 Javascript
详解Vue的options
May 15 Vue.js
浅析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下使用SimpleXML 处理XML 文件
2010/02/27 PHP
PHP错误抑制符(@)导致引用传参失败Bug的分析
2011/05/02 PHP
apache配置虚拟主机的方法详解
2013/06/17 PHP
php合并js请求的例子
2013/11/01 PHP
php操作MongoDB基础教程(连接、新增、修改、删除、查询)
2014/03/25 PHP
php5.4传引用时报错问题分析
2016/01/22 PHP
PHP机器学习库php-ml的简单测试和使用方法
2017/07/14 PHP
PHP大文件分片上传的实现方法
2018/10/28 PHP
PHP面向对象程序设计之对象的遍历操作示例
2019/06/12 PHP
js 实现菜单上下显示附效果图
2013/11/21 Javascript
JavaScript使用indexOf获得子字符串在字符串中位置的方法
2015/04/06 Javascript
基于jquery实现图片上传本地预览功能
2016/01/08 Javascript
使用Object.defineProperty实现简单的js双向绑定
2016/04/15 Javascript
js实现多图左右切换功能
2016/08/04 Javascript
JavaScript实现简单的日历效果
2016/09/25 Javascript
写jQuery插件时的注意点
2017/02/20 Javascript
JS计算距当前时间的时间差实例
2017/12/29 Javascript
原生JS实现循环Nodelist Dom列表的4种方式示例
2018/02/11 Javascript
详解在React中跨组件分发状态的三种方法
2018/08/09 Javascript
用Vue.js在浏览器中实现裁剪图像功能
2019/06/18 Javascript
微信小程序利用for循环解决内容变更问题
2020/03/05 Javascript
python中使用xlrd、xlwt操作excel表格详解
2015/01/29 Python
浅谈机器学习需要的了解的十大算法
2017/12/15 Python
解决Python安装后pip不能用的问题
2018/06/12 Python
Python基础之文件读取的讲解
2019/02/16 Python
python实现梯度下降法
2020/03/24 Python
Windows+Anaconda3+PyTorch+PyCharm的安装教程图文详解
2020/04/03 Python
Django表单提交后实现获取相同name的不同value值
2020/05/14 Python
哪些是python中web开发框架
2020/06/17 Python
python中的django是做什么的
2020/07/31 Python
移动通信专业自荐信范文
2013/11/12 职场文书
八年级美术教学反思
2014/02/02 职场文书
2014年度个人总结范文
2015/03/09 职场文书
酒会开场白大全
2015/06/01 职场文书
主婚人致辞精选
2015/07/28 职场文书
详解Python函数print用法
2021/06/18 Python