Strona początkowa

Celownik

Jak uzyskać efekt celownika podążającego za kursorem? Zasada jest bardzo prosta. Tworzymy cztery divy, które odpowiednio przesówamy. I tak - pionowe div zmienia tylko pozycję X, a poziomy pozycję Y. Czemu tworzymy aż 4, a nie 2? Gdybyśmy zastosowali 2 - wówczas znajdowały by się one pod kursorem, uniemożliwiając tym samym klikanie na obiekty.

Na początku musimy pobrać pozycję kursora. Zastosujemy funkcję, którą poznaliśmy tutaj:

		function pozycjaMyszki(e) {
			var pozX = 0;
			var pozY = 0;
			if (!e) var e = window.event;
			if (e.pageX || e.pageY) {
				 pozX = e.pageX;
				 pozY = e.pageY;
			} else if (e.clientX || e.clientY) {
				 pozX = e.clientX + document.body.scrollLeft;
				 pozY = e.clientY + document.body.scrollTop;
			}
			return [pozX,pozY]
		}
	

Następnie musimy utworzyć nasze divy. Moglibyśmy wstawić odpowiedni kod do html, jednak lepszym pomysłem jest utworzyć je dynamicznie w JS. Jeżeli ktoś wyłączy sobie JS, wówczas nie zobaczy całego "celownika", a my mu nie zaśmiecimy kodu.

	var pionT = document.createElement('div');
	var pionB = document.createElement('div');
	var poziomL = document.createElement('div');
	var poziomR = document.createElement('div');
	with (poziomL.style) {
		position = 'absolute';
		left = top = '0px';
		width = '100%';
		height = '1px';
		backgroundColor = 'red';
		zIndex = 1000;
	}

	with (poziomR.style) {
		position = 'absolute';
		left = top = '0px';
		width = '100%';
		height = '1px';
		backgroundColor = 'blue';
		zIndex = 1000;
	}

	with (pionT.style) {
		position = 'absolute';
		left = top = '0px';
		width = '1px';
		height = '100%';
		backgroundColor = 'black';
		zIndex = 1000;
	}

	with (pionB.style) {
		position = 'absolute';
		left = top = '0px';
		width = '1px';
		height = '100%';
		backgroundColor = 'green';
		zIndex = 1000;
	}

	var body = document.getElementsByTagName('body')[0];
		body.insertBefore(pionT,body.firstChild);
		body.insertBefore(pionB,body.firstChild);
		body.insertBefore(poziomL,body.firstChild);
		body.insertBefore(poziomR,body.firstChild);
		body.style.cursor = 'crosshair';
	

Tworzymy poziome i pionowe divy. Następnie dla każdego z nich za pomocą instrukcji with ustawiamy odpowiedni wygląd. Dzięki zastosowanie tej techniki, skróciliśmy mocno kod.
Po ustawieniu wyglądu pobieramy sekcję body, a następnie wstawiamy nasze divy na jej początku (tuż przed pierwszym dzieckiem). Dodatkowo ustawiamy kursor na crosshair.

Skoro mamy już utworzone bloki, czas najwyższy wprawić je w ruch. Najłatwiej zrobić to obsługując zdarzenie mousemove dla całego dokumentu. Musimy tylko odpowiednio obliczyć ich pozycje i wymiary. Prosta matematyka:

		document.onmousemove = function(e) {
			pionT.style.left = pozycjaMyszki(e)[0];
			pionT.style.height = pozycjaMyszki(e)[1] - 20;
			pionB.style.top = pozycjaMyszki(e)[1] + 20;
			pionB.style.left = pozycjaMyszki(e)[0];
			pionB.style.height = document.body.offsetHeight + document.body.scrollTop - pozycjaMyszki(e)[1] - 20;
			poziomL.style.top = pozycjaMyszki(e)[1];
			poziomL.style.width = pozycjaMyszki(e)[0] - 20;
			poziomR.style.left = pozycjaMyszki(e)[0] + 20; 
			poziomR.style.top = pozycjaMyszki(e)[1];
			poziomR.style.width = document.body.offsetWidth + document.body.scrollLeft - pozycjaMyszki(e)[0] - 20;
		}
	

Wykorzystałem właściwości strony, z których korzystałem w funkcji zwracającej pozycję myszki. Najłatwiej takie rzeczy rozpisać sobie na rysunku.

Końcowa funkcja tworząca divy i odpalająca zdarzenie mousemove dla dokumentu będzie miała postać:

	function load() {
		var pionT = document.createElement('div');
		var pionB = document.createElement('div');
		var poziomL = document.createElement('div');
		var poziomR = document.createElement('div');
			with (poziomL.style) {
				position = 'absolute';
				left = top = '0px';
				width = '100%';
				height = '1px';
				backgroundColor = 'red';
			}

			with (poziomR.style) {
				position = 'absolute';
				left = top = '0px';
				width = '100%';
				height = '1px';
				backgroundColor = 'blue';
			}

			with (pionT.style) {
				position = 'absolute';
				left = top = '0px';
				width = '1px';
				height = '100%';
				backgroundColor = 'black';
			}

			with (pionB.style) {
				position = 'absolute';
				left = top = '0px';
				width = '1px';
				height = '100%';
				backgroundColor = 'green';
			}

		var body = document.getElementsByTagName('body')[0];
			body.insertBefore(pionT,body.firstChild);
			body.insertBefore(pionB,body.firstChild);
			body.insertBefore(poziomL,body.firstChild);
			body.insertBefore(poziomR,body.firstChild);
			body.style.cursor = 'crosshair';
	

		document.onmousemove = function(e) {
			pionT.style.left = pozycjaMyszki(e)[0];
			pionT.style.height = pozycjaMyszki(e)[1] - 20;
			pionB.style.top = pozycjaMyszki(e)[1] + 20;
			pionB.style.left = pozycjaMyszki(e)[0];
			pionB.style.height = document.body.offsetHeight + document.body.scrollTop - pozycjaMyszki(e)[1] - 20;
			poziomL.style.top = pozycjaMyszki(e)[1];
			poziomL.style.width = pozycjaMyszki(e)[0] - 20;
			poziomR.style.left = pozycjaMyszki(e)[0] + 20; 
			poziomR.style.top = pozycjaMyszki(e)[1];
			poziomR.style.width = document.body.offsetWidth + document.body.scrollLeft - pozycjaMyszki(e)[0] - 20;
		}
	}
	

Wystarczy teraz dołączyć funkcję zwracającą pozycję myszki, odpalić funkcje load() i możemy cieszyć się ładnym celownikiem ^^.