2012-02-10 1 views
5

следующие JQuery кода прокручивает страницу к первой ошибке в виде:JQuery анимации scrollTop не работает должным образом

$('html,body').stop().delay(500).animate({scrollTop: $errors.filter(":first").offset().top -30},'slow'); 

Однако, если я заменю $('html,body') с именем контейнера элемента, такого как класс сНу $('.myDivClass') с фиксированным позиционированием, похоже, что он не работает. Он просто прокручивает в случайные места вверх и вниз с каждым представлением. Если элемент контейнера является чем-то другим, кроме html, body, он, похоже, не работает правильно.

Я не могу понять, что я делаю неправильно.

CSS-код контейнера элемента выглядит следующим образом (так что вы знаете, что я имею в виду):

.mcModalWrap1{ 
position:fixed; 
top:0; 
left:0; 
width:100%; 
padding:50px; 
background-image:url(images/overlay.png); 
overflow:auto; 
z-index:999; 
display:none; 
} 

Я попытался с помощью позиции() вместо смещения() для относительного позиционирования, но он не сделал разница.

Спасибо!

Обновление: похоже, для этого нет решения.

+1

В каком браузере вы видите поведение? В Chrome 17 он работает нормально. Когда я отправляю форму, она прокручивается до первой ошибки.Если первая ошибка - это имя, она прокручивается вверху страницы. Если первая ошибка ниже, то она прокручивает меня к элементу ввода. – Jasper

+0

Во всех моих браузерах он делает то же самое. IE, FF, Chrome, Opera. Однако встроенная версия работает отлично. – user1108996

+0

@ Джаспер, не двигается ли вы альтернативно вверх и вниз для вас? – user1108996

ответ

1

Если вы прокручиваете что-то, кроме окна, вам необходимо найти положение ошибки относительно его контейнера. В этом случае div. Если элемент находится в div, используйте вместо него position, который будет относиться к первому родителю с относительным, фиксированным или абсолютным позиционированием.

$('.mcModalWrap1') 
    .stop() 
    .delay(500) 
    .animate({scrollTop: $errors.filter(":first").position().top -30},'slow'); 
+0

Использование position() вместо offset() дает для меня тот же результат. – user1108996

+0

@ user1108996 Я знаю, что вы связались с вашим сайтом раньше, но я не могу найти ссылку на этот вопрос. @mrtsherman, опубликованный CSS показывает, что элемент, о котором идет речь, в основном полноэкранный, он по крайней мере состыкован в верхней части страницы, поэтому 'offset(). top' и' position(). top' должен возвращать тот же стоимость. – Jasper

+0

@ Jasper Хорошо, я добавил ссылку на сообщение. – user1108996

0

Решила проблему, сбросив идею. JQuery scrollTop не работает в родительском контейнере, отличном от html, body, чтобы перейти к определенной позиции. Он работает только для прокрутки вверх или вниз. Ни position(), ни offset() не вычисляют значение правильно.

Если у кого-то есть ответ, я бы с удовольствием узнал.

+0

Возможно, нужна высота 100% или используйте clearfix, если вы использовали поплавки ... google clearfix должно быть легко :) – Val

1

У меня была та же проблема. Он работает только при первом вызове.

Чтобы исправить это, вам нужно прокручивать вверх до каждого раза перед вызовом animate().

Так что я изменил мой:

$(element).animate({scrollTop: 500}); 

с

$(element).scrollTop(0); 
$(element).animate({scrollTop: 500}); 

Да, это правда, каждый раз, когда она прокручивается к началу первого, но без анимации и работает очень хорошо для меня.

Надеюсь, что это поможет.

8

Я знаю, что я очень опаздываю на вечеринку, но столкнулся с той же проблемой, и вот как я ее исправил.

При прокрутке внутри фиксированной позиционируемый элемент, по какой-то причине, вы должны добавить его собственный scrollTop в положение, к которому вы хотите прокрутки, так:

var position = $errors.filter(":first").position().top + $('. myDivClass').scrollTop() 
$('.myDivClass').animate({ scrollTop: position }) 

работал для меня.