Раньше это работало, но внезапно остановилось, и я не уверен, что изменилось.
Обзор: у нас есть HTML ...
<div id="side">
<ul id="photos">
<li><img... </li>
<li><img... </li>
<li><img... </li>
...
</ul>
</div>
Естьdiv фиксированной высоты, position:fixed
и overflow:hidden
, внутри него есть <ul>
с высотой, превышающей высоту вмещающих <div>
и position;absolute
.Идея состоит в том, что когда пользователь наводит курсор на нижнюю часть #side
, #photos
прокручивается вверх.Я настроил прокрутку быстрее ~ 5px, к краям и медленнее ~ 1px к середине.
Проблема в том, что он движется очень медленно.как он будет двигаться вверх на 1 пиксель, а затем ждать, а затем двигаться вверх еще на один пиксель.Я установил интервал в 10, который должен быть довольно быстрым и работал довольно хорошо ранее.
Итак, вот сценарий, в конце используется функция-получателя setInterval()
, остальное предоставляется на всякий случай.
var move_up, move_dn,
hoverInterval,
yPos, //y position on slider
objHeight, //Height of slider
posPercent; //y axis percent on the slider
function movable(){
container = $("#side");
slider = $("#photos");
position = slider.position().top;
limit = 0 - slider.height() + container.height()
if(position >= 0)
{return('top');}
else if(position <= limit)
{return('bottom');}
}
function scroll_div(a){ //a=amount to move
$("#photos").animate({"top":"-="+a+"px"},"slow","easeOutExpo").stop("true","true");
}
function move_div(){
place = movable();
move = (Math.pow(((100*yPos)/objHeight)-50,3)/20000);
if (move < 0){
if (place != 'top'){
scroll_div(move)
}
}else{
if (place != 'bottom'){
scroll_div(move)
}
};
}
$("#side").mousemove(function(e){
objHeight = this.offsetHeight
yPos = e.pageY - this.offsetTop;
//offset = parseFloat($("#photos").css("top")) superfluous
});
$("#side").hover(
function(){hoverInterval = setInterval(move_div,10)},
function(){clearInterval(hoverInterval)
});