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


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 相关文章推荐
符合W3C网页标准的iframe标签的使用方法
Jul 19 Javascript
js 获取中文拼音,Select自动匹配字母获取值的代码
Sep 23 Javascript
web的各种前端打印方法之jquery打印插件PrintArea实现网页打印
Jan 09 Javascript
JS加jquery简单实现标签元素的显示或隐藏
Sep 23 Javascript
JS实现文档加载完成后执行代码
Jul 09 Javascript
Node.js的Koa框架上手及MySQL操作指南
Jun 13 Javascript
angularjs 源码解析之injector
Aug 22 Javascript
vue中的event bus非父子组件通信解析
Oct 27 Javascript
vue-cli V3.0版本的使用详解
Oct 24 Javascript
node版本管理工具n包使用教程详解
Nov 09 Javascript
详解在React项目中安装并使用Less(用法总结)
Mar 18 Javascript
微信小程序云开发之使用云函数
May 17 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
法压式咖啡之制作法
2021/03/03 冲泡冲煮
php 判断服务器操作系统的类型
2014/02/17 PHP
常用PHP框架功能对照表
2014/10/23 PHP
php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解决方法
2014/11/04 PHP
thinkphp实现发送邮件密码找回功能实例
2014/12/01 PHP
PHP编程实现脚本异步执行的方法
2017/08/09 PHP
jQuery获取节点和子节点文本的方法
2014/07/22 Javascript
Jquery Easyui自定义下拉框组件使用详解(21)
2020/12/31 Javascript
Ajax 加载数据 练习代码
2017/01/05 Javascript
jQuery插件HighCharts实现2D柱状图、折线图的组合多轴图效果示例【附demo源码下载】
2017/03/09 Javascript
微信小程序日期时间选择器使用方法
2018/02/01 Javascript
使用vue-cli创建项目的图文教程(新手入门篇)
2018/05/02 Javascript
用Cordova打包Vue项目的方法步骤
2019/02/02 Javascript
Vue自定义指令写法与个人理解
2019/02/09 Javascript
VUE项目中加载已保存的笔记实例方法
2019/09/14 Javascript
electron 安装,调试,打包的具体使用
2019/11/06 Javascript
微信小程序点击view动态添加样式过程解析
2020/01/21 Javascript
nodejs脚本centos开机启动实操方法
2020/03/04 NodeJs
javascript中的offsetWidth、clientWidth、innerWidth及相关属性方法
2020/05/14 Javascript
OpenLayers3实现地图显示功能
2020/09/25 Javascript
关于Js中new操作符的作用详解
2021/02/21 Javascript
使用简单工厂模式来进行Python的设计模式编程
2016/03/01 Python
python socket网络编程之粘包问题详解
2018/04/28 Python
Python基于聚类算法实现密度聚类(DBSCAN)计算【测试可用】
2018/12/26 Python
Python+Appium实现自动化测试的使用步骤
2020/03/24 Python
CSS3制作炫酷带方向感应的鼠标滑过图片3D动画
2016/03/16 HTML / CSS
巴西在线鞋店:Shoestock
2017/10/28 全球购物
美国台面电器和厨具品牌:KitchenAid
2019/04/12 全球购物
心得体会范文
2014/01/04 职场文书
优秀幼教自荐信
2014/02/03 职场文书
送餐员岗位职责范本
2014/02/21 职场文书
家长给老师的感谢信
2015/01/20 职场文书
大学生学年个人总结
2015/02/15 职场文书
论文致谢词范文
2015/05/14 职场文书
python实现自动清理文件夹旧文件
2021/05/10 Python
MYSQL如何查看操作日志详解
2022/05/30 MySQL