微信小程序 - 内容弹出框实现(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",
    });
  },
});
相关推荐
L-影5 小时前
Pydantic 模型:为你的 Web 数据装上“安检系统”
前端
Reload.5 小时前
GJ航司,验证码网易易盾 JS逆向 纯算轨迹
开发语言·前端·javascript
L-影5 小时前
FastAPI 请求头与 Cookie:Web 世界的“身份证”与“通行证”
前端·fastapi
IT_陈寒6 小时前
Vue的响应式更新把我坑惨了,原来是这个原因
前端·人工智能·后端
铁皮饭盒6 小时前
Bun.js 集成了 SQL/Redis/S3,为什么 Java/Go/Python 不集成?
javascript
人道领域6 小时前
【LeetCode刷题日记】贪心算法理论与实战:455.分发饼干最优解
java·开发语言·数据结构·算法·leetcode·贪心算法
年轻的砖头6 小时前
以Ajax方式提交整个表单
前端·javascript·ajax
xin_yao_xin6 小时前
Conda 环境的 CUDA PATH 配置指南
开发语言·python·conda·cuda
he___H6 小时前
基于LCEL的联想
开发语言·python·langchain