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>
相关推荐
quan26315 小时前
日常开发20251022,传统HTML表格实现图片+视频+预览
前端·javascript·html·html列表实现图片+视频
陶甜也5 小时前
ThreeJS曲线动画:打造炫酷3D路径运动
前端·vue·threejs
楊无好5 小时前
react中的受控组件与非受控组件
前端·react.js
菠萝+冰5 小时前
react虚拟滚动
前端·javascript·react.js
落一落,掉一掉5 小时前
第十三周前端加密绕过
前端
AhriProGramming5 小时前
Python学习快速上手文章推荐(持续更新)
开发语言·python·学习·1024程序员节
彩云回6 小时前
LOESS回归
人工智能·机器学习·回归·1024程序员节
高德开放平台7 小时前
实战案例|借助高德开放平台实现智慧位置服务:路线导航的开发与实践
前端·后端
老前端的功夫7 小时前
# HTTP缓存:从懵懵懂懂到了如指掌
前端