转盘抽奖,使用svg和原生js编写。简单清晰!

1.首先,先上图片给大家看看转盘的样子。

2.然后我们先搭建一下结构。 这里呢,我们需要使用svg画布完成圆盘以及指针的绘制,需要旋转不同的rotate,需要用到path路径,text文本绘制的知识,废话不多说我们先上代码。

    <div id="content">
        <!-- 圆盘 -->
        <div id="truntable">
            <!--圆 - circle元素;r:圆的半径。cx:圆心 坐标x值。cy:圆心 坐标y值。-->
            <svg width="500" height="500" id="svg1"  transform="rotate(60)">
                <!--包含下面圆弧的圆作为边框-->
                <circle cx="250" cy="250" r="200" stroke="rgb(247, 204, 11)" fill="transparent" stroke-width="10" />
                <!--60度圆弧拼成一个圆盘 -->
                <!--正上方1/6圆弧,以下都是顺时针的1/6圆弧 -->
                <path d="M 150 76.8 A 200 200, 0, 0, 1, 350 76.8 L 250 250 Z" fill="rgb(254, 119, 116)" stroke="#FFBE46"
                    stroke-width="1" />
                <!--抽奖正上方1/6圆弧内文字-->
                <text x="200" y="116.8" transform="rotate(0)" fill="rgb(249, 254, 253)">罚抄次数10</text>
                <!--2/6圆弧-->
                <path d="M 350 76.8 A 200 200, 0, 0, 1, 450 250 L 250 250 Z" fill="rgb(254, 204, 109)" stroke="#FFBE46"
                    stroke-width="1" />
                <!--抽奖正上方2/6圆弧内文字-->
                <text x="300" y="-236.8" transform="rotate(60)" fill="rgb(249, 254, 253)">罚抄次数20</text>

                <!--3/6圆弧-->
                <path d="M 450 250 A 200 200, 0, 0, 1, 350 423.3 L 250 250 Z" fill="rgb(254, 119, 116)" stroke="#FFBE46"
                    stroke-width="1" />
                <!--抽奖正上方3/6圆弧内文字-->
                <text x="50" y="-476.8" transform="rotate(120)" fill="rgb(249, 254, 253)">罚抄次数30</text>

                <!--4/6圆弧-->
                <path d="M 350 423.3 A 200 200, 0, 0, 1, 150 423.3 L 250 250 Z" fill="rgb(254, 204, 109)" stroke="#FFBE46"
                    stroke-width="1" />
                <!--抽奖正上方4/6圆弧内文字-->
                <text x="-300" y="-400" transform="rotate(180)" fill="rgb(249, 254, 253)">罚抄次数25</text>

                <!--5/6圆弧-->
                <path d="M 50 250 A 200 200, 0, 0, 0, 150 423.3 L 250 250 Z" fill="rgb(254, 119, 116)" stroke="#FFBE46"
                    stroke-width="1" />
                <!--抽奖正上方5/6圆弧内文字-->
                <text x="-380" y="-50" transform="rotate(240)" fill="rgb(249, 254, 253)">罚抄次数50</text>

                <!--6/6圆弧-->
                <path d="M 50 250 A 200 200, 0, 0, 1, 150 76.8 L 250 250 Z" fill="rgb(254, 204, 109)" stroke="#FFBE46"
                    stroke-width="1" />
                <!--抽奖正上方6/6圆弧内文字-->
                <text x="-130" y="200" transform="rotate(300)" fill="rgb(249, 254, 253)">罚抄次数40</text>
            </svg>
        </div>
        <!-- 指针 -->
        <div id="pointer">
            <svg width="100" height="100" id="svg2">
                <!--指针-->
                <path d="M 50 0 A 50 50, 0, 1, 0, 100 50 L 100 0 Z" fill="rgb(197, 65, 231)" />
                <!--抽奖指针文字-->
                <text x="35" y="10" transform="rotate(45)" fill="#fff">开始抽奖</text>
            </svg>
        </div>
    </div>

 3.这样以来我们就可以绘制出,基本的圆盘和指针了。接下来就可以简单设置下样式了。

<style type="text/css">
        /*转盘背景*/
        #content {
            width: 500px;
            height: 500px;
            margin: 50px auto;
            overflow: hidden;
            position: relative;
        }

        #truntable {
            width: 500px;
            height: 500px;
        }

        #truntable svg {
            width: 500px;
            height: 500px;
            transition: all 4s ease;
            font-size: 18px;
            font-weight: 700;
        }

        #content #pointer {
            width: 100px;
            height: 100px;
            position: absolute;
            top: 200px;
            left: 200px;
            cursor: pointer;
            transform: rotate(-45deg);
        }

        #content #pointer svg {
            width: 100px;
            height: 100px;
            font-size: 18px;
            font-weight: 700;
        }
        #content #pointer svg:hover path{
            fill: #f40;
        }
    </style>

 4.接下来了,我们需要用js去操纵,圆盘的rotate,让圆盘能够转动。我这里使用了定时器,这样的话就可以让圆盘的rotate在一定时间内发生改变了。

    <script>
        var svg1 = document.getElementById('svg1');
        var svg2 = document.getElementById('svg2');
        var timer  = null;
        svg2.onclick = function (e) {
            // 获取当前转盘的角度
            var current = +svg1.getAttribute('transform').slice(7,-1);
            // console.log(`当前${current}`);
            // 随机一个数并将其存储在num中
            var num = Math.floor(Math.random() * 100)+current;
            // console.log(num);
            // 开启一个定时器,用来改变旋转角度
            timer = setInterval(function () {
                num +=60;
                console.log(num);
                // 定义一个变量存储随机角度
                var rotate = `rotate(${num})`;
                // 改变svg1对象中的transform属性
                svg1.setAttribute("transform",rotate);
            }, 100)
            // 重新定义一个计时器用来解除上一个计时器
            var tiemr1 = setTimeout(function(){
                clearInterval(timer)
            },2000)

            
        }
    </script>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值