分页运动效果展示

2017-03-17  本文已影响0人  小雞雞炖蘑菇

有了DOMReady框架和move运动框架,就可以做一些好玩的事情了,现在制作一个运动的效果,页面中有好一个按钮和几块需要展示的内容,需求是点击按钮,内容收缩消失于一点,在点击从这一点放大运送至页面中的位置上;代码如下:

//样式
*{margin:0; padding:0; list-style:none;}
ul{width:366px; margin:100px auto;}
.clearfix:after{display:block; clear:both; content:"";}
.clearfix{zoom:1;}
li{width:100px; height:100px; background:red; margin:10px; border:1px solid blue; float:left;}
//布局
<input type="button" value="按钮" id="btn1" />
<ul id="ul1" class="clearfix">
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
 </ul>
//js代码
DOMReady(function(){
    var oBtn = document.getElementById('btn1');
    var oUl = document.getElementById('ul1');
    var aLi = oUl.children;
    
    var arrPos = [];
    for(var i=0; i<aLi.length;i++){
        arrPos[i] = {left:aLi[i].offsetLeft,top:aLi[i].offsetTop};//获取每个运动元素的位置,存放于数组中;
    }
    for(var i=0; i<arrPos.length; i++){//把元素从新定位到本身的位置上,因为元素本身可能没有定位,在不好更改css样式的前提下对元素重新定位, 父级也需要定位position:relative; 宽高需要获取赋值,这里就不写了,实际中不写布局会乱的;要注意
        aLi[i].style.position = 'absolute';
        aLi[i].style.left = arrPos[i].left + 'px';
        aLi[i].style.top = arrPos[i].top + 'px';
        aLi[i].style.margin = '0';//这里要注意,不写整体会偏移,因为每个li都有自己的margin属性,在给left和top赋值之后,浏览器会重新渲染margin属性,这样会布局就不能完全还原了;
    }
//随机函数m到n之间不包括n---------------------[m,n);运动的时候给每个li一个随机颜色
function rnd(m,n){
    return parseInt(Math.random()*(n-m)+m);
}
    
    var bOver = true;//定义一个开关,在没运动结束的时候点击按钮无效
    var timer = null;
    oBtn.onclick = function(){
        if(!bOver){return}
        var iNow = 0;
        bOver = false;//改变开关的值
        timer = setInterval(function(){
            (function(index){
                move(aLi[iNow],{width:0,height:0,opacity:0,left:0,top:0},{complete:function(){
                    if(index == aLi.length-1){//判断结束
                        for(var i=0; i<aLi.length; i++){
                            aLi[i].style.background = 'rgb('+rnd(0,256)+','+rnd(0,256)+','+rnd(0,256)+')';
                        }
                        iNow = aLi.length-1;
                        timer = setInterval(function(){
                            (function(index){
                                move(aLi[iNow],{width:100,height:100,opacity:100,left:arrPos[iNow].left,top:arrPos[iNow].top},{complete:function(){
                                    index == 0 && (bOver = true);//判断结束并修改开关值
                                }});
                            })(iNow);
                            iNow--;
                            iNow<0 && clearInterval(timer);
                        },100);
                    }
                }});
            })(iNow);
            iNow++;
            iNow>=aLi.length && clearInterval(timer);
        },100);
    };
});
上一篇 下一篇

猜你喜欢

热点阅读