uni-app 广告弹窗最佳实践:不扰民、可控制频次、含完整源码

需求背景

在很多移动端应用中,广告弹窗是常见的变现手段。但频繁弹出、无法关闭、重复打扰的广告往往会适得其反,导致用户流失。

本文将带你用 uni-app 实现一个**"智能不扰民"的广告弹窗组件,支持 24小时只弹一次**、点击跳转优雅关闭,可直接复制使用。

效果预览

功能亮点

  • 24小时内只弹一次,避免骚扰
  • 点击蒙层或关闭按钮均可关闭
  • 图片点击支持跳转活动页
  • 不依赖第三方库,开箱即用

核心思路拆解

模板
  • .ad-mask 作为半透明遮罩层,点击可关闭广告
  • .ad-container 包含广告图片和关闭按钮
  • .ad-image 显示广告图片,点击可跳转
  • .ad-close-btn 提供关闭按钮
样式
  • .ad-mask: 遮罩层样式,居中显示内容
  • .ad-container: 广告容器尺寸和定位
  • .ad-image: 图片自适应显示
  • .ad-close-btn: 关闭按钮样式,圆形设计
逻辑部分
  • visible 驱动渲染:控制广告显示状态。
  • 事件冒泡"双保险":蒙层绑定 @click="closeAd",内部容器加 @click.stop 阻止冒泡。
  • 频次控制:利用 uni.setStorageSync('lastAdTime', Date.now()) 记录本次弹出时间,下次 onLoad 时对比 24 h 间隔,不到时间绝不骚扰。

使用建议

  • 广告图建议尺寸:600x800rpx,体积 < 100KB
  • 弹窗频率可升级为后端控制,避免前端被篡改
  • 可扩展 uni.request 动态获取广告图和跳转链接
  • 若需支持"不再提示",可新增 uni.setStorageSync('neverShowAd', true)

完整代码

下载地址:https://download.csdn.net/download/cfxiaoding/92191663

html 复制代码
<template>
  <view class="content">
    <!-- 其他元素 -->
    <!-- 广告弹窗 -->
    <view v-if="visible" class="ad-mask" @click="closeAd">
      <view class="ad-container" @click.stop>
        <image class="ad-image" :src="adImage" mode="aspectFit" @click="onAdClick" />
        <view class="ad-close-btn" @click="closeAd">✕</view>
      </view>
    </view>
  </view>
</template>

<script>
export default {
  data() {
    return {
      visible: false,
      adImage: '/static/ad.png',
      adLink: '/pages/activity/index'
    }
  },
  onLoad() {
    const last = uni.getStorageSync('lastAdTime');
    const now = Date.now();
    const oneDay = 24 * 60 * 60 * 1000;

    if (!last || now - last > oneDay) {
      this.showAd()
    }
  },
  methods: {
    showAd() {
      this.visible = true;
    },
    closeAd() {
      this.visible = false;
      uni.setStorageSync('lastAdTime', Date.now());
    },
    onAdClick() {
      uni.navigateTo({ url: this.adLink });
      this.closeAd();
    }
  }
}
</script>

<style>
.ad-mask {
  position: fixed;
  inset: 0;
  background: rgba(0, 0, 0, 0.6);
  display: flex;
  justify-content: center;
  align-items: center;
  z-index: 9999;
}
.ad-container {
  position: relative;
  width: 600rpx;
  height: 800rpx;
}
.ad-image {
  width: 100%;
  height: 100%;
  border-radius: 16rpx;
}
.ad-close-btn {
  position: absolute;
  top: 16rpx;
  right: 16rpx;
  color: #fff;
  font-size: 36rpx;
  background: rgba(0, 0, 0, 0.5);
  border-radius: 50%;
  width: 60rpx;
  height: 60rpx;
  line-height: 60rpx;
  text-align: center;
}
</style>
相关推荐
Mh几秒前
如何优雅的消除“if...else...”
前端·javascript
火鸟212 分钟前
给予虚拟成像台尝鲜版十之二,完善支持 HTML 原型模式
前端·html·原型模式·通用代码生成器·给予虚拟成像台·快速原型·rust语言
逍遥江湖33 分钟前
Vue3 + TypeScript 项目框架搭建指南
前端
lapiii35835 分钟前
[前端-React] Hook
前端·javascript·react.js
QuantumLeap丶40 分钟前
《uni-app跨平台开发完全指南》- 07 - 数据绑定与事件处理
vue.js·ios·uni-app
白龙马云行技术团队42 分钟前
前端自适应动态架构图演进
前端
一枚前端小能手1 小时前
🎬 使用 Web 动画 API - 关键帧与交互控制实战指南
前端·javascript·api
西西学代码1 小时前
Flutter---异步编程
开发语言·前端·javascript
拉不动的猪1 小时前
CSS 像素≠物理像素:0.5px 效果的核心密码是什么?
前端·css·面试
前端市界1 小时前
Copilot新模型GPT-5.1太强了!自动生成完美Axios封装,同事都看傻了
前端·前端框架·github