草庐IT

html+css+js实现带有转盘的抽奖小程序

极客李华 2023-07-11 原文

html+css+js实现带有转盘的抽奖小程序

简介:html+css+js实现带有转盘的抽奖小程序。

效果展示

抽奖方式

飞镖
飞镖制作成飞机的模样,没人的号码用黄色标签做成云朵模样黏贴在背景板上,年会背景板缓缓移动,飞扎中的名字得奖寓意飞黄腾达。

福利彩票机
年会入场嘉宾人手一张自制。

可以哒云抽奖
创建抽奖活动后,扫描活动二维码,推广二维码,最后在拿出手机抽奖。

转盘抽奖
数字,转动三次构成一组百位数,号码对应者获奖。随着号码的逐一产生,现场配合音响效果能创造出激动人心的效果。

摘红包
把个人的电话号码写于纸上放在红包里,年会上领导随机摘取一个,然后打电话给获奖人。悬念十足,气氛紧张。

捞金
由年会上领导在箱子里放入一定数额的大额人民币,其余人用一元的纸币写上自己的名字或号码,放多少个人而定,放越多机会越多。(主持强调,付出越多收获越大)领导抽出中奖人再从准备好的三个信封抽出一个,三个信封内为:一只手,两只指,一双筷子等,然后自行捞取现金。最后被抽中的人所有奖金都归他。

藏宝图
具有设计感的小纸粘在杯碟椅子等地方上,在开party前,一张藏宝图分2份对开的,上边写着礼品号码,礼分2份的就是个号码有2分的,其中一分是真的,一分是假的,当他们找好藏宝图后必然要找另一半藏宝图才可以对奖的,在找藏宝图时就可以互动作用了,不过号码里的礼品一定要放点好玩的东西的(奶瓶,尿不湿)也放点大奖的啦,当同一张小纸合起来,就可以上换奖了,也可以拿了藏宝图的一对人交换藏宝图的,那时就会出很多笑话了。例如有人的藏宝图只找到半张纸时,他可能会看领导的杯杯碟碟的。强调团队合作的重要性。

本文采取的是转盘抽奖:

实现代码

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link href="./style.css" type="text/css" rel="stylesheet">
</head>
<style>

</style>
<body>
    
<!-- 首先通过分析观察可以知道这是一个双层次结构,
所以需要的是div嵌套结构 -->
<div class="outher">
    <div class="wapper">
        <div class="left">
            <!-- 一边4个选项 -->
                <div class="one"> <span class="text"></span></div>
                <div class="two"> <span class="text"></span></div>
                <div class="three"> <span class="text"></span></div>
                <div class="four"> <span class="text"></span></div>
        </div>
        <div class="right">
            <div class="one"> <span class="text"></span></div>
            <div class="two"> <span class="text"></span></div>
            <div class="three"> <span class="text"></span></div>
            <div class="four"> <span class="text"></span></div>
        </div>
     
      </div>
      <!-- 图形中间的文字 -->
      <div class="circle">
             抽奖
     </div>
</div>

<script src="style.js"></script>

</body>
</html>

style.css

*{
    margin:0;
    padding:0;
}

body{
    /* 让div盒子放到屏幕中间 */
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100vh;
}


.outher{
    width:300px;
    height: 300px;
    position: relative;
    border-radius: 50%;
}

.wapper{
    width:300px;
    height: 300px;
    border-radius: 50%;
    overflow: hidden;
    background-color: black;
    transform:rotate(22.5deg);
 }

 .left{
     position: absolute;
     width: 150px;
     height: 300px;
     left:0;
     overflow: hidden;
 }

 .left .text{
     position: absolute;
     top:30px;
     left:55%;
     transform:rotate(-22.5deg);
     text-align: center;
 }

 .right .text{
     position: absolute;
     top:25px;
     left:11%;
     transform:rotate(22.5deg);
     text-align: center;
 }

 
 .right{
     position: absolute;
     width: 150px;
     height: 300px;
     right:0;
     overflow: hidden;
     text-align: center;
 }


 .left div{
   position: absolute;
   top:0;
   left:0;
   width: 100%;
   height: 100%;
   transform-origin: right center;
}

.left div.one{
   background-color: #FC7C7B;
}


.left div.two{
   background-color: #F59462;
   transform:rotate(-45deg);
}

.left div.three{
   background-color: #FC7C7B;
   transform:rotate(-90deg);
}

.left div.four{
   background-color: #F59462;
   transform:rotate(-135deg);
} 


