Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Глюк при определении позиции элемента относительно родителя (https://javascript.ru/forum/misc/34949-glyuk-pri-opredelenii-pozicii-ehlementa-otnositelno-roditelya.html)

wursta 25.01.2013 16:47

Глюк при определении позиции элемента относительно родителя
 
Доброго времени суток!

Описание: У меня есть div с заданной высотой и он изначально скрыт(display:none). В диве стоит overflow:auto; Если содержимое дива больше, чем сам див, появляется вертикальная прокрутка. При нажатии на некоторую кнопку див показывается и в зависимости от условий должна изменятся позиция скролла.

Проблема:
Неверно считает позицию элемента в диве. Точнее как...считает верно, но через раз. Буквально через раз. Первый раз кликаю - правильно считает, второй раз - неправильно. Третий раз - правильно и т.д.

Код:
Вот участок кода который отвечает за расчёт позиции и её установку.
$('.button').click(function(){
  test_index = 7;//пускай для примера он будет статичный
  $('.hidden_div').scrollTop(parseInt($('.hidden_div .elements').eq(test_index).position().top));
	});


Реальный пример:
Ссылка

Вопрос:
Что делать? Как быть?

ksa 25.01.2013 16:53

Цитата:

Сообщение от wursta
Что делать?

Для начала нормальный тестовый пример...

wursta 25.01.2013 16:55

ок.
пожалуйста - ссылка

Жмём там где Латвия.
Выбираем "Таджикистан", один из последних. Закрываем селект. Потом жмём ещё раз. И так несколько раз. Позиция будет устанавливаться правильно через раз.

Hoshinokoe 26.01.2013 00:50

wursta,

position().top - возвращает позицию начиная с видимой части блока.
scrollTop() - позиция прокрутки в блоке (расчитывается исходя из размеров всего блока, не только видимой его части).

Поэтому два варианта:
1) костыль - перед тем как взять top, делаем scrollTop(0)
$('.button').click(function(){
  test_index = 7;//пускай для примера он будет статичный
  $('.hidden_div').scrollTop(0); //теперь top будет равен высоте всех элементов до него
  $('.hidden_div').scrollTop(parseInt($('.hidden_div .elements').eq(test_index).position().top));
});

2) правильный - считать высоту всех элементов до необходимого
$('.button').click(function(){
  test_index = 7;//пускай для примера он будет статичный

  var el = $('.hidden_div .elements').eq(test_index);
  var scrollTop = el.height();
  $.each(el.prevAll(), function (index, elem) { scrollTop += $(elem).height(); });
  $('.hidden_div').scrollTop(scrollTop);
});

Deff 26.01.2013 06:14

offset
Цитата:

Сообщение от wursta
Если содержимое дива больше, чем сам див,

А нужна ли позиция? Достаточно отношения высот http://jquery-docs.ru/CSS/height/

wursta 27.01.2013 16:42

спасибо. =)
Ну если считать высоту, то да..позиция становится не нужна по сути..

ksa 28.01.2013 09:00

Цитата:

Сообщение от wursta
пожалуйста - ссылка

Жмём там где Латвия.
Выбираем "Таджикистан", один из последних. Закрываем селект. Потом жмём ещё раз. И так несколько раз.

Это не тестовый пример... :D

wursta 28.01.2013 10:01

Цитата:

Сообщение от ksa (Сообщение 229854)
Это не тестовый пример... :D

Вы пытаетесь увеличить количество сообщений оставленных на форуме или помочь в решении проблемы?

ksa 28.01.2013 13:39

wursta, тебе видней... :D


Часовой пояс GMT +3, время: 02:07.