H5大转盘抽奖,兼容pc端和移动端,并可配置奖品列表及指定中奖道具

1,114 阅读4分钟

前言

最近开发过程中,公司提了个需求,开发一个轮盘抽奖的活动页,没办法,咱之前也没接触过,只能现写一个,现在分享到掘金中供大家参考,需要源码的,也可以关注私信博主哦,免费分享

pc端

pc.png

pc.gif

移动端

app.png

app.gif

步骤

  1. 准备素材,大转盘背景图片、抽奖按钮图片、奖品列表图片

2.png

3.png

  1. 编写大转盘容器及样式
<div class="container">
    <!-- 大转盘 -->
    <div class="wrapper" id="wrapper">
        <div class="part2">
          <img class="part2-img" src="static/imgs/part2-bg.png" alt="" />
          <ul class="part2-list">
            <!-- js动态生成li -->
          </ul>
        </div>
        <div id="pointer" class="rotate-pointer" data-click="">
          <img
            class="rotate-pointer-img"
            src="static/imgs/pointer.png"
            alt=""
          />
        </div>
    </div>
    <!-- 大转盘 -->
</div>
/* 初始化 */
*,
*:before,
*:after {
  box-sizing: border-box;
  /* IE */
  -ms-box-sizing: border-box;
  /* 火狐 */
  -moz-box-sizing: border-box;
  /* 谷歌 */
  -webkit-box-sizing: border-box;
  /* 欧朋 */
  -o-box-sizing: border-box;
  padding: 0;
  margin: 0;
}

/* 外部容器 */
.container {
  overflow-x: hidden;
  display: flex;
  flex-direction: column;
  align-items: center;
  position: relative;
  width: 100%;
  min-height: 100vh;
  margin: auto;
}

li {
  list-style: none;
}

/* 大转盘 */
/* 大转盘容器 */
.wrapper {
  position: relative;
  z-index: 2;
  width: 61.6rem;
  height: 61.6rem;
}

/* 转盘 */
.part2 {
  position: relative;
  z-index: 2;
  width: 61.6rem;
  height: 61.6rem;
}

/*调整旋转速度和起始速率*/
.part2 {
  transition: transform 5s;
  transition-timing-function: cubic-bezier(0.42, 0, 0, 0.99);
}

/* 转盘图片 */
.part2-img {
  position: absolute;
  top: 0;
  left: 0;
  width: 61.6rem;
  height: 61.6rem;
}

/* 奖品列表 */
.part2-list {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  /* IE */
  -ms-transform: translate(-50%, -50%);
  /* 火狐 */
  -moz-transform: translate(-50%, -50%);
  /* 谷歌 */
  -webkit-transform: translate(-50%, -50%);
  /* 欧朋 */
  -o-transform: translate(-50%, -50%);
  z-index: 2;
  width: 50rem;
  height: 50rem;
  border-radius: 50%;
}

/* 奖品列表li根据奖品图片大小及文字数量细调top和left */
.part2-list > li:nth-child(1) {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  align-items: center;
  position: absolute;
  top: 6rem;
  left: 27rem;
  width: 10rem;
  height: 10rem;
  transform-origin: center center;
}
.part2-list > li:nth-child(2) {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  align-items: center;
  position: absolute;
  top: 18rem;
  left: 35rem;
  width: 10rem;
  height: 10rem;
  transform-origin: center center;
}
.part2-list > li:nth-child(3) {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  align-items: center;
  position: absolute;
  top: 30rem;
  left: 32rem;
  width: 10rem;
  height: 10rem;
  transform-origin: center center;
}
.part2-list > li:nth-child(4) {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  align-items: center;
  position: absolute;
  top: 36rem;
  left: 19rem;
  width: 10rem;
  height: 10rem;
  transform-origin: center center;
}
.part2-list > li:nth-child(5) {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  align-items: center;
  position: absolute;
  top: 29rem;
  left: 8rem;
  width: 10rem;
  height: 10rem;
  transform-origin: center center;
}
.part2-list > li:nth-child(6) {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  align-items: center;
  position: absolute;
  top: 17rem;
  left: 5rem;
  width: 10rem;
  height: 10rem;
  transform-origin: center center;
}
.part2-list > li:nth-child(7) {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  align-items: center;
  position: absolute;
  top: 6rem;
  left: 13rem;
  width: 10rem;
  height: 10rem;
  transform-origin: center center;
}
/* 奖品文案 */
.part2-list > li > span {
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  width: 20rem;
  height: 2rem;
  line-height: 2rem;
  font-size: 2rem;
  font-family: MicrosoftYaHei;
  color: #000000;
  text-align: center;
}
/* 奖品图片 */
.part2-list > li > img {
  width: 7.7rem;
  height: 7.7rem;
}

/* 抽奖按钮 */
.rotate-pointer {
  position: absolute;
  z-index: 3;
  top: calc((61.6rem / 2) - (15.6rem / 2) - (1.8rem / 2));
  left: calc(50%);
  transform: translateX(-50%);
  width: 13.8rem;
  height: 15.6rem;
}

