Показать сообщение отдельно
  #1 (permalink)  
Старый 27.10.2010, 14:00
Аватар для vatrikovsky
Новичок на форуме
Отправить личное сообщение для vatrikovsky Посмотреть профиль Найти все сообщения от vatrikovsky
 
Регистрация: 27.10.2010
Сообщений: 3

Вертикальный скролл по mouseover
Делаю вертикально скроллящееся меню по типу вот этого:
http://www.netpro.ru/?action=DABlank2 (откройте "Мы сделали")
, только на javaScript + jQuery

HTML:
<div id="left_list">
  <p class="project_number"><a href="#">007</a></p>
  <p class="project_number"><a href="#">012</a></p>
  ...
  <p class="project_number"><a href="#">186</a></p> 
</div>


javascript:
$(document).ready(function(){
	// При наведении на левый блок
	var winHeight = $(window).height();
	var margin = $('#left_list').height() - winHeight;

	// движение при попадании курсора в области
	$('#left_list').unbind('mouseover').mouseover(function(e){
		// top 1/3
		if (e.pageY < (winHeight / 3))
		{
			var speed = (winHeight / 6) / e.pageY;
			if (speed > 2) speed = 2;
			$('#direction').val('top');
		}
		// bottom 1/3
		if (e.pageY > 2 * (winHeight / 3))
		{
			var speed =  (e.pageY - ((2 / 3) * winHeight)) / (winHeight / 6) + 0.5;
			if (speed > 2) speed = 2;
			$('#direction').val('bottom');
		}
		$('#speed').val(speed);
		
		var direction = $('#direction').val();
		var speed = $('#speed').val();
		
		//setInterval(function(){
		// bottom 1/3, list moves top
		if (direction == 'bottom')
		{
			if (parseInt($('#left_list').css('margin-top')) > (-1) * margin)
			{
				$('#left_list').animate({marginTop: '-=50px'}, (300 / speed));
				$('#int').val(parseInt($('#left_list').css('margin-top')));
			}
			else 
			{
				$('#left_list').animate({marginTop: '-' + margin + 'px'}, (300 / speed));
				$('#int').val(parseInt($('#left_list').css('margin-top')));	
			}
		}
		// top 1/3, list moves bottom
		if (direction == 'top')
		{	
			if ((parseInt($('#left_list').css('margin-top'))) < 0)
			{
				$('#left_list').animate({marginTop: '+=50px'}, (300 / speed));
				$('#int').val(parseInt($('#left_list').css('margin-top'))); 
			}
			else
			{
				$('#left_list').animate({marginTop: '0px'}, (300 / speed));
				$('#int').val(parseInt($('#left_list').css('margin-top'))); 
			}
		}
		
		// стопим, если увели мышь в середину
		if (direction == 'none')
		{
			$('#left_list').stop();
			//clearInterval();
		}
	});

	// остановка при выведении указателя за пределы
	$('#left_list').unbind('mouseout').mouseout(function(){
		$('#speed').val('0');
		$('#direction').val('none');
		$('#left_list').stop();
	});

	// увеличение номера при наведении
	$('#left_list > p.project_number').hover(
		function() {
			$(this).animate({fontSize: '10pt'}, 150);
		},
		function(){
			$(this).animate({fontSize: '8pt'}, 150);
		}
	);
});


Суть проблемы:
Во всем, кроме ФайрФокса, блок прокручивается именно при движении мыши, а при простое на месте тоже останавливается. Надо, естественно, чтобы везде просто при поднесении мыши к краю списка, он бы скроллился. Пробовал сделать через setInterval, но это страшно тормозит скрипт, нет ли очевидного и грамотного способа реализовать это?

Спасибо.
Ответить с цитированием