Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Движение объектов. (https://javascript.ru/forum/misc/1081-dvizhenie-obektov.html)

SergeiAzarov 11.03.2008 02:12

Движение объектов.
 
Хочу реализовать следующую задачу: объект при наведении на него курсора начинает двигаться по линейной траектории. Как только курсор покидает поле объекта он должен начать двигаться в обртаном направлении и встать в исходную позицию.
В качестве объекта использую <div id="pict"> абсолютно позиционированный, с картинкой в background. При наступлении события onmouseover выполняется функция slide(), при onmouseout выполняется функция slideback().
function slide(){
for (var i=100; i<200;i++)
{
pict.style.left=i+"px";
}
}
Вот в этом месте возникает первая неприятность, цикл обрабатывается слишком быстро. Пробовал притормозить его при помощи setInterval, но успеха добиться не смог. Есть какие-то альтернативные функции которые сделают задержку в каждой итерации??

И вопрос номер 2: Полагаю что когда добьюсь плавного скольжения функция slide будет выполняться до конца, даже если курсор покинет картинку раньше. Соответственно имеет смысл в каждой итерации проверять находится курсор над нашим объектом и если он покинул пределы объекта прекратить выполнение функции slide, вернуть текущее значение переменной i и передать его в функцию slideback(). Меня интересует есть ли какое-то свойство у объектов пор которому можно определить в фокусе он или нет?
Пока что предполагаю отслеживать координаты курсора, вычислять положение объекта и таким образом определять положение курсора относительно объекта, но это слишком громоздко, хотелось бы более элегантного решения.

Андрей Параничев 11.03.2008 05:22

Это довольно тривиальная задача.
По первому вопросу:
<style>
#image {
	position: absolute;
	top: 20px;
	left: 4px;
	background: #FFAAFF;
	padding: 10px;
}
</style>

<div id="image" onMouseOver="slide()" onMouseOut="slideback()">Here is something</div>

<script language="JavaScript">
var slidepos = 4;
var slidediv = document.getElementById('image');
var sliding = false;

function slide() {
	// Изначально убираем интервал (на всякий случай)
	sliding = clearInterval(sliding);
	
	// Ставим интервал (тут 40 ms - скорость движения, меньше=быстрее)
	sliding = setInterval(function() {
		if( slidepos < 600 ) {// Двигаемся до 600 пикселей
			slidepos++;
			slidediv.style.left = slidepos; // Тут лучше без px - глючит в konqueror
		} else {
			// Убираем интервал, когда он не нужен
			sliding = clearInterval(sliding);
		}
	}, 40 );
}

function slideback() {
	sliding = clearInterval(sliding);
	
	sliding = setInterval(function() {
		if(slidepos > 4) { // до начальной позиции
			slidepos--;
			slidediv.style.left = slidepos;
		} else {
			sliding = clearInterval(sliding);
		}
	}, 40 );
}
</script>


По второму вопросу могу сказать, что если это не критично, дополнительно обрабатывать события (кроме onMouseOver, onMouseOut), не надо. Обидно, что в некоторых браузерах, когда окошко само уплывает из-под мышки событие onMouseOut не вызывается, вот в FF всё в порядке. Для полной кроссбраузерности придется, наверно, считать координаты.

SergeiAzarov 11.03.2008 14:54

Большое спасибо. То что нужно!

Гость 09.04.2008 14:40

Обьясните пожалуйста, почему данная конструкция не работает у меня ни в одном браузере? С чем это может быть связано? У меня вылазит рисунок в заданной позиции, но он не двигается согласно указанным функциям..

partyzan 10.04.2008 02:26

Наверно <style> нужно заключить между дискрипторами <head>

Гость 10.04.2008 06:07

Цитата:

Сообщение от partyzan (Сообщение 1962)
Наверно <style> нужно заключить между дискрипторами <head>

Style вообще можно прописать прямо в <div>, и он работает, т.е. div отображается согласно стилю. Проблема в том, что он не желает никуда двигаться)

Странник 20.09.2009 11:19

Тут скорее проверка на вшивость ))
вместо

var slidediv = document.getElementById('image');

следует читать

var slidediv = document.getElementById("image");

monolithed 06.04.2010 23:10

Мне нужно точно такое же действие, но только по событию onclick. Подскажите пожалуйста как можно на один и тотже элемент поставить два события onclick.

Aetae 06.04.2010 23:22

Читайте:
http://javascript.ru/tutorial/events/intro

unforma 18.04.2010 00:39

Div двигается медленно
 
Как в приведенном Андреем Параничевым коде div заставь двигаться быстрее. 40 изменил на 1 но это реально медленно.


Как div заставить двигаться быстрее???


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