前端知识

Vue+Sass 实现转盘效果

2019-01-18  本文已影响1人  yimi珊

前言

1.sass实现多个圆点围绕成圆圈,并添加动画。
2.sass及js实现转盘效果

来个效果图


全部代码

实现多个圆点围绕成圆圈、转盘中的文本、以及旋转动画,关键在于使用sass中的@for循环来实现效果

css中rem()单位可修改为px/rem/em...
emm...这里我懒得改...
使用rem()是为了更好的适配屏幕,可以看看使用Vue-cli创建项目及常用配置里面有详细的写法。

<template>
    <div class="lucky wapper_header">
        <div class="lucky_base">
            <!--圆点-->
            <div class="flashing" ref="flashing">
                <b v-for="light in lights">
                    <i></i>
                </b>
            </div>
            <!--转盘-->
            <div class="dial_con" ref='dial'>
                <div v-for="(item,i) in items">
                    <p v-if="item.type==1">
                        <b>{{item.txt}}</b>
                        <strong>{{item.num}}<span>元</span></strong>
                    </p>
                    <p v-else class="sad">
                        <b>{{item.txt}}</b>
                    </p>
                </div>
            </div>
            <!--按钮-->
            <button class="btn btn_dial" @click="lottery" :disabled="lotteryAbled">
                <strong>GO</strong>
            </button>
        </div>
    </div>
</template>
<script>
    export default {
        data(){
            return {
                lights:30,
                items:[{id:0,type:1,txt:'现金奖励',num:'100'
                    },{id:1,type:1,txt:'现金奖励',num:'100'
                    },{id:2,type:1,txt:'现金奖励',num:'100'
                    },{id:3,type:1,txt:'现金奖励',num:'100'
                    },{id:4,type:0,txt:'谢谢参与'
                    },{id:5,type:1,txt:'现金奖励',num:'100'
                    },{id:6,type:1,txt:'现金奖励',num:'100'
                    },{id:7,type:0,txt:'谢谢参与'
                }],
                lotteryAbled:false,
            }
        },
        methods:{
            lottery(){
                this.lotteryAbled=true;
                let childs = this.$refs.flashing.childNodes;
                let _this = this;
                let j=2;
                this.$refs.dial.className = 'dial_con';
                setTimeout(()=>{
                    this.$refs.dial.className = `dial_con dial_${j}`;
                },0)
                var i=0;
                let time = setInterval(()=>{
                    childs[i].className='flashing_light';
                    i++;
                    if(i >= _this.lights){
                        this.$refs.flashing.className = 'flashing flashing_parent';
                        clearInterval(time);
                    }
                },80);
            },
        }
    };
</script>
<style scoped lang='scss'>
    @import "../../assets/css/reset.scss";
    .lucky{
        min-height: 100vh;
        width: 100%;
        background: #f4f1bb;
        padding-top: rem(100);
    }
    .lucky_base{
        width: rem(650);
        height: rem(650);
        position: relative;
        z-index: 1;
        background: #ed6a5a;
        border-radius: 50%;
        margin: auto;
    }
    .flashing{
        position: absolute;
        width: rem(650);
        height: rem(650);
        left: 50%;
        margin-left: rem(-325);
        b{
            width: rem(20);
            height: rem(323);
            margin-top: rem(3);
            margin-left: rem(-10);
            position: absolute;
            transform: rotate(0deg);
            transform-origin:  center bottom;
            /*background: #eeeeee77;*/
        }
        i{
            position: absolute;
            width: rem(14);
            height: rem(14);
            background: white;
            left: 50%;
            top: rem(10);
            border-radius: 50%;
            display: block;
            box-shadow: 0 0 rem(15) rem(6) rgba(255,255,255,0);
        }
        img{
            position: absolute;
            width: rem(10);
            top: rem(-2);
            left: 50%;
            margin-left: rem(-5);
            
        }
        .flashing_light{
            i{
                box-shadow: 0 0 rem(15) rem(6) rgba(255,255,255,1);
            }
        }
    }
    .flashing_parent b i{
        animation: twinkle .8s .2s linear infinite;
    }
    $base_deg:12deg;
    @for $i from 1 through 40 {
        .flashing b:nth-of-type(#{$i}) {
            transform: rotate($base_deg *$i);
        }
    }
    .dial_con{
        width: rem(570);
        height: rem(570);
        background: url('../../assets/img/mine/task/dial_bg2.png') no-repeat;
        background-size: 100% auto;
        position: absolute;
        left: 50%;
        margin-left: rem(-285);
        top: rem(40);
        div{
            color: #dfa500;
            position:absolute;
            height:rem(285);
            left:50%;
            top:0;
            transform: translate(-50%) rotate(0deg);
            transform-origin:  center bottom;
            padding-top: rem(40);
            b{
                font-size: $size_default;
            }
            strong{
                font-size: rem(36);
                display: block;
                padding: rem(6) 0 ;
            }
            img{
                width: rem(46);
            }
        }
        .sad{
            b{
                display: block;
                padding: rem(20) 0 ;
            }
        }
    }
    @for $i from 0 through 7 {
        .dial_#{$i} {
            animation: dial#{$i} 6s cubic-bezier(.2,0,0,.9) forwards;
        }
    }
    @for $i from 0 through 7 {
        .dial_con div:nth-of-type(#{$i}) {
            transform: translate(-50%) rotate(45deg *$i);
        }
    }
    .btn_dial,.btn_dial[disabled]{
        width: rem(158);
        height: rem(202);
        border: 0;
        background: url('../../assets/img/mine/task/dial_pointer1.png') no-repeat;
        background-size: 100%;
        position: absolute;
        top: rem(210);
        left: 50%;
        margin-left: rem(-79);
        z-index: 3;
        color: white;
        padding: 0;
        padding-top: rem(56);
        strong{
            display: block;
            font-size: rem(52);
            line-height: rem(60);
        }
        b{
            display: block;
            margin: auto;
            margin-top: rem(-15);
            white-space: nowrap;
            max-width: 80%;
            @include ellipsis;
        }
    }
    @keyframes twinkle{
        0%{box-shadow: 0 0 rem(15) rem(6) rgba(255,255,255,0);}
        50%{box-shadow: 0 0 rem(15) rem(6) rgba(255,255,255,1);}
        100%{box-shadow: 0 0 rem(15) rem(6) rgba(255,255,255,0);}
    }
    @for $i from 0 through 7 {
        @keyframes dial#{$i} {
            0%{transform: rotate(0deg);}
            100%{transform: rotate(1800deg + 45deg*$i);}
        }
    }
</style>

By : Yimi-shan

上一篇下一篇

猜你喜欢

热点阅读