div位置变化——点击按钮div块前进/后退
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>无标题文档</title> <style> #div1 { width:100px; height:100px; background:red; position:absolute; top:50px; left:30px; } </style> </head> <body> <input id="btn1" type="button" value="往后" /> <input id="btn2" type="button" value="往前" /> <div id="div1"></div> <script> var oBtn1 = document.getElementById('btn1'); var oBtn2 = document.getElementById('btn2'); var oDiv = document.getElementById('div1'); oBtn1.onclick = function () { doMove ( oDiv, -12, 10 ); //封装好的函数 }; oBtn2.onclick = function () { doMove ( oDiv, 12, 800 ); }; function doMove ( obj, dir, target ) { //obj代表哪个元素移动、dir代表往前往后的速度、target代表目标点的像素大小 clearInterval( obj.timer ); obj.timer = setInterval(function () { var speed = parseInt(getStyle( obj, 'left' )) + dir; // 获取元素距离左侧的像素值加上速度值 if ( speed > target && dir > 0 ) { // 往前跑,如果跑的距离大于给定的距离并且是正数 speed = target; //停止在给定距离不动 } if ( speed < target && dir < 0 ) { // 往后跑,如果跑得距离小于给定距离并且是负数 speed = target; } obj.style.left = speed + 'px'; if ( speed == target ) { //当距离等于给定距离清除移动的函数,停止移动 clearInterval( obj.timer ); } }, 30); } function getStyle ( obj, attr ) { return obj.currentStyle?obj.currentStyle[attr] : getComputedStyle( obj )[attr]; } //封装的获取元素属性(left)的函数 </script> </body> </html>
改进后,可以上下左右移动,:
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>无标题文档</title> <style> #div1 { width:100px; height:100px; background:red; position:absolute; top:50px; left:30px; } </style> </head> <body> <input id="btn1" type="button" value="往上" /> <input id="btn2" type="button" value="往下" /> <div id="div1"></div> <script> var oBtn1 = document.getElementById('btn1'); var oBtn2 = document.getElementById('btn2'); var oDiv = document.getElementById('div1'); oBtn1.onclick = function () { doMove ( oDiv, 'top', 12, 40 ); }; oBtn2.onclick = function () { doMove ( oDiv, 'top', 12, 500 ); }; function doMove ( obj, attr, dir, target ) { //obj元素、attr上下左右、dir速度、target目标位置 dir = parseInt(getStyle( obj, attr )) < target ? dir : -dir; //如果位置小于目标距离target速度dir就是正数、否则就是负数。程序控制,不用用户自己控制 clearInterval( obj.timer ); obj.timer = 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.timer ); } }, 30); } function getStyle ( obj, attr ) { return obj.currentStyle?obj.currentStyle[attr] : getComputedStyle( obj )[attr]; } </script> </body> </html>
再改进后,点击移动先右移再下移
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>无标题文档</title> <style> #div1 { width:100px; height:100px; background:red; position:absolute; top:50px; left:30px; } </style> </head> <body> <input id="btn1" type="button" value="走" /> <div id="div1"></div> <script> var oBtn1 = document.getElementById('btn1'); var oDiv = document.getElementById('div1'); oBtn1.onclick = function () { doMove ( oDiv, 'left', 12, 900, function () { //回调函数,右移执行完毕下移的函数 doMove ( oDiv, 'top', 34, 500 ); }); }; function doMove ( obj, attr, dir, target, endFn ) { //endFn是回调函数,可以有也可以没有,下面有判断 dir = parseInt(getStyle( obj, attr )) < target ? dir : -dir; clearInterval( obj.timer ); obj.timer = 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.timer ); /* if ( endFn ) { endFn(); } */ endFn && endFn(); //如果回调函数存在不是undefined,就执行 } }, 30); } function getStyle ( obj, attr ) { return obj.currentStyle?obj.currentStyle[attr] : getComputedStyle( obj )[attr]; } </script> </body> </html>