html+css+js实现转盘抽奖

 

<!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>转盘</title>
<style>
    .zp {
        position: relative;
        border-radius: 100%;
        width: 300px;
        overflow: hidden;
        margin:0 auto;
    }
    .zp-panel {
        background: url(./assets/dial.png) no-repeat center center;
        background-size: 100%;
        width: 300px;
        height: 300px;
        position: relative;
        transform: rotate(25deg);
        transition: transform 3s ease-out;
        
    }
    .item {
        font-size: 12px;
        position: absolute;
        top: 50%;
        left: 0;
        right: 0;
        text-align: center;
        margin-top: -7px;
        line-height: 1;
    }
    .btn {
        position: absolute;
        background-color: green;
        width: 80px;
        height: 80px;
        border-radius: 100%;
        left: 50%;
        top: 50%;
        transform: translate(-50%, -50%);
        z-index: 2;
        display: flex;
        align-items: center;
        justify-content: center;
        color: #fff;
    }
    .btn:after {
        content: '';
        position: absolute;
        height: 80px;
        width: 4px;
        background-color: green;
        left: 38px;
        bottom: 60px;
    }
</style>

</head>
<body>
    <div class="zp">
        <div class="zp-panel"></div>
        <div class="btn">开始</div>
    </div>
</body>
<script>
    const arr = [
        {name: ''},
        {name: ''},
        {name: ''},
        {name: ''},
        {name: ''},
        {name: ''},
        {name: ''},
        {name: ''}
    ]
    const zp = document.querySelector('.zp-panel')
    const btn = document.querySelector('.btn')
    const d = 360 / arr.length
    zp.innerHTML = arr.map((v, i) => {
        // console.log(v, i);
        return `<div class="item" 
            style="transform:rotate(${i*d}deg) translate(75px)">${v.name}</div>`
    }).join('')
    btn.onclick = () => {
        // const zpIndex = arr.findIndex(v => v.is)
        const zpIndex = Math.random()*8
        console.log(zpIndex);
        const deg = zpIndex * d + Math.random()*180
        console.log(deg);
        // 清空上次抽奖,暂停动画效果
        zp.style.transition = 'inherit'
        zp.style.transform = ''
        setTimeout(() => {
            // 重置transition,恢复动画效果
            zp.style.transition = ''
            setTimeout(() => {
                // 触发动画
                zp.style.transform  = `rotate(${deg}deg)`
            })
        })
    }
</script>
</html>

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是一个基于HTMLCSSJS实现带有转盘的抽奖小程序的示例代码。 首先,我们需要在HTML中创建一个canvas元素,作为转盘的容器。 ```html <canvas id="canvas" width="400" height="400"></canvas> ``` 接下来,我们需要先在JS中定义一些转盘相关的变量和常量。 ```javascript var canvas = document.getElementById("canvas"); var ctx = canvas.getContext("2d"); // 转盘的中心点坐标 var x = canvas.width / 2; var y = canvas.height / 2; // 转盘半径 var r = x; // 转盘的扇形数量 var sectorCount = 6; // 每个扇形的角度 var sectorAngle = Math.PI * 2 / sectorCount; // 转盘的旋转角度 var rotateAngle = 0; // 奖品名称数组 var prizeTexts = ["奖品1", "奖品2", "奖品3", "奖品4", "奖品5", "奖品6"]; ``` 然后,我们可以编写一个函数来绘制转盘的扇形和文本。 ```javascript function drawSector(startAngle, endAngle, color, text) { // 绘制扇形 ctx.beginPath(); ctx.moveTo(x, y); ctx.arc(x, y, r, startAngle, endAngle); ctx.closePath(); ctx.fillStyle = color; ctx.fill(); // 绘制文本 ctx.save(); ctx.translate(x, y); ctx.rotate(startAngle + (endAngle - startAngle) / 2); ctx.fillStyle = "#fff"; ctx.font = "bold 20px Arial"; ctx.fillText(text, r / 2, 0); ctx.restore(); } ``` 接下来,我们可以使用该函数来绘制转盘的扇形和文本。 ```javascript for (var i = 0; i < sectorCount; i++) { var startAngle = i * sectorAngle - rotateAngle; var endAngle = (i + 1) * sectorAngle - rotateAngle; var color = i % 2 == 0 ? "#f00" : "#0f0"; var text = prizeTexts[i]; drawSector(startAngle, endAngle, color, text); } ``` 现在,我们可以编写一个函数来旋转转盘。 ```javascript function rotate() { // 每次旋转增加的角度 var deltaAngle = Math.random() * 30 + 10; // 旋转角度增加 rotateAngle += deltaAngle; // 旋转到最近的扇形中心 var sectorIndex = Math.floor(rotateAngle / sectorAngle); rotateAngle = sectorIndex * sectorAngle; // 绘制转盘 ctx.clearRect(0, 0, canvas.width, canvas.height); for (var i = 0; i < sectorCount; i++) { var startAngle = i * sectorAngle - rotateAngle; var endAngle = (i + 1) * sectorAngle - rotateAngle; var color = i % 2 == 0 ? "#f00" : "#0f0"; var text = prizeTexts[i]; drawSector(startAngle, endAngle, color, text); } } ``` 最后,我们可以在HTML中添加一个按钮,当用户点击该按钮时,调用rotate()函数来旋转转盘。 ```html <button onclick="rotate()">开始抽奖</button> ``` 完整的代码如下: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>抽奖小程序</title> </head> <body> <canvas id="canvas" width="400" height="400"></canvas> <button onclick="rotate()">开始抽奖</button> <script> var canvas = document.getElementById("canvas"); var ctx = canvas.getContext("2d"); // 转盘的中心点坐标 var x = canvas.width / 2; var y = canvas.height / 2; // 转盘半径 var r = x; // 转盘的扇形数量 var sectorCount = 6; // 每个扇形的角度 var sectorAngle = Math.PI * 2 / sectorCount; // 转盘的旋转角度 var rotateAngle = 0; // 奖品名称数组 var prizeTexts = ["奖品1", "奖品2", "奖品3", "奖品4", "奖品5", "奖品6"]; function drawSector(startAngle, endAngle, color, text) { // 绘制扇形 ctx.beginPath(); ctx.moveTo(x, y); ctx.arc(x, y, r, startAngle, endAngle); ctx.closePath(); ctx.fillStyle = color; ctx.fill(); // 绘制文本 ctx.save(); ctx.translate(x, y); ctx.rotate(startAngle + (endAngle - startAngle) / 2); ctx.fillStyle = "#fff"; ctx.font = "bold 20px Arial"; ctx.fillText(text, r / 2, 0); ctx.restore(); } function rotate() { // 每次旋转增加的角度 var deltaAngle = Math.random() * 30 + 10; // 旋转角度增加 rotateAngle += deltaAngle; // 旋转到最近的扇形中心 var sectorIndex = Math.floor(rotateAngle / sectorAngle); rotateAngle = sectorIndex * sectorAngle; // 绘制转盘 ctx.clearRect(0, 0, canvas.width, canvas.height); for (var i = 0; i < sectorCount; i++) { var startAngle = i * sectorAngle - rotateAngle; var endAngle = (i + 1) * sectorAngle - rotateAngle; var color = i % 2 == 0 ? "#f00" : "#0f0"; var text = prizeTexts[i]; drawSector(startAngle, endAngle, color, text); } } </script> </body> </html> ``` 这样,我们就实现了一个简单的带有转盘的抽奖小程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值