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


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 相关文章推荐
使用新的消息弹出框blackbirdjs
Oct 16 Javascript
$.ajax json数据传递方法
Nov 19 Javascript
javascript中的delete使用详解
Apr 11 Javascript
js通过八个点 拖动改变div大小的实现方法
Mar 05 Javascript
JavaScript通过使用onerror设置默认图像显示代替alt
Mar 01 Javascript
JavaScript类的写法
Sep 17 Javascript
微信小程序 Toast自定义实例详解
Jan 20 Javascript
深入理解Angular中的依赖注入
Jun 26 Javascript
VuePress 静态网站生成方法步骤
Feb 14 Javascript
vue使用Font Awesome的方法步骤
Feb 26 Javascript
微信小程序 拍照或从相册选取图片上传代码实例
Aug 28 Javascript
javascript实现拖拽碰撞检测
Mar 12 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中使用FFMPEG获取视频缩略图和视频总时长实例
2014/05/04 PHP
php5.4传引用时报错问题分析
2016/01/22 PHP
PHP中spl_autoload_register()函数用法实例详解
2016/07/18 PHP
php操纵mysqli数据库的实现方法
2016/09/18 PHP
QUnit jQuery的TDD框架
2010/11/04 Javascript
JavaScript将数据转换成整数的方法
2014/01/04 Javascript
jQuery Masonry瀑布流插件使用详解
2014/11/17 Javascript
浅谈angular.js中实现双向绑定的方法$watch $digest $apply
2015/10/14 Javascript
jquery获取select选中值的方法分析
2015/12/22 Javascript
基于HTML5上使用iScroll实现下拉刷新,上拉加载更多
2016/05/21 Javascript
jquery div模态窗口的简单实例
2016/05/28 Javascript
JS触摸与手势事件详解
2017/05/09 Javascript
vue axios 简单封装以及思考
2018/10/09 Javascript
JavaScript两种计时器的实例讲解
2019/01/31 Javascript
微信小程序之滑动页面隐藏和显示组件功能的实现代码
2020/06/19 Javascript
python进阶教程之异常处理
2014/08/30 Python
Python中生成器和yield语句的用法详解
2015/04/17 Python
python aiohttp的使用详解
2019/06/20 Python
centos 安装Python3 及对应的pip教程详解
2019/06/28 Python
Python 堆叠柱状图绘制方法
2019/07/29 Python
Tensorflow之梯度裁剪的实现示例
2020/03/08 Python
python3中sorted函数里cmp参数改变详解
2020/03/12 Python
给ubuntu18安装python3.7的详细教程
2020/06/08 Python
python3.9.1环境安装的方法(图文)
2021/02/02 Python
Urban Outfitters英国官网:美国平价服饰品牌
2016/11/25 全球购物
zooplus意大利:在线宠物商店
2019/08/07 全球购物
凌阳科技股份有限公司C++程序员面试题笔试题
2014/11/20 面试题
Java模拟试题
2014/11/10 面试题
煤矿班组长的职责
2013/12/25 职场文书
岳父生日宴会答谢词
2014/01/13 职场文书
个人查摆剖析材料
2014/02/04 职场文书
毕业实习评语
2014/02/10 职场文书
差生评语大全
2014/05/04 职场文书
市级优秀班主任事迹材料
2014/05/13 职场文书
公司离职证明标准样本
2014/10/05 职场文书
2015年暑期社会实践总结
2015/07/13 职场文书