ruskar
@ruskar
Conflict Intelligence Team

JQuery .offset() меняется при изменении ширины страницы?

cie4tL4.png



На представленной картинке «вертикальное меню» из трёх типов пересадок (отмечено стрелочкой) имеет абсолютное позиционирование, которое высчитывается относительно позиции «кнопки вызова» этого меню (пустой прямоугольник с пунктирными границами прямо над этим меню).



На «кнопку вызова» меню навешен через jquery обработчик события click. Уже в обработчике этого события рассчитывается offset для этой кнопки, и исходя из полученных данных отсчитывается позиция «вертикального меню». Примерно так:

$('table.calc').on('click', '.route-element-blank', function(){<br>
	// table.calc — родитель для «кнопки вызова» меню, имеющей класс .route-element-blank<br>
<br>
	if ($('.add_element').css('display') == 'none') // вертикальное меню<br>
	{<br>
		var offset = $(this).offset();<br>
		var top = offset.top - 185;<br>
		var left = offset.left - 5;<br>
		<br>
		$('.add_element').css({top:top+'px', left:left+'px'}).slideDown(200);<br>
	} else<br>
	{<br>
		$('.add_element').slideUp(200, function(){<br>
			$('.add_element').css('display', 'none');<br>
		});<br>
	}<br>
});<br>




При этом если подзаголовок калькулятора («считает расходы на транспорт в зависимости от блаблабла») помещается в одну строку, то всё работает правильно. Если же нет (например изменилась ширина страницы или она изначально была такая), то offset высчитывается уже неправильно.



t7LMOwR.png



К слову, «кнопка вызова» меню является droppable-элементом и к ней применён соответствующий плагин jQuery UI. Я пробовал в настройках droppable-элемента поставить опцию refreshPositions: true, но это не помогло.



Также я пробовал поменять $(document).ready() на $(window).load() — тоже не помогло.



Подскажите, в чём проблема и как исправить? Вживую можно пощупать тут.



Понятно, что проблема в:

var top = offset.top - 185;<br>

но это число я установил экспериментальным путём, так и не разобравшись почему при просто offset.top «вертикальное меню» позиционируется не там же, где и кнопка вызова этого меню.
  • Вопрос задан
  • 7232 просмотра
Пригласить эксперта
Ответы на вопрос 2
dpigo
@dpigo
Front-end developer
у родительского класса отсутствует position:relative от того и прыжки

upd: «родительский» — calcbg
Ответ написан
Rebulus
@Rebulus
У Вас к странице подключен весь jqueryUI. Почему бы в таком случае не использовать для этого его утилиту Position, которая учтет все нюансы при расчете позиционирования относительно блока.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы