总结红包雨项目的所有代码,包括添加图片,分享按钮,红包雨,用户是否有抽奖逻辑判断

news2024/11/20 6:15:16

整体实现效果:

需要用的图片:

html:

<body>
    <div id="app">
      <!-- <div class="share-box">
        <img src="./share_box.png" alt="share-button">
      </div> -->
      <!-- img图片 -->
      <div class="gif-container">
        <img src="./WechatIMG2417.gif" alt="GIF Image">
      </div>
      
      <!-- 开启红包雨按钮 显示隐藏 点击事件 -->
      <!-- <div id="open-rain" onclick="openRain()"> -->
        <!-- <a href=""></a> -->
      <!-- </div> -->
      <mat-baselayout class="JlFf4v">
        <mat-button class="RbDQpE" onclick="openDialog('活动说明')" text="" slot="content"></mat-button>
        <mat-button class="share-box" onclick="shareDialog()" text="" slot="content"></mat-button>
        <mat-loginbutton class="UBnBBN" 登录后显示文案="当前账号:XXX" activity-id="118" slot="content"></mat-loginbutton>
        <mat-timelefttext class="RET3jo" name="timeLeft" activity-id="118" slot="content"></mat-timelefttext>
        <mat-prizebutton class="yoSTq7" text="" 我的奖品弹窗名称="我的奖品" slot="content"></mat-prizebutton>
        <mat-button class="M93ywK" onclick="openLink('https://mall.com/mall/h5/list/list.html?type=733,816,615&sortType=goodsId&channel=1022&channelSource=2024newyear')" text="" slot="content"></mat-button>
        <mat-button class="CsJSn5" onclick="openLink('https://mall.com/mall/h5/list/list.html?type=733,816,615&sortType=goodsId&channel=1022&channelSource=2024newyear')" text="去订阅" slot="content">去订阅</mat-button>
        <!-- 开启红包雨按钮 显示隐藏 点击事件 -->
        <mat-drawbutton id="open-rain" class="open-rain" text="" slot="content" 中奖后的实物弹窗名称="实物礼品" 中奖后的虚拟弹窗名称="虚拟礼品" activity-id="118"></mat-drawbutton>
        <!-- onclick="openRain()"  -->
      </mat-baselayout>
      <mat-baselayout class="k64tR1">
        <mat-showmorebutton class="j7uNhD" text="" slot="content"></mat-showmorebutton>
      </mat-baselayout>
      <mat-baselayout name="showMoreLayout" hidden="true" class="duWOMF">
        <mat-button class="GzFMQX" onclick="backTop()" text="" slot="content"></mat-button>
      </mat-baselayout>
      <mat-dialog class="qj7tuB" show="false" name="活动说明">
        <mat-baselayout class="J07uPE" slot="content">
          <mat-infobox class="Bg98z1" activity-id="118" slot="content"></mat-infobox>
          <mat-closebutton class="jOEy5L" slot="content"></mat-closebutton>
        </mat-baselayout>
      </mat-dialog>
      <!-- <mat-dialog class="qxwun1" show="false" name="虚拟礼品">
        <mat-baselayout class="MjHCv6" slot="content">
          <mat-text class="cjbrBP" text="测试奖品" slot="content">测试奖品</mat-text>
          <mat-text class="YE3zWJ" name="coupon" slot="content"></mat-text>
          <mat-copycouponbutton class="tjcJTw" text="" slot="content"></mat-copycouponbutton>
          <mat-closebutton class="abREE8" slot="content"></mat-closebutton>
        </mat-baselayout>
      </mat-dialog>
      <mat-dialog class="X5enoj" show="false" name="实物礼品">
        <mat-baselayout class="WARZqp" slot="content">
          <mat-text class="BAlE8S" text="测试奖品九阳豆浆机" slot="content">测试奖品九阳豆浆机</mat-text>
          <mat-input class="k4CSGf" placeholder="请输入" name="name" slot="content"></mat-input>
          <mat-input class="XXv1un" placeholder="请输入" name="telephone" slot="content"></mat-input>
          <mat-input class="XV4gTn" placeholder="请输入" name="address" slot="content"></mat-input>
          <mat-submitbutton class="B6TDbm" text="" slot="content"></mat-submitbutton>
          <mat-closebutton class="NNwMvl" slot="content"></mat-closebutton>
        </mat-baselayout>
      </mat-dialog> -->
      <mat-dialog class="qxwun1" show="false" name="虚拟礼品">
        <mat-baselayout class="MjHCv6" slot="content">
          <mat-text class="cjbrBP" text="测试奖品" slot="content">测试奖品</mat-text>
          <mat-text class="YE3zWJ" name="coupon" slot="content"></mat-text>
          <mat-copycouponbutton class="tjcJTw" text="" slot="content"></mat-copycouponbutton>
          <mat-closebutton class="abREE8" slot="content"></mat-closebutton>
        </mat-baselayout>
      </mat-dialog>
      <mat-dialog class="X5enoj" show="false" name="实物礼品">
        <mat-baselayout class="WARZqp" slot="content">
          <mat-text class="BAlE8S" text="测试奖品九阳豆浆机" slot="content">测试奖品九阳豆浆机</mat-text>
          <mat-input class="k4CSGf" placeholder="请输入" name="name" slot="content"></mat-input>
          <mat-input class="XXv1un" placeholder="请输入" name="telephone" slot="content"></mat-input>
          <mat-input class="XV4gTn" placeholder="请输入" name="address" slot="content"></mat-input>
          <mat-submitbutton class="B6TDbm" text="" slot="content"></mat-submitbutton>
          <mat-closebutton class="NNwMvl" slot="content"></mat-closebutton>
        </mat-baselayout>
      </mat-dialog>
      <mat-dialog class="cupjua" show="false" name="我的奖品">
        <mat-baselayout class="OoOBNz" slot="content">
          <mat-prizebox class="QXaj0p" activity-id="118" slot="content"></mat-prizebox>
          <mat-closebutton class="M0PXAA" slot="content"></mat-closebutton>
        </mat-baselayout>
      </mat-dialog>
    </div>
  </body>

js:

// 测试代码
class InfoBox extends HTMLElement {
  constructor() {
    super()
    Object.defineProperty(this, 'InfoBoxTemplate', {
      enumerable: true,
      configurable: true,
      writable: true,
      value: void 0
    })
    this.InfoBoxTemplate = `
    <template>
      <style>
        .container {
          display:block;
          width: 100%;
          height: 100%;
          position: relative;
          overflow-y: scroll;
          word-break: break-all;
          text-decoration: inherit;
        }
        p {
          margin: 0;
          padding: 0;
        }
      </style>
    
      <div class="container"></div>
    </template>`
    //采用shadow-dom
    const componentNode = createElementFromHTML(this.InfoBoxTemplate)
    this.attachShadow({ mode: 'open' }).appendChild(componentNode.content)
  }
  static get observedAttributes() {
    return ['activity-id']
  }
  async attributeChangedCallback() {
    const activityId = this.getAttribute('activity-id')
    let data
    if (activityId) {
      data = await getActivityInfo(activityId)
      this.shadowRoot.querySelector('.container').innerHTML = data.activityRules;
      console.log(data,'data')
    }
  }
  getActivityId() {
    return this.getAttribute('activity-id');
  }
}
customElements.define('mat-infobox', InfoBox)

// 从外部获取activityId的值
const infoBox = document.querySelector('mat-infobox');
const activityId = infoBox.getActivityId();
console.log(activityId);

const getData = async () =>{
  console.log('触发了getData接口')
  let resultData = await getActivityInfo(activityId);
  console.log(resultData,'resultData')
  let id = resultData.id;
  let shareImg = resultData.shareImg
  let shareSubtitle = resultData.shareSubtitle
  let shareTitle = resultData.shareTitle
  console.log(id,shareImg,shareSubtitle,shareTitle,'-')
  return {id,shareImg,shareSubtitle,shareTitle}
}

