• 原生javascript 元素依次掉落及上升


    一、实现原理:

    ① 通过onoff开关,判断元素是往下走 还是往上走,并在每次清除定时器后,把onoff 设为 !onoff,以便下次点击做判断

    ②move函数的运用

    二、代码

    <!DOCTYPE html>
    <html>
    <head>
    <title></title>
    <style type="text/css">
    *{ margin:0;padding: 0;}
    div{position: absolute; width:40px; height:40px; background: red; top: 0}
    </style>
    </head>
    <body>
    <div></div>
    
    <script type="text/javascript">
        window.onload = function(){
            var box = document.getElementsByTagName('div'); //动态获取未来元素
            var len = 16;
            var str = '';
            var timer = null;
            var num = 0;
            var onoff = true; //点击开关
    
            // 动态生成div标签
            for (var i = 0; i < len; i++) {
                str += "<div style='left:"+(i*50)+"px;'></div>"
            }
            document.body.innerHTML = str;
    
            document.onclick = function(){
                // 清除定时器
                clearInterval(timer);
                
                // 判断往下还是往上
                if(onoff){
                    // 开启定时器,让元素挨个往下掉
                    timer = setInterval(function(){
                        move(box[num],'top',10,500);
                        num++;
                        // 当最后一个掉完,清除定时器,并把开关设为false,把num重置为0
                        if(num == len){
                            clearInterval(timer);
                            onoff = !onoff;
                            num = 0;
                        }
                    },100)
                }else{
                    // 开启定时器,让元素挨个往上走
                    timer = setInterval(function(){
                        move(box[num],'top',10,0);
                        num++;
                        // 当最后一个升完,清除定时器,并把开关设为true,把num重置为0
                        if(num == len){
                            clearInterval(timer);
                            onoff = !onoff;
                            num = 0;
                        }
                    },100)
                }
            }
    
    
            /*
                obj:要运动的元素
                attr:属性
                dir:步长
                target:目标点
                endFn:回调函数
            */
            function move(obj,attr,dir,target,endFn){
                
                //根据元素当前位置和目标点的比较,动态设置步长为正数或负数
                dir = parseInt( getStyle(obj,attr) ) < target ? dir : -dir;
    
                // 1、清除定时器
                clearInterval(obj.timer);
                // 2、设置定时器
                obj.timer = setInterval(function(){
                    // 3、获取元素当前位置+步长
                    var speed = parseInt( getStyle(obj,attr) )  + dir;
                    // 4、如果元素当前位置超过目标点,则把当前位置==目标点
                    if( speed > target && dir > 0 || speed < target && dir < 0){
                        speed = target
                    }
                    // 5、设置元素位置
                    obj.style[attr] = speed + 'px';
                    // 6、判断是否到达目标点,如果到达则停止定时器
                    if(speed == target){
                        clearInterval(obj.timer);
                        // 回调函数,如果endFn存在则执行
                        endFn && endFn();
                    }
    
                },20)
            }
    
            /*
                获取非行间样式:
                标准浏览器下 getComputedStyle(obj)[attr]
                IE浏览器下   obj.currentStyle[attr]
            */
    
            function getStyle(obj,attr){
                return obj.currentStyle ? obj.currentStyle[attr] : getComputedStyle(obj)[attr];
            }
            
        }
    </script>
    </body>
    </html>
      
  • 相关阅读:
    创建线程的方式三:实现Callable接口 --- JDK 5.0新增
    线程的通信
    多线程的实例练习:银行账户双储户问题
    解决线程安全问题的方式三:Lock锁 --- JDK5.0新增
    演示线程的死锁问题
    Synchronized的各场景使用方法(多窗口售票例子接上篇)
    线程的【生命周期】和【线程的同步】(下面有多窗口售票例子)
    多线程:继承方式和实现方式的联系与区别
    创建多线程的方式二:实现Runnable接口
    Java项目生成可执行jar包、exe文件以及在Windows下的安装文件
  • 原文地址:https://www.cnblogs.com/javascripter/p/9856731.html
Copyright © 2020-2023  润新知