.right div{
   position: absolute;
   top:0;
   left:0;
   width: 100%;
   height: 100%;
   transform-origin: left center;
}


.right div.one{
   background-color: #FC7C7B;
}


.right div.two{
   background-color: #F59462;;
   transform:rotate(45deg);
}

.right div.three{
   background-color: #FC7C7B;;
   transform:rotate(90deg);
}

.right div.four{
 
   background-color: #fff;
   transform:rotate(135deg);
} 

.circle{
   width: 100px;
   height: 100px;
   background-color:#f2552e ;
   position: absolute;
   left:50%;
   top:50%;
   transform:translate(-50%,-50%);
   border-radius: 50%;
   text-align: center;
   line-height: 100px;
   font-size: 30px;
   font-weight: bold;
   cursor: pointer;
   user-select: none;
}

.circle:after{
    width: 0;
    height: 0;
    border:40px solid #f2552e ;;
    border-left-width: 10px;
    border-right-width: 10px;
    position: absolute;
    content:"";
    border-left-color: transparent;
    border-top-color: transparent;
    border-right-color: transparent;
    top:-70px;
    left:calc(50% - 10px);
    z-index: -1;
}

style.js

let wapper = document.querySelector(".wapper");

    let textAll = document.querySelectorAll(".wapper .text");

    // 这里是奖项的名字
    let prize = ["1号大奖","2号大奖","3号大奖","4号大奖","5号大奖","6号大奖","7号大奖","未中奖"];
    
    // 权重数组 不同奖项的权重值,权重越高越容易中这个区域
    let prizeWeight = [1,3,5,7,10,15,20,30];
    
    //  权重之和
    let weightSum = prizeWeight.reduce(function(prevValue,curVal){
        return prevValue + curVal;
    });


    for(let i = 0 ; i < textAll.length ; i++){
            textAll[i].innerHTML = prize[i];  
    }

    let isFlag = true;

        document.querySelector(".circle").onclick=function(){
            console.log(123);
        if(isFlag){
            
        // 生成权重随机数 生成数的范围是【1,30】
        // 这里需要注意的是,这个30要和最上面的prizeWeight的最后一个值对应
        let weightRandom = parseInt(Math.random()*30);
        // 合并
        let concatAfterArr = prizeWeight.concat(weightRandom);
    
        // 排序
        let  sortedWeightArr  = concatAfterArr.sort(function(a,b){ return a-b });

        // randomIndex是奖项的索引 结果是【1,7】
        var randomIndex = sortedWeightArr.indexOf(weightRandom); 
        randomIndex = Math.min(randomIndex, prize.length -1); 

            // 获奖的内容
            let text = prize[randomIndex];
            
            switch(randomIndex){
                case 0:
                    run(22.5,text);
                    break;
                case 1:
                    run(66.5,text);
                    break;
                case 2:
                    run(112.5,text); 
                    break;
                case 3:
                    run(157.5,text);
                    break;
                case 4:
                    run(338.5,text);
                    break;
                case 5:
                    run(294.5,text);
                    break;   
                case 6:
                    run(247.5,text);
                    break;
                case 7:
                    run(201.5,text);
                    break;    
            }
        }
        
    };

    function run(angle,text){
    isFlag = false;
    let begin = 0; 
    let timer = null;
    let basic = 1800;
    timer = setInterval(function(){
        if(begin > (basic+angle)){
            isFlag = true;
            clearInterval(timer);
        }
        wapper.style.transform="rotate("+(begin)+"deg)";
        // 这是一个算法 可以出现转盘又很快到慢慢变慢的效果
        begin+=Math.ceil(basic+angle-begin)*0.1;
    },70);
}

有关html+css+js实现带有转盘的抽奖小程序的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  3. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  4. ruby - capybara field.has_css?匹配器 - 2

    我在MiniTest::Spec和Capybara中使用以下规范:find_field('Email').must_have_css('[autofocus]')检查名为“电子邮件”的字段是否具有autofocus属性。doc说如下:has_css?(path,options={})ChecksifagivenCSSselectorisonthepageorcurrentnode.据我了解,字段“Email”是一个节点,因此调用must_have_css绝对有效!我做错了什么? 最佳答案 通过JonasNicklas得到了答案:No

  5. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  6. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  7. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  8. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  9. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  10. ruby-on-rails - 使用 Sublime Text 3 突出显示 HTML 背景语法中的 ERB? - 2

    所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择

随机推荐