zoukankan      html  css  js  c++  java
  • 原生js解决倒计时结束图片抖动之后移动消失的效果

    标题看着复杂其实需求就是:一张图片在一段时间倒计时结束之后,先抖动一下然后向下移动消失。不明白什么意思的可以看下图解释:

    直接来看布局代码,直接把布局以及css都写在一起了:

    <style>
            #img{position:absolute;left:15px;top:80px;}
            #time{width:150px; opacity:100;}
            #djs{font-size:14px;color:#999}
    </style>
    
    <body>
    <input id="time" type="text" value="January 3,2018 20:00:00"/>
    <input id="btn" type="button" value="确定" />
    <p id="djs">剩余0天0时0分0秒</p>
    <img id="img" width="180" src="img/pic2.jpg"/>
    </body>

    分析:

    想要实现上图的结果那么需要四个js效果组合实现:

    第一是先要有一个倒计时,然后将具体倒计时间显示出来;

    第二是图片需要抖动几下的;

    第三就是图片抖动之后向一个方向移动固定像素;

    第四就是让其慢慢消失(透明度降低)

    来看js代码:

    <script>
        window.onload=function(){
            var oImg=document.getElementById("img");
            var oTime=document.getElementById("time");
            var oBtn=document.getElementById("btn");
            var oDjs=document.getElementById("djs");
            var timer="";
            var moves="";
            var cleary="";
            var iNow = null;
            var iNew = null;
            var t=0;
            var len = 20;
            var num=0;
            //添加点击事件
            oBtn.onclick=function(){
                 iNew=new Date(oTime.value);
                clearInterval( timer );
                timer=setInterval(function(){
                    iNow = new Date();
                    t = Math.floor( ( iNew - iNow ) / 1000 );
                    if ( t > 0 ) {//这个时间差要么大于或者等于0,不可能为负值
                        str = Math.floor(t/86400)+'天'+Math.floor(t%86400/3600)+'时'+Math.floor(t%86400%3600/60)+'分'+t%60+'秒';
                        oDjs.innerHTML = str;
    
                    }else if(t == 0){
                        str = Math.floor(t/86400)+'天'+Math.floor(t%86400/3600)+'时'+Math.floor(t%86400%3600/60)+'分'+t%60+'秒';
                        oDjs.innerHTML = str;
                        shake(oImg,'left',function(){
                            moves = setInterval( function (){
                                doMove( oImg, 'top', 23, 500,function(){
                                    cleary=setInterval(function(){
                                        opacity(oImg,-0.1,0)
                                    },100)
                                });
                                num ++;
                                if ( num === len ) {
                                    clearInterval( timer );
                                }
    
                            }, 100 );
    
                        });
    
                    }else{
                        clearInterval( timer );
                    }
    
                },1000)
    
            };
            
            
            //抖动效果的代码封装
            function shake(obj,attr,endFn){
                var pos=parseFloat(getStyle(obj,attr));
                var arr=[];
                var num=0;
                var sha=null;
                //抖动频率de数组,一正一负[20,-20,18,-18...]
                for(var i=20;i>0;i-=2){
                    arr.push(i,-i)
                }
                arr.push(0);
                //启用定时器前先关闭定时器
                clearInterval(obj.sha);
                obj.sha=setInterval(function(){
                    //让图片的left跟随数组里的值变化就会实现左右移动效果
                    obj.style[attr]=pos+arr[num]+"px";
                    num++;
                    if(num===arr.length){
                        clearInterval(obj.sha);
                        endFn && endFn();
                    }
                },50)
            }
            //元素向下移动(掉下来)的效果封装
            function doMove ( obj, attr, dir, target, endFn ) {
                dir = parseInt(getStyle( obj, attr )) < target ? dir : -dir;
                clearInterval( obj.move );
                obj.move = setInterval(function () {
                    var speed = parseInt(getStyle( obj, attr )) + dir;            // 步长
                    if ( speed > target && dir > 0 ||  speed < target && dir < 0  ) {
                        speed = target;
                    }
                    obj.style[attr] = speed + 'px';
    
                    if ( speed == target ) {
                        clearInterval( obj.move );
                        endFn && endFn();
    
                    }
                }, 30);
            }
            //透明度的封装
            function opacity(obj,dir,target){
                clearInterval( obj.clarity );
                obj.clarity = setInterval(function () {
                    var speed =parseFloat(getStyle( obj, "opacity" ))+ dir;
                    if ( speed < target) {
                        clearInterval( obj.clarity );
                    }else  {
                        obj.style.opacity=speed;
                    }
                }, 30);
    
            }
        };
    
        //兼容不同浏览器获取行间样式
        function getStyle ( obj, attr ) {
            return obj.currentStyle?obj.currentStyle[attr] : getComputedStyle( obj )[attr];
        }
    
    </script>

     以上便是这个效果的实现js代码,其实关于抖动然后向下移动以及降低透明的js效果,我已经简单封装了一下,主要为上面代码调用方便,也是为了多组效果的话调用方便,若是不想让其都在一个js里,可也以把这三组js效果专门写一个js文件然后就像引用外部js一样引用进来即可!

    当然这里只是我的简单实现的方法,你也可以把代码复制下来试一试哦!当然一定要注意路径!

    好了,今天就到这里!有问题欢迎修改指正!

  • 相关阅读:
    js 数组操作常用方法
    如何成为一名卓越的前端工程师
    js实现日期显示的一些操作
    JavaScript 创建对象的七种方式
    ios微信浏览器音乐自动播放
    Mac下新建.开头的隐藏文件
    JavaScript判断浏览器UA 、 添加收藏 、设置首页 、调用本地邮箱发送邮件
    获取当前页面参数Hash和Search,或者当前Script的参数
    AJAX调用代码实例
    移动端兼容笔记整理
  • 原文地址:https://www.cnblogs.com/web001/p/8196297.html
Copyright © 2011-2022 走看看