微信小程序 - 内容弹出框实现(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",
    });
  },
});
相关推荐
豐儀麟阁贵1 小时前
8.6运行时异常
java·开发语言
裴嘉靖1 小时前
uniapp做的APP和安卓苹果做的什么区别
前端
申阳1 小时前
Day 20:开源个人项目时的一些注意事项
前端·后端·程序员
小年糕是糕手1 小时前
【C++】类和对象(四) -- 取地址运算符重载、构造函数plus
c语言·开发语言·数据结构·c++·算法·leetcode·蓝桥杯
天蓝色的鱼鱼1 小时前
大文件上传实战:基于Express、分片、Web Worker与压缩的完整方案
前端·node.js
橘子编程1 小时前
仓颉语言变量与表达式解析
java·linux·服务器·开发语言·数据库·python·mysql
LXS_3571 小时前
Day 15 C++之文件操作
开发语言·c++·学习方法·改行学it
500佰1 小时前
解读NotebookLM基于AI的PTT生成 程序化处理方法
前端·google·程序员
前端老宋Running1 小时前
别再给组件“打洞”了:这才是 React 组件复用的正确打开方式
前端·javascript·前端框架