原生JS实现抽奖

文章介绍了如何使用HTML、CSS和JavaScript实现一个转盘活动的布局,包括转盘旋转效果、适配手机屏幕、动画流畅性和表单的延迟显示。作者分享了两种解决方案并邀请读者提出批评和优化建议。
摘要由CSDN通过智能技术生成

1、效果展示 

    0. 制作一个MiniSize使用提供的素材实现一个转盘活动的布局(如下图所示);

  1. 进入界面后2秒钟后开始旋转,5秒钟后停止旋转;
  2. 并且3秒后进入一个表单界面(如下图2所示);
  3. 界面要求适配现主流的手机屏幕及手机浏览器;
  4. 要求界面切换连贯,动画流畅
  5. 请保证视觉效果的还原度以及代码整洁度

2、实现思路

  • 旋转圆盘,image1.style.animation = 'rotateAnimation 0.5s linear 10',来实现旋转
  • await阻塞进入表单的任务加入微任务队列,使得表盘先旋转玩了之后再跳转到表单页面
  • 进入表单界面,设置定时器为8s(5+3)包含了旋转转盘的时间旋转之后等待时间。

这些完全都是自己设计的,哪里有错误和需要优化的欢迎批评指正,大家一起学习交流谢谢。

  • 一个小伙伴的建议:停止旋转单独写出来,所以下面有一个方案二 

3、参考代码

  • 方案一

<!DOCTYPE html>
<html>
  <head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=0.8">
  <title>转盘活动</title>
  <style>
    /* 在这里添加 CSS 样式 */
    /* 手机屏幕适配 */
    @media (max-width: 599px) {
    .container  {
      padding: 10px;
    }
    }
    #app {
    /* 容器元素的样式和布局 */
        display: flex;
        justify-content: center;
        align-items: center; /* 水平居中 */  
        align-content: center; /* 垂直居中 */  
        height: 100vh;
        margin: 0;
        color: #666666;
    }
    .image1 {
        position: absolute;
    }

    .image2 {
        position: relative;
    }


    .form {
    /* 表单界面样式 */
            margin-top: 10px;
            font-size: 16px; /* 设置字体大小 */
            /* border: 1px solid #ccc; */
            /* padding: 20px; */
            border-radius: 5px;
            height: 80%;
            width: 80%; /* 限制表单宽度 */
    }
     /* 背景颜色 */
    body {
        background-color: #E7E7E7;
    }

    /* 按钮样式 */
    .button {
        margin-top: 3px;
        width: 92%;
        background-color: #F03D3C;
        color: #FFFFFF;
        border: none;
        padding: 10px 20px;
        border-radius: 5px;
        cursor: pointer;
    }
    input{
        margin-top: 5px;
        padding: 10px 20px;
        border-radius: 5px;
        cursor: pointer;
        width: 80%;
        

    }
    select{
        margin-top: 5px;
        padding: 10px 20px;
        border-radius: 5px;
        cursor: pointer;
        width: 92%;
        

    }

    /* 边框样式 */
    .border {
        border: 1px solid #E5E5E5;
        padding: 10px;
    }

     

    @keyframes rotateAnimation {  
        from {  
          transform: rotate(0deg);  
        }  
        to {  
          transform: rotate(360deg);  
        }  
    }
  </style>
  </head>
  <body>
  <div id="app">
    <div class="turntable">
    <!-- 转盘活动的内容 -->
    <img class="image1" src="images/loto-p.png" alt="">
    <img class="image2" src="images/loto-z.png" alt="">
    
    </div>
    <div class="form" style="display: none; ">
        <form id="personalInfoForm">
            <label for="name">收货人姓名</label><br>
            <input type="text" placeholder="收货人姓名" id="name" name="name" required><br>

            <label for="email">手机号码</label><br>
            <input type="tel"  placeholder="请输入您的手机号码" id="tel" name="tel" required><br>

            <label for="age">手机验证码</label><br>
            <input type="number"  placeholder="手机验证码" id="age" style="width: 35%;" name="age" required>
            <input type="submit"  class="button" style="margin-left:2px;width: 44%;" value="获取验证码"><br>

            <label for="address">选择地区</label><br>
            <!-- <input type="text"  placeholder="省份"  id="age" name="age" required><br> -->
            <!-- <input type="text"  placeholder="城市"  id="age" name="age" required><br> -->
            <select id="province" name="province">  
              <option value="">省份</option>  
              <option value="省份1">省份1</option>  
              <option value="省份2">省份2</option>  
              <option value="省份3">省份3</option>  
            </select> 
            <select id="city" name="city">  
              <option value="">城市</option>  
              <option value="城市1">城市1</option>  
              <option value="城市2">城市2</option>  
              <option value="城市3">城市3</option>  
            </select>  
            <br>

            <label for="address">详细地址</label><br>
            <input type="text"  placeholder="例如XX街道XX号" id="email" name="email" required><br>

            <input type="submit"  class="button" value="提交">
        </form>
    </div>
  </div>

  <script>
    var image1 = document.querySelector('.image1');
    var image2 = document.querySelector('.image2');
    var form = document.querySelector('.form');
    var angle = 0;  
    // 页面加载事件
    window.addEventListener('load', async function() {
        // 延迟 2 秒开始旋转5s
        await startRotation()
        // 3 秒后显示表单界面
        showForm()  
    });

    function startRotation() {
         // 启动旋转动画的逻辑
      return new Promise(resolve => 
        setTimeout(()=>{
            image1.style.animation = 'rotateAnimation 0.5s linear 10'
            resolve(); 
        }
      , 2000))
    }

    function showForm() {
          // 显示表单界面的逻辑
      new Promise(resolve => 
          setTimeout(()=>{ 
            image1.style.display = 'none';
            image2.style.display = 'none';
            form.style.display = 'block';
            resolve(); 
          }
      , 8000)); 
    }
    
  </script>
  </body>