/* 抽奖按钮图片 */
.rotate-pointer-img {
  position: absolute;
  top: 0;
  left: 0;
  width: 13.8rem;
  height: 15.6rem;
}
/* 大转盘 */

  1. 以上步骤完成后,大转盘就出现了,但是无法进行抽奖,我们需要给它添加事件,控制轮盘抽奖
<script src="static/js/jquery-3.7.1.min.js"></script>
<script>
  $(() => {
    const scale = document.documentElement.clientWidth / 75;
    document.documentElement.style.fontSize = `${scale}px`;
    
    // 获取抽奖按钮,并绑定事件
    let btn = $("#pointer");
    // 点击抽奖按钮,传递奖品id,指定抽中哪个奖品
    btn.bind("click", { id: 7 }, _begin);

    let prizeList = $(".part2-list");
    // 奖品配置列表
    let options = [
      {
        id: "1",
        name: "消化基金1元",
        url: "static/prizes/prize1.png",
        angleStart: (360 / 7) * 0 + 5,
        angleEnd: (360 / 7) * 1 - 5,
        tips: "恭喜您获得消化基金1元~~",
      },
      {
        id: "2",
        name: "消化基金10元",
        url: "static/prizes/prize2.png",
        angleStart: (360 / 7) * 1 + 5,
        angleEnd: (360 / 7) * 2 - 5,
        tips: "恭喜您获得消化基金10元~",
      },
      {
        id: "3",
        name: "消化基金50元",
        url: "static/prizes/prize3.png",
        angleStart: (360 / 7) * 2 + 5,
        angleEnd: (360 / 7) * 3 - 5,
        tips: "恭喜您获得消化基金50元~",
      },
      {
        id: "4",
        name: "消化基金100元",
        url: "static/prizes/prize4.png",
        angleStart: (360 / 7) * 3 + 5,
        angleEnd: (360 / 7) * 4 - 5,
        tips: "恭喜您获得消化基金100元~~",
      },
      {
        id: "5",
        name: "消化基金1000元",
        url: "static/prizes/prize5.png",
        angleStart: (360 / 7) * 4 + 5,
        angleEnd: (360 / 7) * 5 - 5,
        tips: "恭喜您获得消化基金1000元~",
      },
      {
        id: "6",
        name: "消化基金10000元",
        url: "static/prizes/prize6.png",
        angleStart: (360 / 7) * 5 + 5,
        angleEnd: (360 / 7) * 6 - 5,
        tips: "恭喜您获得消化基金10000元~",
      },
      {
        id: "7",
        name: "谢谢参与",
        url: "static/prizes/prize7.png",
        angleStart: (360 / 7) * 6 + 5,
        angleEnd: (360 / 7) * 7 - 5,
        tips: "很遗憾没有能中奖,再试一次吧~",
      },
    ];
    // 动态渲染奖品列表
    for (let i = 0; i < options.length; i++) {
      let liStr = `
      <li style="transform: rotate(${options[i].angleEnd - 10}deg)">
        <span>${options[i].name}</span>
        <img src="${options[i].url}" alt="" />
      </li>
      `;
      prizeList.append(liStr);
    }

    // 大转盘节流阀,防止抽奖过程中,再次点击抽奖
    let flag = true;

    // 抽奖按钮事件
    function _begin(e) {
      if (flag) {
        flag = false;

        // 奖品id
        let { id } = e.data;

        // 奖品index
        let index = null;

        // 获取奖品id对应的数组下标
        for (let i = 0; i < options.length; i++) {
          if (options[i].id == id) {
            index = i;
          }
        }

        // 和transition: transform 5s;对应,1*360等于5秒转5圈
        let base = 1800;

        let result = getRandom(
          options[index].angleStart,
          options[index].angleEnd
        );

        let deg = base - result;

        console.log("奖品名称:", options[index].name);
        console.log("奖品id:", id);
        console.log("奖品index:", index);

        // 旋转动画
        $(".part2").css({
          transition: "transform 5s",
        });
        $(".part2").css({ transform: "rotate(" + deg + "deg)" });

        // 动画结束后初始化转盘
        $(".part2").bind("transitionend", function () {
          for (let i = 0; i < options.length; i++) {
            if (
              options[i].angleStart <= result &&
              result <= options[i].angleEnd
            ) {
              //  显示中奖提示
              alert(options[i].tips);
              dzpInit();
            }
          }
        });
      }
    }

    // 获取[n,m]的随机整数
    function getRandom(n, m) {
      let num = Math.floor(Math.random() * (m - n + 1) + n);
      return num;
    }

    // 初始化大转盘
    function dzpInit() {
      $(".part2").css({
        transition: "transform 0s",
        transform: "rotate(" + 0 + "deg)",
      });
      $(".part2").unbind("transitionend");

      //  初始化后开启大转盘
      flag = true;
    }
  });

  $(window).resize(() => {
    const scale = document.documentElement.clientWidth / 75;
    document.documentElement.style.fontSize = `${scale}px`;
  });
</script>
  1. 以上一个大转盘的功能就出来啦