微信小程序实现底部向上弹框

article/2025/9/21 9:03:49

本文转自

作者:smallzip
链接:https://www.jianshu.com/p/bd9a4f4b8e6a
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

效果

小程序自定义底部弹出modal框组件,仿照小程序sheet-action的效果,封装成组件直接在其他业务页面公用。

  1. 底部弹出动画使用的是小程序的animation,弹出动画可以根据自行需求去替换。
  2. modal顶部有一条短的横线,向下滑动可以触发隐藏modal
  3. 点击阴影部分可以触发隐藏modal

使用方法

  1. 在业务页面引入组件
// pages/index/index.json
{"usingComponents": {"product-cart": "../../components/product-cart/index"}
}
// pages/index/index.js
Page({data: {show: false // true:显示  false:隐藏},
showModal(){this.setData({show:true})},
)}
  1. show参数是boolean值
// pages/index/wswl
<view><button bindtap="showModal">点击</button><product-cart show="{{show}}"></product-cart>
</view>

组件源码

// pages/index/components/buy/index.js
let pageY = 0;
Component({options: {styleIsolation: 'isolated'},/*** 组件的属性列表*/properties: {show: {type: Boolean,value: false}},/*** 组件的初始数据*/data: {list: [{name: '快递',selected: 1,},{name: '自提',selected: 0}],animate: {},hideModal: false, //模态框的状态  false-隐藏  true-显示},/*** 数据监听*/observers: {'show': function(val) {if (val) {this.showModal()} else {this.hideModal()}}},/*** 组件的方法列表*/methods: {// 显示遮罩层showModal() {this.setData({hideModal: true})const animation = wx.createAnimation({duration: 500,timingFunction: 'ease',})// 先显示背景再执行动画,translateY(0)偏移量为0代表显示默认高度setTimeout(() => {animation.translateY(0).step()this.setData({animate: animation.export()})}, 50)},// 隐藏遮罩层hideModal() {const animation = wx.createAnimation({duration: 500,timingFunction: 'ease',})// 设置为100vh可以确保滚动到底部,可以按照自己的内容高度设置,能够滑到底部即可animation.translateY('100vh').step()this.setData({animate: animation.export(),})// 先执行动画,再隐藏组件setTimeout(() => {this.setData({hideModal: false})}, 300)},// 移动touchMove(e) {const clientY = e.changedTouches[0].clientYif (clientY - pageY > 0 && clientY - pageY > 50) {this.hideModal()}},// 触摸开始touchStart(e) {pageY = e.changedTouches[0].clientY;},// 选择类型changeItem(e) {const {index} = e.currentTarget.datasetthis.data.list.forEach((e, i) => {if (i == index) {e.selected = 1} else {e.selected = 0}})this.setData({list: this.data.list})},// 确认confirm() {this.hideModal()},}
})

<!--pages/index/components/buy/index.wxml-->
<view class="box" hidden="{{!hideModal}}"><view class="empty-box" bindtap="hideModal" id="empty-box"></view><scroll-view scroll-y style="max-height:80vh;"><view class="content" style="transform:translateY({{translateY}}px);" animation="{{animate}}"><!-- boll --><view class="header" bindtouchstart="touchStart" bindtouchmove="touchMove"><view></view></view><!-- 快递类型 --><view><view class="item" wx:for="{{list}}" wx:key="index" bindtap="changeItem" data-index="{{index}}"><view class="item-name">{{item.name}}</view><view><view class="item-no-selected" wx:if="{{item.selected==0}}"></view><image class="item-selected" wx:if="{{item.selected==1}}" src="/assets/images/choose.png"></image></view></view></view><!-- 按钮 --><view class="button" bindtap="confirm"><view>确认</view></view></view></scroll-view>
</view>

/* pages/index/components/buy/index.wxss */.flex {display: flex;align-items: center;
}.box {position: fixed;top: 0;left: 0;right: 0;bottom: 0;z-index: 1000;width: 100vw;height: 100vh;background: rgba(0, 0, 0, 0.5);display: flex;flex-direction: column;
}.empty-box {flex: 1;background-color: transparent;
}/* 内容视图 */.content {width: 100vw;background: rgba(255, 255, 255, 1);opacity: 1;border-radius: 20px 20px 0px 0px;z-index: 1001;
}/* 头部 */.header {position: relative;height: 80rpx;width: 100vw;
}.header > view {position: absolute;top: 26rpx;left: calc(50vw - 30rpx);width: 60rpx;height: 10rpx;background: rgba(161, 166, 175, 1);opacity: 0.6;border-radius: 6rpx;
}/* 快递 */.item {display: flex;align-items: center;justify-content: space-between;width: calc(100vw - 80rpx);padding: 0 40rpx;height: 100rpx;background: rgba(255, 255, 255, 1);opacity: 1;
}.item-no-selected {width: 36rpx;height: 36rpx;background: rgba(255, 255, 255, 1);border: 2rpx solid rgba(112, 112, 112, 1);border-radius: 50%;opacity: 0.5;
}.item-selected {width: 40rpx;height: 40rpx;
}/* 按钮 */.button {width: 100vw;padding: 80rpx 40rpx 20rpx 40rpx;
}.button >view {width: calc(100% - 80rpx);height: 98rpx;border-radius: 50rpx;line-height: 98rpx;text-align: center;font-size: 32rpx;font-family: PingFang SC;font-weight: bold;color: rgba(255, 255, 255, 1);background: rgba(237, 58, 74, 1);opacity: 1;
}



作者:smallzip
链接:https://www.jianshu.com/p/bd9a4f4b8e6a
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


http://chatgpt.dhexx.cn/article/Uauxh3Br.shtml

相关文章

uniapp微信小程序的各种弹框提示(轻提示)

您直接复制粘贴即可使用不需要做特殊的处理。 如您满意请给莫成尘点个Fabulous 1&#xff1a; 纯文字提示框 uni.showToast({title: 只有文字弹窗,icon: none, //如果要纯文本&#xff0c;不要icon&#xff0c;将值设为noneduration: 2000 //持续时间为 2秒 }) 2&…

小程序实现弹出输入框

1.微信自带组件 样式&#xff1a; wxml <view class"close" bindtap"close">拒绝</view>js Page({//拒绝close(e) {wx.showModal({editable:true,//显示输入框placeholderText:输入拒绝原因,//显示输入框提示信息success: res > {if (re…

微信小程序提示弹窗大全

wx.showToast(OBJECT) 显示消息提示框 OBJECT参数说明&#xff1a; 示例代码&#xff1a; ? 1 2 3 4 5 wx.showToast({ title: 成功 , icon: success , duration: 2000 }) wx.hideToast() 隐藏消息提示框 ? 1 2 3 4 5 6 7 8 9 wx.showToast({ title: 加载中 , icon: lo…

微信小程序 四种弹窗方式

微信小程序弹窗 一、wx.showToast(Object object)二 、wx.showModal(Object object)三、wx.showLoading(Object object)四、wx.showActionSheet(Object object)五、官方文档 一、wx.showToast(Object object) 显示消息提示框 wx.showToast({title: 内容, //提示的内容duration…

微信小程序弹出框详解

[html] view plain copy <span style"font-family:Comic Sans MS;font-size:18px;color:#333333;"><view class"container" class"zn-uploadimg"> <button type"primary"bindtap"showok">消息提示…

微信小程序几种常用弹窗提示

第一种&#xff1a;弹出提示框&#xff0c;可以选择确定或者取消。 代码&#xff1a;wx.showModal({title: 提示,content: 这是一个模态弹窗,success: function (res) {if (res.confirm) {//这里是点击了确定以后console.log(用户点击确定)} else {//这里是点击了取消以后conso…

微信小程序几种常用弹窗提示方法

1.提示文字 可以设置显示时间&#xff08;仅提示时使用&#xff09;duration设置时间 不显示icon&#xff0c;此时 title文字最多可显示两行 也可以显示icon&#xff0c;显示icon文字最多显示 7 个汉字长度 icon常用的有&#xff1a;success、error、loading wx.showToast(…

微信小程序展示弹窗的方式

微信小程序中展示弹窗有四种方式&#xff1a;wx.showToast、wx.showModal、wx.showLoading、wx.showActionSheet 具体参数可参照微信开发文档 1. wx.showToast <!-- index.wxml --> <!-- wx.showToast(消息提示框) --> <button bindtap"handleShowToast&…

微信小程序之弹出框

微信小程序中toast消息提示框只有两种显示的效果&#xff0c;就是成功和加载&#xff0c;使用wx.showToast(OBJECT)。 看下有关参数说明&#xff1a; 代码很简单&#xff1a; wx.showToast({title: 成功,icon: succes,duration: 1000,mask:true}) mask属性好像并没有起作用。有…

微信小程序弹窗

微信小程序自定义底部、顶部、中间、左边、右边弹窗 简单的微信小程序弹窗功能&#xff0c;具体实现过程&#xff0c;请浏览代码。 顶部弹出窗图例&#xff1a; 中间弹出窗图例&#xff1a; 底部弹出窗图例&#xff1a; 左边弹出窗图例&#xff1a; 右边弹出窗图例&#x…

微信小程序弹窗提示怎么写

第一种&#xff1a;弹出提示框&#xff0c;可以选择确定或者取消。 代码&#xff1a; wx.showModal({ title: 提示, content: 这是一个模态弹窗, success: function (res) { if (res.confirm) {//这里是点击了确定以后 console.log(用户点击…

微信小程序的弹窗提示

第一种&#xff1a;弹出提示框&#xff0c;用户可以选择确定或者取消&#xff0c;且都带有回调。 wx.showModal({title: 提示,content: 这是一个模态弹窗,success: function (res) {if (res.confirm) { //这里是点击了确定以后console.log(用户点击确定)} else { //这里是点击了…

CSS中水平居中、垂直居中和水平同时垂直居中

1.水平居中 2.垂直居中 3.水平并垂直居中 flex布局用到父元素上&#xff0c;绝对定位用到子元素上。

HTML/CSS:图片居中(水平居中和垂直居中)

css图片居中分css图片水平居中和垂直居中两种情况&#xff0c;有时候还需要图片同时水平垂直居中。 css图片水平居中 1.利用margin: 0 auto实现图片水平居中 利用margin: 0 auto实现图片居中就是在图片上加上css样式margin: 0 auto 如下&#xff1a; <div style"text-…

前端|如何让一个元素水平居中/垂直居中?

不知道你们是否有这样的体验&#xff0c;水平居中在前端中经常使用&#xff0c;但是&#xff01;&#xff01;&#xff01;每次一用就各种不起作用。各种justify-content,align-item,text-align,margin&#xff0c;经过种种尝试之后&#xff0c;终于能够居中了&#xff0c;但下…

微信小程序元素水平居中或垂直居中

.wxml<view class"father"> <view class"children1">子元素1</view> <view class"children2">子元素2</view> <view class"children3">子元素3</view> </view>.wxss.father{display:…

【CSS】元素居中总结-水平居中、垂直居中、水平垂直居中

【CSS】元素居中 一、 水平居中1.行内元素水平居中&#xff08;1&#xff09;text-align 2.块级元素水平居中2.1 margin&#xff08;1&#xff09;margin 2.2布局&#xff08;1&#xff09;flex justify-content&#xff08;推荐&#xff09;&#xff08;2&#xff09; flexmar…

关于照片(img)的水平居中和垂直居中

本文主要是讲述照片&#xff08;img&#xff09;的水平居中和垂直居中&#xff0c;但是其他元素的水平居中和垂直居中也可借鉴此文。 水平居中&#xff1a; 1.将img元素设置成块级元素 img {display: block;margin: 0 auto;} 2.flex布局 .box1 {width: 100px;height: 100p…

margin 实现水平居中,垂直居中

首先了解下&#xff0c;margin的auto属性的作用是用来分配剩余空间&#xff0c;所以对于有剩余空间的元素才有效哦&#xff08;块及元素&#xff09;。比如图片设置margin: 0 auto是无效的&#xff0c;因为图片是内联元素&#xff0c;不是占一整行&#xff0c;没有剩余空间。 1…

让div在屏幕中居中(水平居中+垂直居中)的几种方法

这里是修真院前端小课堂&#xff0c;本篇分析的主题是 【让div在屏幕中居中&#xff08;水平居中垂直居中&#xff09;的几种方法】 水平居中方法: 1.inline&#xff0c;inline-block元素的水平居中&#xff0c;在父级块级元素中设置text-align:center; 2.确定宽度的块级元素…