Heim >Web-Frontend >js-Tutorial >JavaScript implementiert den Fensterschütteleffekt
Prinzipielle Einführung
Jitter ist eigentlich eine spezielle Form der Hin- und Herbewegung, mit der Ausnahme, dass die Hin- und Herbewegung eine unendliche Bewegung ohne Reibung ist und auf der Geschwindigkeit basiert, während Jitter auf der Position basiert der Ausgangspunkt
Der häufigste Dithering-Effekt auf Webseiten sollte die Fenster-Dithering-Eingabeaufforderung sein
Das Dithering-Element beginnt am Startpunkt. Verschieben Sie zuerst das Maximale Entfernung nach rechts und dann Bewegung in die symmetrische linke Position; dann Bewegung in eine etwas kleinere Entfernung nach rechts und Bewegung in die symmetrische linke Position; in diesem Zyklus stoppt das letzte Element am Startpunkt
Code-Implementierung
Bei der Code-Implementierung ist Dithering nichts anderes als die Verwendung eines Timers, um den linken oder oberen Wert in regelmäßigen Abständen zu ändern
Bei der Bewegungsimplementierung gibt es zwei Ideen für Abstandsänderungen .
Idee 1
div.style.left = div.offsetLeft + value;
Erhalten Sie jedes Mal den aktuellen Stil des Elements und berechnen Sie ihn dann mit dem geänderten Wert
Idee 2
left = div.offsetLeft; ...... div.style.left = left + value;
Rufen Sie vor dem Start des Timers den anfänglichen Stil des Elements ab und berechnen Sie ihn dann mit dem geänderten Wert.
Verwenden Sie aus Sicht der Jitter-Implementierung die zweite Methode, um die Abstandsänderung vollständig auf dem Wert zu belassen Relativ einfach
Daher besteht der Schlüssel zur Codeimplementierung darin, zu verstehen, wie sich der Wert ändert
Angenommen, die weiteste Entfernung ist das Ziel und das Entfernungsintervall in derselben Richtung ist der Schritt . Wenn man den Wert intuitiver mit Zahlen ausdrückt, ähnelt er 4, -4, 2, -2, 0. Daher ist eine variable Richtung erforderlich, um die Startrichtung des Schüttelns zu steuern. Die Richtung muss jedes Mal geändert werden, wenn sich der Timer bewegt
//定时器开启前的变量声明 dir = 1; step = 0; left = div.offsetLeft //定时器里面的代码 value = dir*(target - step); if(step >= target){ step = target } div.style.left = left + value + 'px'; if(dir === -1){ step++; } dir = -dir;
Kapseln Sie den Schütteleffekt als shakeMove.js
function getCSS(obj,style){ if(window.getComputedStyle){ return getComputedStyle(obj)[style]; } return obj.currentStyle[style]; } function shakeMove(json){ //声明要进行抖动的元素 var obj = json.obj; //声明元素抖动的最远距离 var target = json.target; //默认值为20 target = Number(target) || 20; //声明元素的变化样式 var attr = json.attr; //默认为'left' attr = attr || 'left'; //声明元素的起始抖动方向 var dir = json.dir; //默认为'1',表示开始先向右抖动 dir = Number(dir) || '1'; //声明元素每次抖动的变化幅度 var stepValue = json.stepValue; stepValue = Number(stepValue) || 2; //声明回调函数 var fn = json.fn; //声明步长step var step = 0; //保存样式初始值 var attrValue = parseFloat(getCSS(obj,attr)); //声明参照值value var value; //清除定时器 if(obj.timer){return;} //开启定时器 obj.timer = setInterval(function(){ //抖动核心代码 value = dir*(target - step); //当步长值大于等于最大距离值target时 if(step >= target){ step = target } //更新样式值 obj.style[attr] = attrValue + value + 'px'; //当元素到达起始点时,停止定时器 if(step == target){ clearInterval(obj.timer); obj.timer = 0; //设置回调函数 fn && fn.call(obj); } //如果此时为反向运动,则步长值变化 if(dir === -1){ step = step + stepValue; } //改变方向 dir = -dir; },50); }
Beispielanwendung
Im Folgenden wird der gekapselte shakeMove verwendet, um einige einfache Schüttelanwendungen zu implementieren
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Document</title> <style> .test{ height: 50px; width: 50px; position: absolute; top: 50px; } </style> </head> <body> <div id="box"> <div style="left:10px;background:lightblue"></div> <div style="left:70px;background:lightgreen"></div> <div style="left:130px;background:pink"></div> <div style="left:190px;background:lightcoral"></div> <div style="left:250px;background:orange"></div> </div> <script src="http://files.cnblogs.com/files/xiaohuochai/shakeMove.js"></script> <script> var aDiv = box.getElementsByTagName('div'); for(var i = 0; i < aDiv.length; i++){ aDiv[i].onmouseover = function(){ shakeMove({obj:this,attr:'top'}); } } </script> </body> </html>