</html>
  • 方案二
<!DOCTYPE html>
<html>
  <head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=0.8">
  <title>转盘活动</title>
  <style>
    /* 在这里添加 CSS 样式 */
    /* 手机屏幕适配 */
    @media (max-width: 599px) {
    .container  {
      padding: 10px;
    }
    }
    #app {
    /* 容器元素的样式和布局 */
        display: flex;
        justify-content: center;
        align-items: center; /* 水平居中 */  
        align-content: center; /* 垂直居中 */  
        height: 100vh;
        margin: 0;
        color: #666666;
    }
    .image1 {
        position: absolute;
    }

    .image2 {
        position: relative;
    }


    .form {
    /* 表单界面样式 */
            margin-top: 10px;
            font-size: 16px; /* 设置字体大小 */
            /* border: 1px solid #ccc; */
            /* padding: 20px; */
            border-radius: 5px;
            height: 80%;
            width: 80%; /* 限制表单宽度 */
    }
     /* 背景颜色 */
    body {
        background-color: #E7E7E7;
    }

    /* 按钮样式 */
    .button {
        margin-top: 3px;
        width: 92%;
        background-color: #F03D3C;
        color: #FFFFFF;
        border: none;
        padding: 10px 20px;
        border-radius: 5px;
        cursor: pointer;
    }
    input{
        margin-top: 5px;
        padding: 10px 20px;
        border-radius: 5px;
        cursor: pointer;
        width: 80%;
        

    }
    select{
        margin-top: 5px;
        padding: 10px 20px;
        border-radius: 5px;
        cursor: pointer;
        width: 92%;
        

    }

    /* 边框样式 */
    .border {
        border: 1px solid #E5E5E5;
        padding: 10px;
    }

     

    @keyframes rotateAnimation {  
        from {  
          transform: rotate(0deg);  
        }  
        to {  
          transform: rotate(360deg);  
        }  
    }
  </style>
  </head>
  <body>
  <div id="app">
    <div class="turntable">
    <!-- 转盘活动的内容 -->
    <img class="image1" src="images/loto-p.png" alt="">
    <img class="image2" src="images/loto-z.png" alt="">
    
    </div>
    <div class="form" style="display: none; ">
        <form id="personalInfoForm">
            <label for="name">收货人姓名</label><br>
            <input type="text" placeholder="收货人姓名" id="name" name="name" required><br>

            <label for="email">手机号码</label><br>
            <input type="tel"  placeholder="请输入您的手机号码" id="tel" name="tel" required><br>

            <label for="age">手机验证码</label><br>
            <input type="number"  placeholder="手机验证码" id="age" style="width: 35%;" name="age" required>
            <input type="submit"  class="button" style="margin-left:2px;width: 44%;" value="获取验证码"><br>

            <label for="address">选择地区</label><br>
            <!-- <input type="text"  placeholder="省份"  id="age" name="age" required><br> -->
            <!-- <input type="text"  placeholder="城市"  id="age" name="age" required><br> -->
            <select id="province" name="province">  
              <option value="">省份</option>  
              <option value="省份1">省份1</option>  
              <option value="省份2">省份2</option>  
              <option value="省份3">省份3</option>  
            </select> 
            <select id="city" name="city">  
              <option value="">城市</option>  
              <option value="城市1">城市1</option>  
              <option value="城市2">城市2</option>  
              <option value="城市3">城市3</option>  
            </select>  
            <br>

            <label for="address">详细地址</label><br>
            <input type="text"  placeholder="例如XX街道XX号" id="email" name="email" required><br>

            <input type="submit"  class="button" value="提交">
        </form>
    </div>
  </div>

  <script>
    var image1 = document.querySelector('.image1');
    var image2 = document.querySelector('.image2');
    var form = document.querySelector('.form');
    
    // 页面加载事件
    window.addEventListener('load', async function() {
        // 1、延迟 2 秒开始旋转5s
        await startRotation()
        // 2、停止旋转
        await stopRotation()
        // 3、3 秒后显示表单界面
        showForm()  
    });

    function startRotation() {
         // 启动旋转动画的逻辑
      return new Promise(resolve => 
        setTimeout(()=>{
            image1.style.animation = 'rotateAnimation 0.5s linear 20'
            resolve(); 
        }
      , 2000))
    }
    function stopRotation() {
         // 启动旋转动画的逻辑
      return new Promise(resolve => 
        setTimeout(()=>{
            image1.style.animation = 'none'
            resolve(); 
        }
      , 5000))
    }

    function showForm() {
       
          // 显示表单界面的逻辑
      new Promise(resolve => 
          setTimeout(()=>{ 
            image1.style.display = 'none';
            image2.style.display = 'none';
            form.style.display = 'block';
            resolve(); 
          }
      , 3000)); 
    }
    
  </script>
  </body>
