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

发布时间 - 2026-01-11 02:49:03    点击率:

由于官方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值要注意。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# 微信小程序模态对话框  # 微信小程序对话框  # 微信小程序自定义底部弹出框  # JS中微信小程序自定义底部弹出框  # 微信小程序 自定义消息提示框  # 微信小程序自定义对话框弹出和隐藏动画  # 微信小程序开发之实现自定义Toast弹框  # 微信小程序 自定义对话框实例详解  # 如何自定义微信小程序tabbar上边框的颜色  # 微信小程序自定义select下拉选项框组件的实现代码  # 微信小程序 自定义复选框实现代码实例  # 微信小程序实现自定义动画弹框/提示框的方法实例  # 对话框  # 自定义  # 模态  # 还可以  # 弹出  # 绑定  # 是一个  # 我想  # 有个  # 要注意  # 请输入  # 找你  # 不被  # 这是个  # 会来  # 大家多多  # 有一个  # 主要是  # 实现了  # 最上层 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  C++时间戳转换成日期时间的步骤和示例代码  零服务器AI建站解决方案:快速部署与云端平台低成本实践  Laravel如何实现本地化和多语言支持?(i18n教程)  如何在IIS中新建站点并配置端口与IP地址?  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  Laravel如何实现用户注册和登录?(Auth脚手架指南)  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  如何在Tomcat中配置并部署网站项目?  JavaScript如何实现音频处理_Web Audio API如何工作?  零基础网站服务器架设实战:轻量应用与域名解析配置指南  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  如何快速选择适合个人网站的云服务器配置?  js实现获取鼠标当前的位置  网站页面设计需要考虑到这些问题  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  原生JS实现图片轮播切换效果  Python面向对象测试方法_mock解析【教程】  香港服务器租用每月最低只需15元?  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  Android使用GridView实现日历的简单功能  IOS倒计时设置UIButton标题title的抖动问题  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  利用python获取某年中每个月的第一天和最后一天  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  香港服务器网站推广:SEO优化与外贸独立站搭建策略  历史网站制作软件,华为如何找回被删除的网站?  JavaScript如何实现类型判断_typeof和instanceof有什么区别  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  EditPlus中的正则表达式 实战(1)  bootstrap日历插件datetimepicker使用方法  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  如何在阿里云购买域名并搭建网站?  Android自定义控件实现温度旋转按钮效果  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  JavaScript如何实现错误处理_try...catch如何捕获异常?  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  制作旅游网站html,怎样注册旅游网站?  javascript读取文本节点方法小结