Поворот нескольких групп фигур при перемещении мыши
У меня есть группа диагональных линий, следующих за мышью при движении.
Это прекрасно работает, если у меня есть только один экземпляр группы на странице, но мне нужно иметь несколько экземпляров.
Когда я дублирую HTML, они не работают независимо друг от друга и не дают желаемого эффекта.
JQuery:
var dash = $(".graphic-wave__dash");
if(dash.length > 0){
var offset = dash.offset();
function mouse(evt){
var center_x = (offset.left) + (dash.width()/2);
var center_y = (offset.top) + (dash.height()/2);
var mouse_x = evt.pageX; var mouse_y = evt.pageY;
var radians = Math.atan2(mouse_x - center_x, mouse_y - center_y);
var degree = (radians * (180 / Math.PI) * -1) + 90;
dash.css('-moz-transform', 'rotate('+degree+'deg)');
dash.css('-webkit-transform', 'rotate('+degree+'deg)');
dash.css('-o-transform', 'rotate('+degree+'deg)');
dash.css('-ms-transform', 'rotate('+degree+'deg)');
dash.removeClass('original');
}
$(document).mousemove(mouse);
}
HTML:
<div class="graphic-wave">
<div class="graphic-wave__row">
<div class="graphic-wave__dash original"></div>
<div class="graphic-wave__dash original"></div>
<div class="graphic-wave__dash original"></div>
<div class="graphic-wave__dash original"></div>
<div class="graphic-wave__dash original"></div>
<div class="graphic-wave__dash original"></div>
<div class="graphic-wave__dash original"></div>
</div>
<div class="graphic-wave__row">
<div class="graphic-wave__dash original"></div>
<div class="graphic-wave__dash original"></div>
<div class="graphic-wave__dash original"></div>
<div class="graphic-wave__dash original"></div>
<div class="graphic-wave__dash original"></div>
<div class="graphic-wave__dash original"></div>
<div class="graphic-wave__dash original"></div>
</div>
<div class="graphic-wave__row">
<div class="graphic-wave__dash original"></div>
<div class="graphic-wave__dash original"></div>
<div class="graphic-wave__dash original"></div>
<div class="graphic-wave__dash original"></div>
<div class="graphic-wave__dash original"></div>
<div class="graphic-wave__dash original"></div>
<div class="graphic-wave__dash original"></div>
</div>
</div>
<div class="graphic-wave" style="left: 400px;">
<div class="graphic-wave__row">
<div class="graphic-wave__dash original"></div>
<div class="graphic-wave__dash original"></div>
<div class="graphic-wave__dash original"></div>
<div class="graphic-wave__dash original"></div>
<div class="graphic-wave__dash original"></div>
<div class="graphic-wave__dash original"></div>
<div class="graphic-wave__dash original"></div>
</div>
<div class="graphic-wave__row">
<div class="graphic-wave__dash original"></div>
<div class="graphic-wave__dash original"></div>
<div class="graphic-wave__dash original"></div>
<div class="graphic-wave__dash original"></div>
<div class="graphic-wave__dash original"></div>
<div class="graphic-wave__dash original"></div>
<div class="graphic-wave__dash original"></div>
</div>
<div class="graphic-wave__row">
<div class="graphic-wave__dash original"></div>
<div class="graphic-wave__dash original"></div>
<div class="graphic-wave__dash original"></div>
<div class="graphic-wave__dash original"></div>
<div class="graphic-wave__dash original"></div>
<div class="graphic-wave__dash original"></div>
<div class="graphic-wave__dash original"></div>
</div>
</div>
https://jsfiddle.net/ob80/7nxf07vo/3/
Кто-нибудь может помочь?
2 ответа
Вам нужно будет рассчитать вращение каждой линии отдельно, в тот момент, когда вы работаете с одним стилем вращения и применяете его к каждому элементу с помощью graphic-wave__dash
учебный класс.
Вот быстрый пример, я не провел никакой оптимизации, и это может быть очень неэффективно. (Я не помещал это во фрагмент, так как кажется, что SO не поддерживает SCSS)
var dash = $(".graphic-wave__dash");
if (dash.length > 0) {
function mouse(evt) {
dash.each(function() { // Calculate per element, not just once
var offset = $(this).offset(); // Workout the offset per element
var center_x = (offset.left) + ($(this).width() / 2); // Use $(this) to reference the current element
var center_y = (offset.top) + ($(this).height() / 2);
var mouse_x = evt.pageX;
var mouse_y = evt.pageY;
var radians = Math.atan2(mouse_x - center_x, mouse_y - center_y);
var degree = (radians * (180 / Math.PI) * -1) + 90;
$(this).css('-moz-transform', 'rotate(' + degree + 'deg)');
$(this).css('-webkit-transform', 'rotate(' + degree + 'deg)');
$(this).css('-o-transform', 'rotate(' + degree + 'deg)');
$(this).css('-ms-transform', 'rotate(' + degree + 'deg)');
$(this).removeClass('original');
});
}
$(document).mousemove(mouse);
}
Внесенные изменения:
- Внутри функции просматривайте каждый элемент вашего класса
- Рассчитать смещение для элемента, а не для всех, основываясь на первом экземпляре этого класса
Я улучшил производительность по сравнению с ответом DBS, установив в качестве атрибута center_x
а также center_y
из всех предметов, поэтому он не должен рассчитываться каждый раз:
var dash = $(".graphic-wave__dash");
if (dash.length > 0) {
dash.each(function() {
var offset = $(this).offset();
$(this).attr('center_x',(offset.left) + ($(this).width() / 2));
$(this).attr('center_y',(offset.top) + ($(this).height() / 2));
});
function mouse(evt) {
dash.each(function() {
var mouse_x = evt.pageX;
var mouse_y = evt.pageY;
var radians = Math.atan2(mouse_x - $(this).attr('center_x'), mouse_y - $(this).attr('center_y'));
var degree = (radians * (180 / Math.PI) * -1) + 90;
$(this).css('-moz-transform', 'rotate(' + degree + 'deg)');
$(this).css('-webkit-transform', 'rotate(' + degree + 'deg)');
$(this).css('-o-transform', 'rotate(' + degree + 'deg)');
$(this).css('-ms-transform', 'rotate(' + degree + 'deg)');
$(this).removeClass('original');
});
}
$(document).mousemove(mouse);
}
Вот скрипка: https://jsfiddle.net/7nxf07vo/6/