一个很好玩的效果,可以作为很多特效使用

前几天在群里的看到一个朋友再发这个需求,就问一了一下我怎么弄,刚拿到这个粗略的考虑了一下,觉得需要角度,位置信息很麻烦,写起来需要不少时间,后来去网上查了一下Math的所有函数,希望能找到一个好的解决方案,还真找到了一个方案。

下面是html代码:

<div class="main-count">
    <div class="clockCenter">
        <div class="clockBg"></div>
        <div class="clockNeedle">v</div>
    </div>
</div>
你没看错,DOM元素就是这么少。。。
下面是css

*{ margin: 0; padding: 0;}
        .clockCenter{ position: relative; width: 0; height: 0; margin: 300px 400px;}
        .main-count{ width: 1200px; margin: 0 auto;}
        .clockBg{ position: absolute; top: -151px; left: -151px; width: 300px; height: 300px; border: 1px cornflowerblue solid; border-radius: 50%;}
        .clockNeedle{ position: absolute; left: 0; top: -151px; width: 15px; height: 15px; text-align: center; line-height: 15px; color: #666; background-color: #fff; border: 1px cornflowerblue solid; border-radius: 50%; transform: translate(-50%,-50%); cursor: pointer;}
DOM元素少,所以相应的样式就少的可怜了。。。。

下面是js,也不多:

var clockRest={
    param:{},//用于存放传入的参数
    area:1,//用于标记鼠标所在的区域
    roundCount:0,//用于标记当前的圈数
    canMove:false,//用于标记是否可以滑动
    ClockCenter:document.getElementsByClassName("clockCenter").item(0),
    clockNeedle:document.getElementsByClassName("clockNeedle").item(0),
    centerPoint:{},
    deg:0,
    initFunc:function(option){
        var _this=this;
        this.param=option;
        this.centerPoint=this.ClockCenter.getBoundingClientRect();
        this.clockNeedle.addEventListener("mousedown",function(e){
            _this.canMove=true;
        });
        document.addEventListener("mousemove",function(e){
            var ev = e||window.event;
            if(ev.preventDefault){
                ev.preventDefault();
            }else{
                ev.stopPropagation();
            }
            if(!_this.canMove){
                return false;
            }
            if(ev.pageX-_this.centerPoint.left<=0&&_this.area==1){
                return false;
            }else{
                _this.deg = Math.atan2(((_this.centerPoint.top+window.scrollY)-ev.pageY),(ev.pageX-_this.centerPoint.left));
                if(_this.deg*180/Math.PI>=0&&_this.deg*180/Math.PI<90){
                    _this.area=1;
                }else if(_this.deg*180/Math.PI>=90&&_this.deg*180/Math.PI<180){
                    _this.area=4;
                }else if(_this.deg*180/Math.PI<0&&_this.deg*180/Math.PI>=-90){
                    _this.area=2;
                }else if(_this.deg*180/Math.PI<-90&&_this.deg*180/Math.PI>=-180){
                    _this.area=3;
                }
                _this.renderNeedle();
            }
        });
        document.addEventListener("mouseup",function(e){
            if(!_this.canMove){
                return false;
            }
            _this.canMove=false;
        });

    },
    renderNeedle:function(){
        this.clockNeedle.style.top = -151*Math.sin(this.deg)+"px";
        this.clockNeedle.style.left = 151*Math.cos(this.deg)+"px";
        this.clockNeedle.style.transform=" translate(-50%,-50%) rotate("+(this.deg*180/Math.PI>0?(90-this.deg*180/Math.PI):(90-this.deg*180/Math.PI))+"deg)"
    }
};
clockRest.initFunc({});
js总共也才几十行,因为还有很多位置因素未处理,我这边留了一个option的参数作为我们传入的一个接口,如果以后需要改动的时候可以比较方便的拓展。

最终实现的效果是可以拖动小三角做圆周运动。。。



猜你喜欢

转载自blog.csdn.net/ccj1990528/article/details/52486382