迟缓动画的原理
迟缓动画就是让元素的静止速度有所变动,最常见的迟缓动画就是让动画速度缓缓停下来
外围思路
- 让盒子每次挪动的间隔缓缓变小,速度就会缓缓变小
- 外围算法:(目标值-当初的地位)/10 作为每次挪动的间隔步长
- 进行的条件:让盒子以后的地位等于指标的地位,就进行定时器
- 留神步长值须要取整
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> * { margin: 0; padding: 0; } button { margin: 50px; } img { position: absolute; display: block; width: 200px; height: 200px; border-radius: 50%; } </style></head><body> <button>点击挪动至800</button> <button>点击挪动至0</button> <img src="./image/头像.jpg" alt=""> <script> var bth = document.querySelectorAll('button'); var img = document.querySelector('img') // obj:指标对象 target:指标地位 function aniamte(obj, target) { // 革除以前的定时器,只保留以后的计时器 clearInterval(obj.timer); obj.timer = setInterval(function() { // 如果步长为正值 则取大 如果步长为负值 则取小 var step = (target - obj.offsetLeft) / 10; step = step > 0 ? Math.ceil(step) : Math.floor(step); // 判断:如果指标对象的地位等于指标地位,则革除定时器 if (obj.offsetLeft == target) { clearInterval(obj.timer) } obj.style.left = obj.offsetLeft + step + "px" }, 15); } // 进行调用 bth[0].addEventListener('click', function() { aniamte(img, 800) }) bth[1].addEventListener('click', function() { aniamte(img, 0) }) </script></body></html>
迟缓动画增加回调函数
外围思路:回调函数要增加到定时器完结的地位
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> * { margin: 0; padding: 0; } button { margin: 50px; } img { position: absolute; display: block; width: 200px; height: 200px; border-radius: 50%; } .photo { width: 500px; height: 500px; } </style></head><body> <button>点击挪动至800</button> <button>点击挪动至0</button> <img src="./image/头像.jpg" alt="" class="img"> <script> var bth = document.querySelectorAll('button'); var img = document.querySelector('img') // obj:指标对象 target:指标地位 function aniamte(obj, target, callback) { // 革除以前的定时器,只保留以后的计时器 clearInterval(obj.timer); obj.timer = setInterval(function() { // 如果步长为正值 则取大 如果步长为负值 则取小 var step = (target - obj.offsetLeft) / 10; step = step > 0 ? Math.ceil(step) : Math.floor(step); // 判断:如果指标对象的地位等于指标地位,则革除定时器 if (obj.offsetLeft == target) { clearInterval(obj.timer); // 回调函数要增加到定时器完结的地位 if (callback) { callback() } } obj.style.left = obj.offsetLeft + step + "px" }, 15); } // 进行调用 bth[0].addEventListener('click', function() { aniamte(img, 800, function() { img.className = 'img' }) }) bth[1].addEventListener('click', function() { aniamte(img, 0, function() { img.className = 'photo img' }) }) </script></body></html>
引进animate动画函数
animate.js文件
var bth = document.querySelectorAll('button');var img = document.querySelector('img') // obj:指标对象 target:指标地位function aniamte(obj, target, callback) { // 革除以前的定时器,只保留以后的计时器 clearInterval(obj.timer); obj.timer = setInterval(function() { // 如果步长为正值 则取大 如果步长为负值 则取小 var step = (target - obj.offsetLeft) / 10; step = step > 0 ? Math.ceil(step) : Math.floor(step); // 判断:如果指标对象的地位等于指标地位,则革除定时器 if (obj.offsetLeft == target) { clearInterval(obj.timer); // 回调函数要增加到定时器完结的地位 if (callback) { callback() } } obj.style.left = obj.offsetLeft + step + "px" }, 15);}// 进行调用bth[0].addEventListener('click', function() { aniamte(img, 800, function() { img.className = 'img' })})bth[1].addEventListener('click', function() { aniamte(img, 0, function() { img.className = 'photo img' })})
主文件
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> .sliderbar { position: fixed; right: 0; bottom: 100px; width: 40px; height: 40px; text-align: center; line-height: 40px; color: #fff; cursor: pointer; } .con { position: absolute; top: 0; left: 0; width: 200px; height: 40px; background-color: purple; z-index: -1; } </style> <script src="./animate.js"></script></head><body> <div class="sliderbar"> <span> ← </span> <div class="con">问题反馈</div> </div> <script> var sliderbar = document.querySelector('.sliderbar'); var con = document.querySelector('.con'); sliderbar.addEventListener('mouseenter', function() { aniamte(con, -160, function() { sliderbar.children[0].innerHTML = "→" }) }) sliderbar.addEventListener('mouseleave', function() { aniamte(con, 0, function() { sliderbar.children[0].innerHTML = "← " }) }) </script></body></html>