围绕鼠标旋转多个对象
Rotate multiple objects around mouse
我正在尝试让多个 div 围绕鼠标旋转。
我遇到的问题是所有对象都跟随第一个对象的旋转。我不知道如何让它们独立旋转。
有没有办法对使用相同 class 的所有对象使用相同的代码?
$(document).ready(function(){
var player = $('.drop');
//Checks to see which key is pressed down
$(window).on('mousemove', function (e) {
//Current position
var p1 = {
x: player.offset().left,
y: player.offset().top
};
//Future position
var p2 = {
x: e.offsetX,
y: e.offsetY
};
//Angle between them in degrees
var angleDeg = (Math.atan2(p2.y - p1.y, p2.x - p1.x) * 180 / Math.PI) - 90;
if(angleDeg >= 360){
angleDeg -= 360;
}
//Animate the whole thing
player.css('-webkit-transform', 'rotate(' + angleDeg + 'deg)');
});
});
http://codepen.io/thalesribeiro/pen/egVgpp
干杯,
泰雷兹
您需要在 document
而不是单个 div
元素上设置 mousemove
事件处理程序,以便在页面上的任何位置移动都会触发 div 跟随鼠标.
此外,要让每个 div
以自己的半径跟踪鼠标,需要循环所有 div
元素,以便可以对每个元素进行单独计算。
由于循环,设置了一个闭包,为了避免闭包带来的范围共享,变量声明从 var
更改为 let
。
查看代码以获得对此的评论。
$(function(){
var player = $('window');
// Give the document a mousemove event handler
$(document).on('mousemove', function (e) {
// If we are hovering over one of the div elements, exit the function
if(e.target.nodeName === "DIV"){ return; }
// Loop through each div and set its rotation separately from each other one
$(".drop").each(function(){
// Declare all variables using "let" instead of "var" to avoid closure side-effects
// of scope sharing
// Current position
let p1 = {
x: $(this).offset().left,
y: $(this).offset().top
};
// Future position
let p2 = {
x: e.offsetX,
y: e.offsetY
};
// Angle between them in degrees
let angleDeg = (Math.atan2(p2.y - p1.y, p2.x - p1.x) * 180 / Math.PI) - 90;
if(angleDeg >= 360){
angleDeg -= 360;
}
// Just move the div that we're looping over at the moment
$(this).css('-webkit-transform', 'rotate(' + angleDeg + 'deg)');
});
});
});
body{ background:#ccc; }
.container { width:75%; margin:10% auto 0 auto; }
.drop{
background:red;
width:10px;
height:50px;
margin:35px;
float:left;
}
.other {
background:blue;
width:10px;
height:50px;
margin:25px;
float:left;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<body>
<div class="container">
<div class="drop"></div>
<div class="drop"></div>
<div class="drop"></div>
<div class="drop"></div>
<div class="drop"></div>
<div class="drop"></div>
<div class="drop"></div>
<div class="other"></div>
<div class="other"></div>
</div>
</body>
我之前小规模修复过这个问题,但是当我把它添加到我的实际项目代码中时,它发生了冲突。我创建了它的另一个版本,但我再次努力使代码更智能并且它在浏览器中变得有点慢,所以我想知道是否有办法让它更轻。
function rotateOnMouse(e, pw) {
var offset = pw.offset();
var center_x = (offset.left) + ($(pw).width() / 2);
var center_y = (offset.top) + ($(pw).height() / 2);
var mouse_x = e.pageX;
var mouse_y = e.pageY;
var radians = Math.atan2(mouse_x - center_x, mouse_y - center_y);
var degree = (radians * (180 / Math.PI) * -1);
$(pw).css('-moz-transform', 'rotate(' + degree + 'deg)');
$(pw).css('-webkit-transform', 'rotate(' + degree + 'deg)');
$(pw).css('-o-transform', 'rotate(' + degree + 'deg)');
$(pw).css('-ms-transform', 'rotate(' + degree + 'deg)');
}
$(document).mousemove(function(e) {
$(document).bind('mousemove.rotateImg', function(e2) {
rotateOnMouse(e2, $('#arrowD1'));
});
$(document).bind('mousemove.rotateImg', function(e2) {
rotateOnMouse(e2, $('#arrowD2'));
});
$(document).bind('mousemove.rotateImg', function(e2) {
rotateOnMouse(e2, $('#arrowD3'));
});
$(document).bind('mousemove.rotateImg', function(e2) {
rotateOnMouse(e2, $('#arrowD4'));
});
$(document).bind('mousemove.rotateImg', function(e2) {
rotateOnMouse(e2, $('#arrowD5'));
});
$(document).bind('mousemove.rotateImg', function(e2) {
rotateOnMouse(e2, $('#arrowD6'));
});
});
我正在尝试让多个 div 围绕鼠标旋转。
我遇到的问题是所有对象都跟随第一个对象的旋转。我不知道如何让它们独立旋转。
有没有办法对使用相同 class 的所有对象使用相同的代码?
$(document).ready(function(){
var player = $('.drop');
//Checks to see which key is pressed down
$(window).on('mousemove', function (e) {
//Current position
var p1 = {
x: player.offset().left,
y: player.offset().top
};
//Future position
var p2 = {
x: e.offsetX,
y: e.offsetY
};
//Angle between them in degrees
var angleDeg = (Math.atan2(p2.y - p1.y, p2.x - p1.x) * 180 / Math.PI) - 90;
if(angleDeg >= 360){
angleDeg -= 360;
}
//Animate the whole thing
player.css('-webkit-transform', 'rotate(' + angleDeg + 'deg)');
});
});
http://codepen.io/thalesribeiro/pen/egVgpp
干杯, 泰雷兹
您需要在 document
而不是单个 div
元素上设置 mousemove
事件处理程序,以便在页面上的任何位置移动都会触发 div 跟随鼠标.
此外,要让每个 div
以自己的半径跟踪鼠标,需要循环所有 div
元素,以便可以对每个元素进行单独计算。
由于循环,设置了一个闭包,为了避免闭包带来的范围共享,变量声明从 var
更改为 let
。
查看代码以获得对此的评论。
$(function(){
var player = $('window');
// Give the document a mousemove event handler
$(document).on('mousemove', function (e) {
// If we are hovering over one of the div elements, exit the function
if(e.target.nodeName === "DIV"){ return; }
// Loop through each div and set its rotation separately from each other one
$(".drop").each(function(){
// Declare all variables using "let" instead of "var" to avoid closure side-effects
// of scope sharing
// Current position
let p1 = {
x: $(this).offset().left,
y: $(this).offset().top
};
// Future position
let p2 = {
x: e.offsetX,
y: e.offsetY
};
// Angle between them in degrees
let angleDeg = (Math.atan2(p2.y - p1.y, p2.x - p1.x) * 180 / Math.PI) - 90;
if(angleDeg >= 360){
angleDeg -= 360;
}
// Just move the div that we're looping over at the moment
$(this).css('-webkit-transform', 'rotate(' + angleDeg + 'deg)');
});
});
});
body{ background:#ccc; }
.container { width:75%; margin:10% auto 0 auto; }
.drop{
background:red;
width:10px;
height:50px;
margin:35px;
float:left;
}
.other {
background:blue;
width:10px;
height:50px;
margin:25px;
float:left;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<body>
<div class="container">
<div class="drop"></div>
<div class="drop"></div>
<div class="drop"></div>
<div class="drop"></div>
<div class="drop"></div>
<div class="drop"></div>
<div class="drop"></div>
<div class="other"></div>
<div class="other"></div>
</div>
</body>
我之前小规模修复过这个问题,但是当我把它添加到我的实际项目代码中时,它发生了冲突。我创建了它的另一个版本,但我再次努力使代码更智能并且它在浏览器中变得有点慢,所以我想知道是否有办法让它更轻。
function rotateOnMouse(e, pw) {
var offset = pw.offset();
var center_x = (offset.left) + ($(pw).width() / 2);
var center_y = (offset.top) + ($(pw).height() / 2);
var mouse_x = e.pageX;
var mouse_y = e.pageY;
var radians = Math.atan2(mouse_x - center_x, mouse_y - center_y);
var degree = (radians * (180 / Math.PI) * -1);
$(pw).css('-moz-transform', 'rotate(' + degree + 'deg)');
$(pw).css('-webkit-transform', 'rotate(' + degree + 'deg)');
$(pw).css('-o-transform', 'rotate(' + degree + 'deg)');
$(pw).css('-ms-transform', 'rotate(' + degree + 'deg)');
}
$(document).mousemove(function(e) {
$(document).bind('mousemove.rotateImg', function(e2) {
rotateOnMouse(e2, $('#arrowD1'));
});
$(document).bind('mousemove.rotateImg', function(e2) {
rotateOnMouse(e2, $('#arrowD2'));
});
$(document).bind('mousemove.rotateImg', function(e2) {
rotateOnMouse(e2, $('#arrowD3'));
});
$(document).bind('mousemove.rotateImg', function(e2) {
rotateOnMouse(e2, $('#arrowD4'));
});
$(document).bind('mousemove.rotateImg', function(e2) {
rotateOnMouse(e2, $('#arrowD5'));
});
$(document).bind('mousemove.rotateImg', function(e2) {
rotateOnMouse(e2, $('#arrowD6'));
});
});