/** * 通用动画函数 * @param opts {Object} 动画所需参数 * @param opts.delay {number} 动画两帧之间的间隔,单位为ms * @param opts.duration {number} 动画总时长,单位为ms * @param opts.delta {function} 时间进度到动画进度的映射函数, * 参数为[0,1]之间的时间进度,返回值为[0,1]之间的动画进度 * @param opts.step {function} 实际执行动画帧状态修改的函数, * 参数为动画进度delta,然后执行所需的操作 **/ function animate(opts) { var start = new Date(); var id = setInterval(function () { var timePassed = new Date() - start; var progress = timePassed / opts.duration; if (progress > 1) { progress = 0; } var delta = opts.delta(progress); opts.step(delta); if (progress === 1) { clearInterval(id); } }, opts.delay || 10); } /** * 移动一个元素的动画 * @param element {HTMLElement} 需要动画移动的元素 * @param delta {function} 时间进度到动画进度的映射函数 * @param duration {number} 动画总时长 **/ function move(element, delta, duration) { var to = 500; animate({ delay: 10, duration: duration || 1000, delta: delta, step: function (delta) { element.style.left = to * delta + 'px'; } }); } var p = document.querySelector('.example_path'); var c = document.querySelector('.example_block'); p.addEventListener('click', function () { move(c, function (p) { return p; }); }, false);
.example_path{ position:relative; overflow:hidden; width:530px; height:30px; border:3px solid #000; } .example_path .example_block { position:absolute; background-color:blue; width:30px; height:20px; padding-top:10px; text-align:center; color:#fff; font-size:10px; white-space:nowrap; }
<h2>点击下面的元素开始动画</h2> <div class="example_path"> <div class="example_block"></div> </div>