</html>

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
three.js是一种用于在网页上创建交互式3D图形的JavaScript库。它提供了强大的工具和功能,可以轻松地创建各种类型的动画效果,包括抽奖动画。 在使用three.js创建抽奖动画时,我们可以首先定义一个3D场景,然后添加一个或多个3D模型作为奖品。这些奖品可以是任何你想要的对象,如球体、立方体或者自定义模型。 接下来,我们可以使用three.js动画功能来实现奖品的旋转和移动效果。通过对模型的位置、旋转和缩放进行逐帧更新,可以创建出流畅的动画效果。 为了实现抽奖的效果,我们可以在画面中添加一个按钮或者其他交互元素,当用户点击时触发抽奖过程。抽奖过程可以是随机的或者根据特定规则进行。当抽奖开始时,奖品开始旋转和移动,直到最终停止在一个特定的位置,表示中奖。 为了增加动画的趣味性,我们还可以添加一些特效,如粒子效果、光照效果或者烟雾效果等。这些特效可以通过three.js提供的材质和光源功能以及第三方库来实现。 最后,我们还可以通过three.js的相机和控制器来实现用户与动画的交互。用户可以通过鼠标或者触摸屏来旋转和缩放场景,以及点击控制按钮进行抽奖操作。 通过使用three.js,我们可以轻松地创建出生动、富有创意的抽奖动画,并且可以在各种类型的平台上运行,包括桌面、移动设备和虚拟现实设备等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值