Die Wurzel des Karussells ist eigentlich die Kapselung der Beschleunigungsfunktion. Wenn das Karussell ein fahrendes Auto ist, dann ist die Beschleunigungsfunktion sein Motor. Heute führt Sie dieser Artikel von der einfachen Kapselung zu Ihrer eigenen Beschleunigungsfunktion ~
Wir beginnen aus der Perspektive der Nachfrage. Geben Sie zunächst eine einfache Anforderung:
1. Ich möchte, dass sich ein Feld auf der Seite mit gleichmäßiger Geschwindigkeit bewegt die richtige Bewegung auf 200px?
Analyse:
1) Wir müssen wissen, wo sich die Box befindet, was über das Attribut offsetLeft erhalten werden kann.
2) Damit sich die Box konstant bewegt Geschwindigkeit, js ist auf jeden Fall erforderlich setInterval;
3) Soll die Box nach rechts laufen? Das bedeutet, dass Sie den Abstand zwischen der Box und dem Startpunkt auf der linken Seite ständig ändern müssen, einschließlich Rand links und Positionierung links. Hier habe ich mich dafür entschieden, die absolute Positionierung links zu ändern von 200 Pixeln vom Startpunkt aus. Wenn wir aufhören möchten, verwenden Sie einfach clearInterval.
Dann gehen wir direkt zum Code
2. Ein vorläufiger Bewegungseffekt wurde erreicht, dann haben wir die Anforderungen verbessert:<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>Document</title> <style type="text/css"> * { margin: 0; padding: 0; } div { position: absolute; top: 50px; width: 100px; height: 100px; background-color: red; } input { width: 100px; height: 30px; color: #fff; background-color: yellowgreen; } </style> </head> <body> <div></div> <input type="button" value="移动到200" /> <script type="text/javascript"> // 获取到元素(这里有个小细节,如果给元素设置了id名,即便不使用获取元素的方法,也能通过这个id名获取到元素哦~~大家可以自己尝试一下) var btn = document.querySelector('input'), dv = document.querySelector('div'); // 添加点击事件 btn.addEventListener('click',function() { var timer = null,// 保存定时器 currentDistance = dv.offsetLeft, // 当前离父盒子的距离 step = 8,// 每次改变的距离 target = 200;// 目标距离 timer = setInterval(function() { currentDistance += step;// 当前距离 = 上一个当前距离 + 改变的距离 if((target - currentDistance) < step) { currentDistance = target; // 如果目标距离与当前距离的差小于了要改变的距离,这时候我们就直接让当前距离等于目标距离,防止盒子停下来的时候有误差 clearInterval(timer); // 清楚定时器 timer = null; // 将timer解绑,释放内存 } dv.style.left = currentDistance + 'px'; // 最核心的一步,改变盒子的left为当前距离 },17) }) </script> </body> </html>
Die Box wird auf 200 Pixel verschoben Positionierung möchten wir, dass sich die Box weiter auf die Position 400px bewegt?
Analyse:
1). sind zwei Bewegungen, aber die Funktionen, die sie verwenden, sind dieselben, sie bewegen sich von einem Punkt zum anderen, daher erwägen wir, die Bewegung in 1 in eine Funktion zur Wiederverwendung zu kapseln.
Code~
3. Wir haben die Funktion zum Vor- und Zurückbewegen der Box gekapselt, aber denken wir noch einmal über den Scrolleffekt des Karussells nach. Es bewegt sich nicht Eine konstante Geschwindigkeit, aber mit einer konstanten Geschwindigkeit. Es ist zunächst sehr holprig und verlangsamt sich dann allmählich, wenn der Bildlauf abgeschlossen ist. Anforderungen: Erleichterung der Box (d. h. Bewegung mit variabler Geschwindigkeit)<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>Document</title> <style type="text/css"> * { margin: 0; padding: 0; } div { position: absolute; top: 50px; width: 100px; height: 100px; background-color: red; } input { width: 100px; height: 30px; color: #fff; background-color: yellowgreen; } </style> </head> <body> <div></div> <input type="button" value="移动到200" /> <input type="button" value="移动到400" /> <script type="text/javascript"> // 封装函数,盒子和目标距离都是不确定的,我们可以将他们作为参数传递。 function animation(tag,target) { var timer = null, currentDistance = tag.offsetLeft, step = 5; step = currentDistance < target? step: -step;// 判断step的正负,200到400时是递增,400到200时是递减 timer = setInterval(function() { if(Math.abs(currentDistance - target) > Math.abs(step)) { // 这里判断条件也要略作改动,使用绝对值进行比较 currentDistance += step; / tag.style.left = currentDistance + 'px'; }else { tag.style.left = target + 'px' // 当当前距离与目标距离之间的差值小于step改变的距离时,我们直接让盒子移动到目标距离。 clearInterval(timer); timer = null; } },17) } var btns = document.querySelectorAll('input'), dv = document.querySelector('div'); btns[0].addEventListener('click',function() { animation(dv,200); }) btns[1].addEventListener('click',function() { animation(dv,400); }) </script> </body> </html>
Laden Sie den Code hoch~
Okay, die grundlegendste Erleichterung, die für ein Karussellbild erforderlich ist Funktion ist abgeschlossen~ Hier ist eine vollständigere Beschleunigungsfunktion: Ihre Funktion ist umfassender und kann mehrere Stile gleichzeitig ändern.function animation(tag,target) { var timer = null; timer = setInterval(function() { var currentDistance = tag.offsetLeft, step = (target - currentDistance) / 5;// 通过目标距离与当前距离的差除以5便达到了我们需要的变速运动,因为step每次定制器执行都要改变,所以放入定时器内 step = step > 0 ? Math.ceil(step):Math.floor(step);// 这里如果将currentDistance定时器外面声明可以不用写,如果放在定时器内声明,因为offsetLeft取整的特性,要对step进行取整 if(Math.abs(currentDistance - target) > Math.abs(step)) { currentDistance += step; tag.style.left = currentDistance + 'px'; }else { tag.style.left = target + 'px' clearInterval(timer); timer = null; } },17)
Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er zum Lernen aller beiträgt. Ich hoffe auch, dass jeder die PHP-Chinesisch-Website unterstützt.
function perfectAnimate(tag, obj, fn) {// 传三个参数,运动的盒子,对象(可以传多个属性),回调函数(在执行完后可以再执行自定义的功能) clearInterval(tag.timer);// 这里将定时器作为tag标签的属性保存,可以多次调用函数清除上一个定时器。 tag.timer = setInterval(function () { var flag = true; for (var k in obj) { // 因为并不是所有属性都带px单位,所以这里进行判断分别设置 if (k == 'opacity') { var currentDistance = getStyle(tag, k) * 100, target = obj[k] * 100, step = (target - currentDistance) / 10; step = step > 0 ? Math.ceil(step) : Math.floor(step); currentDistance += step; tag.style[k] = currentDistance / 100; } else if (k == 'zIndex') { tag.style[k] = obj[k]; else { var currentDistance = parseInt(getStyle(tag, k)) || 0, target = obj[k], step = (target - currentDistance) / 10; step = step > 0 ? Math.ceil(step) : Math.floor(step); currentDistance += step; tag.style[k] = currentDistance + 'px'; } if (target != currentDistance) { flag = false // 只要还有属性没有运动完成,就不会清楚定时器 } } if (flag) { clearInterval(tag.timer) fn && fn();// 所有定时器走完,这里执行回调函数,短路操作避免不传回调函数也不会报错。 } }, 17) }
// 获取样式的兼容函数,上面的缓动函数的依赖 function getStyle(tag, attr) { if (tag.currentStyle) { return tag.currentStyle[attr]; } else { return getComputedStyle(tag, null)[attr]; } }