jQuery направление перемещения мыши, получить правильное расстояние
Привет, мне нужно создать эффект зависания с учетом направления, но я застрял в правильном расчете. (Это проблема расчета или, скорее, неправильная разметка?)
Вот что я сделал до сих пор:
Стрелки влево и вправо работают как положено, но вверх и вниз не получается. Есть идеи, что я делаю не так?
$("#circle").on('mousemove', function(e) {
var elem = $(this),
arrowT = $('.arrow.top'),
arrowR = $('.arrow.right'),
arrowB = $('.arrow.bottom'),
arrowL = $('.arrow.left'),
offset = elem.offset(),
pageX = e.pageX - offset.left,
pageY = e.pageY - offset.top,
side = {
top: pageY < (elem.height() / 2),
left: pageX < (elem.width() / 2),
bottom: pageY > (elem.height() / 2),
right: pageX > (elem.width() / 2)
};
arrowT.css({
top: side.top ? pageY - arrowT.outerHeight() : null
});
arrowR.css({
right: side.right ? -(pageX - (elem.width() - arrowR.outerWidth())) : null
});
arrowB.css({
bottom: side.bottom ? -(pageY - (elem.height() - arrowB.outerHeight())) : null
});
arrowL.css({
left: side.left ? pageX - arrowL.outerWidth() : null
});
});
3 ответа
Решение
Вот рабочая версия со ссылками
top: pageY < (elem.height() / 2) && pageY > 0 ,
left: pageX < (elem.width() / 2) && pageX > 0,
bottom: pageY > (elem.height() / 2) && pageY < elem.height(),
right: pageX > (elem.width() / 2) && pageX < elem.width()
Изменено на абсолютное позиционирование, поскольку поле скрывало ссылки
Надеюсь, это поможет. Это произошло потому, что размер элемента изменяется при наведении на него курсора мыши.
topc = $('#circle').position().top;
widk = $('#circle').height();
$("#circle").mousemove( function(e) {
var elem = $(this),
arrowT = $('.arrow.top'),
arrowR = $('.arrow.right'),
arrowB = $('.arrow.bottom'),
arrowL = $('.arrow.left'),
offset = elem.offset(),
pageX = e.pageX - offset.left,
pageY = e.pageY - offset.top,
side = {
top: pageY < (elem.height() / 2),
left: pageX < (elem.width() / 2),
bottom: pageY > (elem.height() / 2),
right: pageX > (elem.width() / 2)
};
if(e.pageY>topc && e.pageY<topc+widk) {
$('.top').css({
top: side.top ? pageY - arrowT.outerHeight() : null
});
$('.right').css({
right: side.right ? -(pageX - (elem.outerWidth() - arrowR.outerWidth())) : null
});
$('.bottom').css({
bottom: side.bottom ? -(pageY - (elem.outerHeight() - arrowB.outerHeight())) : null
});
$('.left').css({
left: side.left ? pageX - arrowL.outerWidth() : null
});
}
});
Это связано с изменением высоты тела при перемещении элементов. Наклейте на него обертку, размер которой не меняется, и они работают
#wrap
{
height:1000px; overflow:hidden;
padding-top:100px;
}
<div id="wrap">
<div id="circle">
<a href="#" class="arrow top"></a>
<a href="#" class="arrow right"></a>
<a href="#" class="arrow bottom"></a>
<a href="#" class="arrow left"></a>
</div>
</div>