微信小程序 - 内容弹出框实现(Vant Weapp 实现、原生实现)

内容弹出框概述

  • 这里的内容弹出框特指:有内容区域、无标题、无确认取消按钮、有背景遮罩、点击背景遮罩可关闭的模态弹窗

一、Vant Weapp 实现

html 复制代码
<van-popup show="{{ show }}" bind:close="onClose" round>
    <view class="detail-container">
        some content
    </view>
</van-popup>
css 复制代码
.detail-container {
    box-sizing: border-box;
    width: 90vw;
    padding: 40rpx;
}
js 复制代码
Page({
  data: {
    show: false,
  },

  showDetail(event) {
    this.setData({
      show: true,
    });
  },

  onClose(event) {
    this.setData({
      show: false,
    });
  },
});
2、使用 Dialog 组件
html 复制代码
<van-dialog 
    use-slot
    show="{{ show }}"
    show-confirm-button="{{ false }}" 
    show-cancel-button="{{ false }}"
    close-on-click-overlay>

    <view class="detail-container">
        some content
    </view>

</van-dialog>
js 复制代码
Page({
  data: {
    show: false,
  },

  showDetail(event) {
    this.setData({
      show: true,
    });
  },
});
3、使用 Overlay 组件
html 复制代码
<van-overlay show="{{ show }}" bind:click="onClose">
    <view class="detail-container">
        some content
    </view>
</van-overlay>
css 复制代码
.detail-container {
    position: fixed;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    box-sizing: border-box;
    width: 90vw;
    padding: 40rpx;
    border-radius: 20rpx;
    background-color: white;
}
js 复制代码
Page({
  data: {
    show: false,
  },

  showDetail(event) {
    this.setData({
      show: true,
    });
  },

  onClose(event) {
    this.setData({
      show: false,
    });
  },
});

二、原生实现

html 复制代码
<view class="page-container">
    <button bindtap="openDialog">打开弹出框</button>
</view>
<!-- 弹出框 -->
<view class="{{ dialogStyle }}">
    <view>some content</view>
    <view>some content</view>
    <view>some content</view>
    <view>some content</view>
    <view>some content</view>
</view>
<!-- 背景遮罩 -->
<view class="{{ maskStyle }}" bindtap="closeDialog"></view>
css 复制代码
Page {
  width: 100%;
  height: 100%;

  .page-container {
    width: 100%;
    height: 100%;
    display: flex;
    justify-content: center;
    align-items: center;
    z-index: 0;
  }
}

.my-dialog {
  box-sizing: border-box;
  width: 80%;
  padding: 40rpx;
  border-radius: 10rpx;
  background-color: white;
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  z-index: 200;
}

.my-dialog-show {
  top: 50%;
}

.my-dialog-hide {
  top: 1000vh;
}

.bg-mask {
  width: 100vw;
  height: 100vh;
  background-color: rgba(0, 0, 0, 0.5);
  position: fixed;
  top: 0;
  left: 0;
  z-index: 100;
}

.bg-mask-show {
  top: 0;
}

.bg-mask-hide {
  top: 1000vh;
}
js 复制代码
Page({
  data: {
    dialogStyle: "my-dialog my-dialog-hide",
    maskStyle: "bg-mask bg-mask-hide",
  },

  openDialog() {
    this.setData({
      dialogStyle: "my-dialog my-dialog-show",
      maskStyle: "bg-mask bg-mask-show",
    });
  },

  closeDialog() {
    this.setData({
      dialogStyle: "my-dialog my-dialog-hide",
      maskStyle: "bg-mask bg-mask-hide",
    });
  },
});
相关推荐
x_x-F16 小时前
网络数据从网卡到用户态:一场基于内存所有权转移的接力赛
开发语言·网络·php
名字还没想好☜16 小时前
Java 线上内存泄漏排查实战:jmap 导堆、MAT 找 GC Roots 与四类常见泄漏
java·开发语言·jvm·内存泄漏
码匠许师傅16 小时前
【C++ 面试真题】聊聊 C++ 的多继承与虚继承
开发语言·c++·面试
kyriewen16 小时前
面试官说"打开你的AI工具"——我才发现,他考的根本不是写代码
前端·人工智能·面试
我不是疯子是傻子17 小时前
Qt CAN通信周期发送抖动?实测定时器精度校准与时间戳补偿方案
开发语言·数据库·qt
IT_陈寒17 小时前
Vue的双向绑定把我坑惨了,原来这个场景不能用
前端·人工智能·后端
hunterandroid17 小时前
[Android 从零到一] Compose LazyColumn 性能优化:key、稳定性与重组治理
android·前端
IT爱学堂17 小时前
尚硅谷 - 2025年3月Java+AI大模型应用开发
java·开发语言·人工智能
有点。17 小时前
C++认识数
开发语言·c++
lichenyang45318 小时前
从一次团队邀请开始:用 React、NestJS 与 Socket.IO 做可靠的实时通知
前端