Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Анимация высоты элемента, проблема со скроллингом (https://javascript.ru/forum/events/37948-animaciya-vysoty-ehlementa-problema-so-skrollingom.html)

malgeorge 15.05.2013 07:34

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

Вот ссылка на демку: http://irrodion.ru/portfolio/

кусок html:

<div id="pageWrap">
<?php
for($i = 1;$i <= 10;$i++)
{
echo '<div class="content" id="'.$i.'"></div>';
}
?>
</div>

javascript:

$(document).ready(function()
{
$(".content").each(function()
{
var id = "#"+this.id;
if(id == "#1")
{
$(id).css({'height':'150px'});
}
});

//Собственно обработка клика
$(".content").click(function()
{
var id = "#"+this.id;
var selectedId = id;
openContent(id);
scrollToContent(id);
$(".content").each(function()
{
var id = "#"+this.id;
var height = $(id).height();
if(height > 150 && id != selectedId)
{
closeContent(id);
}
});
});

});

//Функции
function openContent(id)
{
var height = $(window).height();
$(id).animate({'height':height}, 500, 'swing');
$(id).css({'cursor':'default'});
}

function closeContent(id)
{
if(id == "#1")
{
height = "150px";
}else
{
height = "100px";
}
$(id).animate({'height':height}, 500, 'swing');
$(id).css({'cursor':'pointer'});
}

function scrollToContent(id)
{
$('html, body').animate({scrollTop:$(id).position().top}, 500, 'swing');
}


Конечно, можно запустить функцию scrollToContent в callback анимации, но тогда возникает пауза перед прокруткой, что нежелательно.

Искал на форумах, наших и буржуйских, похожей проблемы не нашел. Подозреваю что нужно отслеживать offset и каким-то образом прикрутить его значения к скроллу, но пока не хватает опыта. Заранее спасибо за помощь!

danik.js 15.05.2013 08:44

По сути тебе нужно скроллить к position().top() - (previousBlock.height() - previousBlock.collapsedHeight())


collapsedHeight - такой функции нет, вместо нее ты подставляешь свои 100 | 150 пикселей.

malgeorge 16.05.2013 07:57

function scrollToContent(id)
{
var height = $(window).height();
$('html, body').animate({scrollTop:$(id).position().top-(height-100)}, 500, 'swing');
}

Если сделать так, то получается всё в точности наоборот. Теперь если блок раскрывается вверх - всё в порядке, вниз - скорлл улетает вверх.

danik.js 16.05.2013 08:20

Этот код не имеет ничего общего с моим комментарием :)

malgeorge 16.05.2013 09:34

Допёр, все заработало как надо, но иногда все равно пролетает вниз, хм. Спасибо большое!


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