// 红包雨代码 开始
// 添加遮罩层
const addOverlay = () => {
  const overlay = document.createElement('div');
  overlay.className = 'overlay';
  overlay.style.position = 'fixed';
  overlay.style.top = '0';
  overlay.style.left = '0';
  overlay.style.width = '100%';
  overlay.style.height = '100%';
  overlay.style.backgroundColor = 'rgba(0, 0, 0, 0.5)';
  overlay.style.zIndex = '20';
  document.body.appendChild(overlay);
}

// 移除遮罩层
const removeOverlay = () => {
  const overlay = document.querySelector('.overlay');
  if (overlay) {
    overlay.remove();
  }
}

// 开启红包雨
const openRain = () => {
  console.log('点击了openRain');
  const hongbaos = Array.from({ length: 26 }); // 创建具有指定长度的数组
  
  // 获取根元素的字体大小(以像素为单位)
  const rootFontSize = parseFloat(getComputedStyle(document.documentElement).fontSize);

  // 获取 app 元素的像素宽度
  const appWidthPx = document.getElementById('app').offsetWidth;

  // 将像素宽度转换为 rem 值
  const appWidthRem = appWidthPx / rootFontSize;

  console.log(appWidthRem,'输出 app 元素的宽度(以 rem 为单位)'); // 输出 app 元素的宽度(以 rem 为单位)
  const maxLeft = appWidthRem > 0 ? appWidthRem - 3 : document.body.offsetWidth - 40;
  // 将 rem 转换为像素
  const maxLeftPx = maxLeft * rootFontSize;
  console.log(maxLeftPx,'maxLeftPx')
  console.log(maxLeft,'maxLeft')

  // 添加遮罩层
  addOverlay();

  // 创建容器元素
  const container = document.createElement('div');
  container.className = 'container';

  for (let i = 0; i < hongbaos.length; i++) {
    const img = document.createElement('img');
    img.src = './hongbao.png';
    img.className = 'img';
    img.style.left = `${Math.random() * maxLeftPx}px`;
    img.style.animationDuration = `${Math.random() * 2 + 2}s`;
    img.style.animationDelay = `${i * 0.1}s`; // 设置不同的延迟时间
    container.appendChild(img);
  }

  // 在项目body节点上挂载container红包雨
  document.body.appendChild(container);

  // 设置定时器,在四秒后移除红包雨和遮罩层
  // setTimeout(() => {
  //   removeOverlay();
  //   container.remove();
  // }, 4000);
}




const closeRain = () => {
  console.log('关闭红包雨')
  removeOverlay();
  let container = document.getElementsByClassName('container')[0];
  container.remove();
}
// 红包雨代码 结束





