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


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 相关文章推荐
JS打印gridview实现原理及代码
Feb 05 Javascript
Javascript Throttle &amp; Debounce应用介绍
Mar 19 Javascript
jQuery实现无限往下滚动效果代码
Apr 16 Javascript
JavaScript手机振动API
Jun 11 Javascript
BootStrap tab选项卡使用小结
Aug 09 Javascript
JavaScript使用indexOf()实现数组去重的方法分析
Sep 04 Javascript
webpack4 入门最简单的例子介绍
Sep 05 Javascript
AngularJs1.x自定义指令独立作用域的函数传入参数方法
Oct 09 Javascript
Vue使用localStorage存储数据的方法
May 27 Javascript
javascript实现超好看的3D烟花特效
Jan 01 Javascript
vue-列表下详情的展开与折叠案例
Jul 28 Javascript
Vue-cli打包后如何本地查看的操作
Sep 02 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 目录遍历、删除 函数的使用介绍
2013/04/28 PHP
php数组合并的二种方法
2014/03/21 PHP
用javascript自动显示最后更新时间
2007/03/15 Javascript
js冒泡法和数组转换成字符串示例代码
2013/08/14 Javascript
使图片旋转的3种解决方案
2013/11/21 Javascript
nodejs npm install全局安装和本地安装的区别
2014/06/05 NodeJs
JS实现不规则TAB选项卡效果代码
2015/09/16 Javascript
微信小程序(三):网络请求
2017/01/13 Javascript
JavaScript通过改变文字透明度实现的文字闪烁效果实例
2017/04/27 Javascript
详解vue前后台数据交互vue-resource文档
2017/07/19 Javascript
ES6使用Set数据结构实现数组的交集、并集、差集功能示例
2017/10/31 Javascript
zTree树形菜单交互选项卡效果的实现方法
2017/12/25 Javascript
基于zTree树形菜单的使用实例
2017/12/25 Javascript
Angular2.0实现modal对话框的方法示例
2018/02/18 Javascript
vue 虚拟dom的patch源码分析
2018/03/01 Javascript
AngularJs1.x自定义指令独立作用域的函数传入参数方法
2018/10/09 Javascript
vue实现抖音时间转盘
2019/09/08 Javascript
vue-cli基础配置及webpack配置修改的完整步骤
2019/10/20 Javascript
js实现树形数据转成扁平数据的方法示例
2020/02/27 Javascript
vue+axios 拦截器实现统一token的案例
2020/09/11 Javascript
python实现带声音的摩斯码翻译实现方法
2015/05/20 Python
Python通过RabbitMQ服务器实现交换机功能的实例教程
2016/06/29 Python
对python的文件内注释 help注释方法
2018/05/23 Python
通过Python编写一个简单登录功能过程解析
2019/09/04 Python
使用Python制作新型冠状病毒实时疫情图
2020/01/28 Python
python 递归调用返回None的问题及解决方法
2020/03/16 Python
python selenium xpath定位操作
2020/09/01 Python
用python获取txt文件中关键字的数量
2020/12/24 Python
利于python脚本编写可视化nmap和masscan的方法
2020/12/29 Python
感恩节活动方案
2014/01/27 职场文书
党支部特色活动方案
2014/08/20 职场文书
教师四风对照检查材料思想汇报
2014/09/17 职场文书
医院见习报告范文
2014/11/03 职场文书
高中教师个人工作总结
2015/02/10 职场文书
部门优秀员工推荐信
2015/03/24 职场文书
Python加密与解密模块hashlib与hmac
2022/06/05 Python