wap红包雨(曲线移动带旋转)

做了好几版本的红包雨,表示很愁人,手机卡顿一直是个大问题,这里整理了一份稍简洁的版本。

1.红包从下向上运动,开始位置随机

2.曲线运动,碰到边缘时自动转弯,并自带旋转效果

3.定义两条线路,不至于看起来太规律


注:可以在此基础上更改相应参数,把定值写成随机值可以看起来更没有规律些,点击事件,点击效果自行定义,定时器使用完记得清除。

依然调用了页面初始化以及px转rem的两个小JS和JQ:

jquery-3.1.0.min.js

希望越来越好,加油。

css:

.redRainWrap{ width:100%; background: #ccc;}
.redRain{ width:100%; position: absolute; z-index: 1; top:0; overflow:hidden }
.envelope{ width: 2.853rem; height: 2.92rem; position: absolute; }
.envelope img{ width:100%; height: auto; position: absolute; top:0;}
.envelope img{-moz-transition:all .5s ease-out;-webkit-transition:all .5s ease-out;-o-transition:all .5s ease-out;-ms-transition:all .5s ease-out;transition:all .5s ease-out}

html:

<div class="redRainWrap">
   <div class="redRain"></div>
   <div class="aaa"></div>
</div>


js:

<script>
   /*变量*/
    var windWidth = $(window).width();
    var windHeight = $(window).height();
    var redRainWrap = $('.redRainWrap');
    var redRain = $('.redRain');
    /*红包参数*/
    var redDefault = {
        num: 25,            //红包个数
        intervalTime: 500,    //红包间隔出现时间
        moveInterval: 7,      //红包间隔移动时间
        moveX: windWidth/100,  //红包每次横向移动距离
        moveY: 6,           //红包每次纵向移动距离
        moveX_andr: 6,       //屏幕小于宽度360px的红包每次横向移动距离
        moveY_andr: 5        //屏幕小于宽度360px的红包每次纵移动距离
    };
    $(function () {
        redRainWrap.css('height',$(window).height());
        $('.redRain').css('height',$(window).height());
        $('.aaa').html('宽:'+windWidth +'高:'+windHeight);
      /*生成红包*/
        redInit(redDefault.num);
    });
   /*循环生成固定数量的红包*/
   function redInit(num) {
        var startMoveTime = 0;
      /*循环生成固定数量的红包*/
        for(var i=0; i<=num;i++){
            var axisX = parseInt(Math.random() * (windWidth-214));//0-750;
            var div = document.createElement("div");
            div.setAttribute('class', 'envelope');
            /*位置*/
            $(div).css('top',windHeight);
            $(div).css('left',axisX);
            /*内容*/
            div.innerHTML = '<img src="img/redRain_package.png">';
            redRain.prepend(div);
        }
        /*红包依次开始移动   内含定时器moveStart,已清除*/
        var j=i;
        var moveStart = setInterval(function () {
            var div = $('.redRain').find('div').eq(j);
            redRainMove(div,axisX);
            j--;
            if(j<=0){
                clearInterval(moveStart);
            }
        },redDefault.intervalTime);
    }
   /*红包移动  注:内含定时器timer 定时器在移动结束1s后清除*/
    function redRainMove(div,axisX){
        var divImg = div.find('img');
        var redWidth = div.width();
        var goRight = false;
        var myRotate = 'rotate(0deg)';
        var x = axisX;
        var y = windHeight;
        var tempX = redDefault.moveX;
        var tempY = redDefault.moveY;
        if(windWidth<=360){
            tempX = redDefault.moveX_andr;
            tempY = redDefault.moveY_andr;
        }
        var timeInt = redDefault.moveInterval+Math.random() *5;
        var mymove = 'translate3d('+x+'px,'+y+'px,'+'0)';
      /*两条线路*/
        if(x%2 == 0){ goRight = true; }
        var timer = setInterval(function(){
         /*到达左边界*/
            if(x<=Math.random()*30){
                goRight = true;
                myRotate = 'rotate(30deg)';
            }
         /*到达右边界*/
            else if(x>=(windWidth-redWidth-Math.random()*30)){
                goRight = false;
                myRotate = 'rotate(-30deg)';
            }
            y -= tempY;
         /*向左还是向右*/
            if(goRight){ x+=tempX;/*向右*/ }
            else{ x-=tempX; /*向左*/}
            $(divImg).css({
                'transform':myRotate,
                '-moz-transform':myRotate,
                '-ms-transform':myRotate,
                '-o-transform':myRotate,
                '-wbkit-transform':myRotate
            });
            div.css('top',y);
            div.css('left',x);
            if(y<0){
                setTimeout(function () {
                    clearInterval(timer);
                },1000);
            }
        },timeInt);
    }
   /*移除div 根据divtop值去移除相应的DIV 定时器redRemove,已清除*/
    var redRemove = setInterval(function () {
        var red = $('.redRain').find('div');
        var len = red.length;
        for(var i=0; i<=len-1;i++){
            var redT = red.eq(i).offset().top;
            if(redT<0){
                red.eq(i).remove();
                if(i == 1){
                    setTimeout(function () {
                        clearInterval(redRemove);
                    },1000);
                }
            }
        }
    },1000);
</script>















  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值