過去 6 時間、質問に対する答えを見つけようとしましたが、運がありませんでした。
Web サイトにドラッグ可能な div がいくつかあります。ドラッグしている間は、空気圧がかかって少し押されるようなリアルな効果が欲しいので、ドラッグすると少し揺れます。
効果がどのように機能するかの例の画像は、ここで見ることができます:慣性加速効果(効果が何と呼ばれるかわかりません)
これらの単語をさまざまな組み合わせで「Javascript、加速度、慣性、スイング、物理学、回転、移動、空気圧、摩擦、ぶら下がり」で検索しましたが、何も見つかりませんでした。
ただし、この JSFiddle[ 1 ] にも同様の効果があることがわかりました (以下のリンク)。また、要素をドラッグしてマウスを横に移動すると、実現したい効果がある Google Gravity[2] (以下のリンク) にも出会いました。
[ 1 ] 私が見つけた JSFiddle: www.jsfiddle.net/gVCWE/150/
[ 2 ] Google 重力: www.mrdoob.com/projects/chromeexperiments/google-gravity/
ここで自分で効果を作成しようとしました:
var fn = {
activeElm : null,
pos : {},
transPos : {},
startPos : null,
moveSteps : new Array(15),
init : function(){
var self = this;
document.addEventListener('mousedown', function(e){self.handleStart.call(self, e);});
document.addEventListener('mousemove', function(e){self.handleMove.call(self, e);});
document.addEventListener('mouseup', function(e){self.handleStop.call(self, e);});
},
handleStart : function(e){
if(fn.hasClass('dragme', e.target)){
fn.activeElm = e.target;
e.preventDefault();
fn.startPos = {x : e.pageX, y : e.pageY};
var lastPos = {x : fn.activeElm.getAttribute('data-posX'), y : fn.activeElm.getAttribute('data-posY')};
if(lastPos['x'] && lastPos['y']){
fn.transPos = {x : parseFloat(lastPos['x']), y : parseFloat(lastPos['y'])};
}else{
fn.transPos = {x : 0, y : 0};
}
fn.pos = {x : fn.transPos['x'], y : fn.transPos['y']};
fn.loop();
}
},
handleMove : function(e){
if(!fn.activeElm)
return;
fn.pos = {x : fn.transPos['x'] + e.pageX - fn.startPos['x'], y : fn.transPos['y'] + e.pageY - fn.startPos['y']};
},
handleStop : function(e){
if(!fn.activeElm)
return;
fn.activeElm.setAttribute('data-posX', fn.pos['x']);
fn.activeElm.setAttribute('data-posY', fn.pos['y']);
fn.activeElm = null;
},
addStep : function(move){
var arr = fn.moveSteps;
arr = arr.slice(1, arr.length);
arr.push(move);
fn.moveSteps = arr;
},
loop : function(){
if(!fn.activeElm)
return false;
fn.requestAnimFrame(fn.loop);
fn.addStep(fn.pos['x']);
fn.animate();
},
animate : function(){
var arr = fn.moveSteps;
var rotaSpeed = arr[arr.length-1] - arr[0];
// The Math.min- and max are there, so we can be sure the angle won't rotate more than 90° and -90°
var rotation = 'rotate(' + Math.max(Math.min(90, rotaSpeed), -90) + 'deg)';
if(!fn.activeElm)
return;
var obj = fn.activeElm.parentNode.style;
obj.webkitTransform = obj.MozTransform = obj.msTransform = obj.OTransform = obj.transform = 'translate(' + fn.pos['x'] + 'px, ' + fn.pos['y'] + 'px) ' + rotation;
},
requestAnimFrame : function(callback){
return window.requestAnimationFrame && window.requestAnimationFrame(callback) ||
window.webkitRequestAnimationFrame && window.webkitRequestAnimationFrame(callback) ||
window.mozRequestAnimationFrame && window.mozRequestAnimationFrame(callback) ||
window.oRequestAnimationFrame && window.mozRequestAnimationFrame(callback) ||
window.msRequestAnimationFrame && window.msRequestAnimationFrame(callback) ||
window.setTimeout(callback, 1000 / 60);
},
hasClass : function(classname, obj){
return new RegExp(' ' + classname + ' ').test(' ' + obj.className + ' ');
}
}
fn.init();
- 私がすること: 過去 15 回のマウスの移動中にマウスがどれだけ移動したかを計算し、回転角度をその値に設定します。そのため、マウスが速く動くと、15 回のマウスの動きの間のスパンが大きくなり、ボックスの回転が大きくなります。マウスがゆっくり動くと、スパンが小さくなり、ボックスの回転が以前ほど大きくなくなります。
ただし、特にマウスを速く動かしている場合は、結果がリアルに見えません。関数 Math.sin は、div が移動するときに回転をより現実的に「容易にする」ために必要だと思います。この物理を計算する方法がわからないので、アイデア、情報源、例、式など、効果の名前を知っている人がいれば、それは素晴らしいことです.
//よろしくお願いします