この記事の例では、jQuery によって実装された分子運動ボール衝突エフェクトについて説明します。参考のために皆さんと共有してください。詳細は次のとおりです:
まずレンダリングを見てみましょう。ボールが動いているので、スクリーンショットを撮るのは難しいです。実際の効果を確認したい場合は、ルートの大まかな輪郭を描きます。それを貼り付けて自分で実行します:
ボールが少し小さいですが、細かいところまでは書いてませんが、完璧に仕上げたい場合は、自分で対処できます。これがシミュレーションの理想的な状態です。分子間の摩擦や衝突がありません。ハイテクですね。
コードはまだ整理されていませんので、興味のある方はオブジェクト指向形式に整理してみてください。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> <script src="jquery-1.7.1.min.js" type="text/javascript"></script> <script type="text/javascript" > var dim_half_past_PI = dimAngle(Math.PI / 2); // Math.PI/2的约数 var lastAngle = dimAngle(Math.PI/8); // 发射角度(0-dimAngle(Math.PI)) var v = 120; //飞行速度【>0】 var lastPosition = {}; // 最后一次碰撞坐标 var lastTime = ""; // 最后一次碰撞时间 var lastDirection = "top"; // 开始发射方向(top,bottom,left,right) var horizen = 1; // 水品方向的积数 var vertical = 1; // 竖直方向的积数 var box = {}; function dimAngle(angle) { var tempAngle = angle + ""; return parseFloat(tempAngle.substring(0, 6)); } function getWillDirection(position, box) { var direction = lastDirection; if (position.x < box.left) { direction = "right"; } if (position.x > box.right) { direction = "left" } if (position.y < box.top) { direction = "bottom"; } if (position.y > box.bottom) { direction = "top"; } return direction; } function getScale(direction, angle) { switch(direction){ case "top": vertical = -1; if (angle < dim_half_past_PI) { horizen = 1; } if (angle > dim_half_past_PI) { horizen = -1; } if (angle == dim_half_past_PI) { horizen = 0; } break; case "left": horizen = -1; if (angle > dim_half_past_PI) { vertical = 1; } if (angle < dim_half_past_PI) { vertical = -1; } if (angle == dim_half_past_PI) { vertical = 0; } break; case "bottom": vertical = 1; if(angle > dim_half_past_PI) { horizen = 1; } if(angle < dim_half_past_PI) { horizen = -1; } if(angle == dim_half_past_PI) { horizen = 0; } break; case "right": horizen = 1; if (angle > dim_half_past_PI) { vertical = -1; } if (angle < dim_half_past_PI) { vertical = 1; } if (angle == dim_half_past_PI) { vertical = 0; } break; } } function getOutAngle(inAngle) { if (inAngle == dim_half_past_PI || inAngle == 0) { return inAngle; } else { return dim_half_past_PI - inAngle; } } function setPosition(obj, position) { obj.css({ "left": position.x +"px", "top": position.y +"px"}); } function run(obj) { var vx = Math.cos(lastAngle) * v; var vy = Math.sin(lastAngle) * v; var runTime = (new Date().getTime() - lastTime) / 1000; getScale(lastDirection, lastAngle); var sx = vx * runTime * horizen; var sy = vy * runTime * vertical; var position = { x: lastPosition.x + sx, y: lastPosition.y + sy }; setPosition(obj, position); var currentDirection = getWillDirection(position, box); console.log(currentDirection +":"+lastDirection+":"+vertical+":"+horizen+":"+lastAngle+":"+dim_half_past_PI); // 如果没有发生碰撞 if (currentDirection != lastDirection) { // 如果发生了碰撞 lastDirection = currentDirection; lastPosition = position; lastTime = new Date().getTime(); lastAngle = getOutAngle(lastAngle); } setTimeout(function () { run(obj); }, 30); } $(document).ready(function () { var boxer = $("#box"); var x = parseInt(boxer.offset().left); var y = parseInt(boxer.offset().top); box = { left: x, top: y, right: x + boxer.width(), bottom: y + boxer.height() }; var runner = $("#runner"); lastTime = new Date().getTime(); lastPosition = { x: x, y: y + boxer.height() }; run(runner); }); </script> <style type="text/css" > body { margin:0; padding:0; } #box { margin:0 auto; width:500px; height:500px; border:3px solid #DDDDDD; border-radius:4px; -wekit-border-radius:4px; -moz-border-radius:4px;} #runner { width:10px; height:10px; font-size:10px; color:black; padding:0; position:absolute; left:100px; top:480px;} </style> </head> <body> <div id="box"> <div id="runner">●</div> </div> </body> </html>
jQuery の一般的な古典的な特殊効果の概要」および「jQuery アニメーションの概要」を参照してください。および特殊効果の使用"
この記事が jQuery プログラミングのすべての人に役立つことを願っています。