// 分享按钮
const shareDialog = async () => {
  console.log('点击了分享按钮')

  if (isInGenerated()) {
    if (!checkLogin()) {
      login()
      return
    }
    // 判断是不是公司app
    if (getCookie('appType')) {
      // const {shareImg,shareSubtitle,shareTitle} = await getData()
      const res = await getData()
      const {id,shareImg,shareSubtitle,shareTitle} = res
      console.log(id,shareImg,shareSubtitle,shareTitle,'id,shareImg,shareSubtitle,shareTitle')
      
      // let shareImgString = encodeURIComponent(shareImg)
      // let string = `{\"id\":\"118\",\"title\":\"${shareTitle}\",\"articleTag\":\"#a6\",\"articleAbstract\":\"${shareSubtitle}\",\"share_type\":\"7\",\"url\":\"https:\/\/companies.com\/2022-10-24\/101955017.html\",\"picture_url\":\"${shareImgString}\"}`
      // // console.log(string,'string')
      // cai.showNativeShare(string)
      // cai.shareWebContent()
      // const imgUrl = "https://fd.com/group1/M00/00/15/rBtmH2WuErCAF831AABxPiPUuc0518.jpg";
      // const modifiedUrl = imgUrl.replace(/\//g, "\\");

      // 输出修改后的URL
      // console.log(modifiedUrl);

      
      
      // let string = `{\"id\":\"118\",\"title\":\"${shareTitle}\",\"articleTag\":\"#a6\",\"articleAbstract\":\"${shareSubtitle}\",\"share_type\":\"7\",\"url\":\"https:\/\/companies.com\/2022-10-24\/101955017.html\"}`
      // // console.log(string,'string')
      // cai.showNativeShare(string)
      // cai.shareWebContent()


      // let title = JSON.stringify(shareTitle)
      // let newTitle = "\"" + title + "\"";
      // console.log(title,'title')
      // console.log(newTitle,'newTitle')
      // let string = `{\"id\":\"467064\",\"title\":${newTitle},\"articleTag\":\"#a6\",\"articleAbstract\":\"价格确实超出一般旅客的承受能力\",\"share_type\":\"1\",\"url\":\"https:\/\/companies.com\/2022-10-24\/101955017.html\"}`
      // cai.showNativeShare(string)
      // cai.shareWebContent()
      console.log(id,'id')
      
      let title = JSON.stringify(shareTitle)
      console.log(title,'title')
      
      let newTitle = "\"" + title + "\"";
      console.log(newTitle,'newTitle')
      
      let lastTitle = title.replace(/"/g, '');
      console.log(lastTitle,'lastTitle'); // 输出: title




      let subtitle = JSON.stringify(shareSubtitle)
      console.log(subtitle,'subtitle');

      let lastSubtitle = subtitle.replace(/"/g, '');
      console.log(lastSubtitle,'lastSubtitle'); //摘要最后版本




      let img = JSON.stringify(shareImg)
      console.log(img,'img');
      let lastImg = img.replace(/"/g, '');
      console.log(lastImg,'lastImg'); //url
      
      let string = `{\"id\":\"${id}\",\"title\":\"${lastTitle}\",\"articleTag\":\"#a6\",\"articleAbstract\":\"${lastSubtitle}\",\"share_type\":\"7\",\"url\":\"https:\/\/huodong.com\/market\/activity\/2024_CNYear\",\"pic_url\":\"${lastImg}\"}`
      console.log(string,'string')
      cai.showNativeShare(string)
      cai.shareWebContent()
    } else {
      // console.log(this.data,'this.data?')
      addPopup()
      setTimeout(() => {
        removePopup()
      }, 3000);
    }
  }
}

const addPopup = () => {
  console.log('触发了添加popup遮罩层')
  // 遮罩层添加
  const popup = document.createElement('div');
  popup.className = 'popup';
  popup.style.position = 'fixed';
  popup.style.top = '0';
  popup.style.left = '0';
  popup.style.width = '100%';
  popup.style.height = '100%';
  popup.style.backgroundColor = 'rgba(0, 0, 0, 0.5)';
  popup.style.zIndex = '20';
  document.body.appendChild(popup);
  // 遮罩层下面的img添加
  var shareDiv = document.createElement("div");
  // 设置div元素的class属性
  shareDiv.className = "share-img";

  // 创建一个img元素
  var img = document.createElement("img");

  // 设置img元素的src和alt属性
  img.src = "./pic_share-new.png";
  img.alt = "";

  // 将img元素添加到div元素中
  shareDiv.appendChild(img);

  // 创建文案p标签
  var p = document.createElement("p");

  // 给p标签添加文案
  p.textContent = '点击分享'

  // 将文案添加到DOM中的元素上面share-img
  shareDiv.appendChild(p);
  // 将div元素添加到DOM中的某个元素中
  popup.appendChild(shareDiv);

}
// 移除遮罩层
const removePopup = () => {
  const popup = document.querySelector('.popup');
  if (popup) {
    popup.remove();
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1417116.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

必应聊天在当前安全搜索设置下不可用

使用Bing必应搜索引擎&#xff0c;想用必应AI聊天功能会提示&#xff1a;必应聊天在当前安全搜索设置下不可用。 当安全搜索设置设置为“严格”时&#xff0c;不支持必应聊天。 那么怎么修改安全搜索设置呢&#xff1f; 点击右上角的菜单图标&#xff0c;在下拉菜单里点击安全…

【Qt】跨平台UI布局,以Windows + Android安卓为例

文章目录 使用Qt Designer直接拖放Label结合Horizontal Layout Horizontal Spacer 使用纯代码如何改用纯代码方式布局为不同平台设置不同文字 Qt适合跨平台开发&#xff0c;但跨平台时如何实现UI布局这种基础只是都鲜有人提及。当然也有可能是太基础&#xff0c;大家觉得没有提…

移动Web——平面转换-多重转换

1、平面转换-多重转换 多重转换技巧&#xff1a;先平移再旋转 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name&qu…

【Linux】第三十八站:信号处理

文章目录 一、信号处理二、再谈进程地址空间三、内核如何实现信号的捕捉四、sigaction 一、信号处理 我们知道&#xff0c;信号保存以后&#xff0c;会在合适的时候进行处理这个信号。 那么信号是如何被处理的&#xff1f;什么时候进行处理呢&#xff1f; 当我们的进程从内核…

数据结构三:线性表之单链表(带头结点单向)的设计与实现

线性表的链式存储结构正是所谓的单链表&#xff0c;何谓单链表&#xff1f;通过地址将每一个数据元素串起来&#xff0c;进行使用&#xff0c;这可以弥补顺序表在进行任意位置的插入和删除需要进行大量的数据元素移动的缺点&#xff0c;只需要修改指针的指向即可&#xff1b;单…

git配置用户名和邮箱

1.git 1.配置用户名和邮箱 2.git初体验 git init 初始化git仓库 管理项目让git管理你的本次代码变更 git add .git commit -m “你完成的功能” 后续如果新增/修改/删除代码&#xff0c; 完成新功能时 重复2 3.查看日志 1.git log 4.版本回退 1.查看提交的版本记录 git l…

扭蛋机小程序开发:探索用户体验与商业价值的融合

一、引言 随着移动互联网的快速发展&#xff0c;小程序作为一种新型的应用形态&#xff0c;正逐渐改变着人们的生活方式。扭蛋机小程序便是其中一例&#xff0c;它结合了线上线下的互动体验&#xff0c;为用户带来了全新的娱乐方式。本文将探讨扭蛋机小程序的开发过程&#xf…

遇到字符串拼接用它就对啦!什么你居然不知道Java中对象作为方法参数和基本数据类型作为参数的区别?有巨坑!

今天刷代码随想录&#xff0c;在使用字符串拼接时&#xff0c;发现String类确实比StringBuilder慢了不是&#xff0c;总结了StringBuilder类&#xff08;详见下面文章内容&#xff0c;点击可跳转&#xff09;&#xff0c;还有在做后两题时&#xff0c;发现了Java中集合作为参数…

二刷代码随想录|Java版|回溯算法1|回溯基础理论+组合问题

理论 写链表之类的真的很痛苦&#xff0c;赶紧跳到回溯&#xff01;这次我想结合算法设计这本书&#xff0c;把java版写出来。放在第三部分吧。希望能够在研一完成这项工作&#xff01; 从一刷总结以下的几个要点&#xff1a; 回溯方法模板性非常强&#xff01;&#xff01;可…

redis报错:WRONGTYPE Operation against a key holding the wrong kind of value

这个是在redis存取的数据时&#xff0c;存数据时的数据类型和取数据时的数据类型不一致导致的 原因分析 首先需要明白的是&#xff0c;出现这种错误的原因是因为我们在取值的时候&#xff0c;使用的命令不对&#xff0c;比如你用获取string类型的get命令去取列表list类…

前端工程化之上cdn

一、cdn介绍 cdn的使用还是和前端打包相关&#xff0c;我们都希望前端最后的打包页面越小越好。那么可不可以把一些包不pack进去&#xff0c;让用户的流浪器自行下载呢&#xff1f;答案是可以的&#xff0c;那这些包就会被托管到分发站点上&#xff0c;就是在全国都有服务器&a…

Vue3探索编辑部——关于Pinia(1)

目录 什么是Pinia&#xff1f; Vue3中的Pinia 创建项目 数据准备和引入Pinia 使用Pinia 采用action修改数据 总结 什么是Pinia&#xff1f; Pinia是Vue3的专属的状态管理工具&#xff0c;什么是状态呢&#xff1f;其实我们可以把状态理解为数据&#xff0c;或者一个业务…

(七)for循环控制

文章目录 用法while的用法for的用法两者之间的联系可以相互等价用for改写while示例for和while的死循环怎么写for循环见怪不怪表达式1省略第一.三个表达式省略&#xff08;for 改 while&#xff09;全省略即死循环&#xff08;上面已介绍&#xff09; 用法 类比学习while语句 …

Linux:命名管道及其实现原理

文章目录 命名管道指令级命名管道代码级命名管道 本篇要引入的内容是命名管道 命名管道 前面的总结中已经搞定了匿名管道&#xff0c;但是匿名管道有一个很严重的问题&#xff0c;它只允许具有血缘关系的进程进行通信&#xff0c;那如果是两个不相关的进程进行通信&#xff0…

C#,计算几何,二维贝塞尔拟合曲线(Bézier Curve)参数点的计算代码

Pierre Bzier Bzier 算法用于曲线的拟合与插值。 插值是一个或一组函数计算的数值完全经过给定的点。 拟合是一个或一组函数计算的数值尽量路过给定的点。 这里给出 二维 Bzier 曲线拟合的参数点计算代码。 区别于另外一种读音接近的贝塞耳插值算法&#xff08;Bessels int…

市场复盘总结 20240123

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票&#xff0c;只有10%的时间是可以操作&#xff0c;90%的时候都应该空仓 昨日主题投资 连板进级率 7/1…

前端实现转盘抽奖 - 使用 lucky-canvas 插件

目录 需求背景需求实现实现过程图片示意实现代码 页面效果lucky-canvas 插件官方文档 需求背景 要求实现转盘转动抽奖的功能&#xff1a; 只有正确率大于等于 80% 才可以进行抽奖&#xff1b;“谢谢参与”概率为 90%&#xff0c;“恭喜中奖”概率为 10%&#xff1b; 需求实现 实…

鸿蒙入门学习的一些总结

前言 刚开始接触鸿蒙是从2023年开始的&#xff0c;当时公司在调研鸿蒙开发板能否在实际项目中使用。我们当时使用的是OpenHarmony的&#xff0c;基于DAYU/rk3568开发板&#xff0c;最开始系统是3.2的&#xff0c;API最高是API9&#xff0c;DevecoStudio 版本3.1的。 鸿…

国考省考行测:分析推理,形式逻辑,所有有的分析

国考省考行测&#xff1a; 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能&#xff0c;附带行测和申论&#xff0c;而常规国考省考最重要的还是申论和行测&#xff0c;所以大家认真准备吧&#xff0c;我讲一起屡屡申论和行测的重要知识点 遇到寒冬&am…

2024三掌柜赠书活动第七期:一本书读懂AIGC:探索AI商业化新时代

目录 前言AI商业化的背景和挑战关于《一本书读懂AIGC&#xff1a;探索AI商业化新时代》编辑推荐内容简介作者简介图书目录书中前言/序言《一本书读懂AIGC&#xff1a;探索AI商业化新时代》全书速览结束语 前言 不用多讲&#xff0c;想必大家也都知道&#xff0c;人工智能在过…