Показать сообщение отдельно
  #1 (permalink)  
Старый 22.01.2012, 21:49
Аспирант
Отправить личное сообщение для stweet Посмотреть профиль Найти все сообщения от stweet
 
Регистрация: 21.12.2011
Сообщений: 41

Пишем слайдер. Знатоки милости просим.
Написал простенький код с целью познать азов javascript-а.
Но так как сценарий на данном языке пишу впервые, возникло масса вопросов. Ниже, привожу исходник, прошу указать на недочёты которые допустил в данном коде.
<html>
<!-- этот файл обсуждаем. -->
<script type="text/javascript" src="js/Scrolling.js"></script>

<!-- отладочный стиль. -->
<style>
.scrolling_scv
{
	background:#333;
	border-radius:5px;
	width:10px;
	height:30px;
	position:absolute;
	cursor:default;
	-webkit-user-select:none;
}

.background_scv
{
	background:#999;
	border-radius:5px;
	width:10px;
	height:100%;
	-webkit-user-select:none;
}
</style>

<!-- не обращаем внимание, на коленке писал. -->
<script>
$("debug").appendChild(new STScrolling("debug", function (i) { $("output").innerHTML = i; } ));
function $(id) { return document.getElementById(id); }
</script>

<body>
<!-- отладочные div-ы -->
<div align="center" id="debug" style="height:300px;"></div>
<div align="center" id="output">0</div>
</body>

</html>


код который обсуждаем.

var STScrolling = function(id, fun)
{
	// айди новых объектов.
	var bgId = "bg_" + id;
	var scId = "sc_" + id;
	
	// выполняет функцию при анимации элемента.
	var out = fun;
	
	// запоминаем позицию курсора на элементе.
	var lp;
	
	// новое положение элемента.
	var ep;
	
	// дистанция, в доль которой может двигаться элемент.
	var ds;
	
	// выводит положение элемента в процентах.
	var sp;
	
	// динамический элемент.
	var sc = d(scId, "scrolling_scv");
		sc.addEventListener("mousedown", onMouseDown);
	
	// бакгроунд под элементом.
	var bg = d(bgId, "background_scv");
		bg.appendChild(sc);
	
	// кликаем по элементу.
	function onMouseDown (e)
	{
		// вычисляем дистанцию.
		ds = bg.offsetHeight - sc.offsetHeight;
		
		// определяем шаг элемента в процентах.
		sp = 1 / ds;
		
		// запоминаем где кликнул курсор на элементе.
		lp = bg.offsetTop + e.layerY;
		
		// регистрируем приёмники.
		window.addEventListener("mousemove", onMouseMove);
		window.addEventListener("mouseup", onMouseUp);
	}
	
	// отжимаем кнопку мыши.
	function onMouseUp (e)
	{
		// удаляем приёмники.
		window.removeEventListener("mousemove", onMouseMove);
		window.removeEventListener("mouseup", onMouseUp);
	}
	
	// двигаем мышью.
	function onMouseMove (e)
	{
		// вычисляем новое положение элемента.
		ep = e.clientY - lp;
		
		// проверяем положение элемента.
		if (ep > ds) ep = ds;
		else if (ep < 0) ep = 0;
		
		// двигаем элемент.
		sc.style.top = bg.offsetTop + ep + "px";
		
		// если переменная не пуста, выполняем метод.
		if (out != null) out(parseInt(ep * sp * 100));
	}
	
	// создаём нужные div элементы.
	function d(id, cn)
	{
		var n = document.createElement("div");
			n.id = id;
			n.className = cn;
		return n;
	}
	
	// возвращаем объект.
	return bg;
}


Из недостатков с которыми уже столкнулся:

Если страница документа прокручивается, позиция курсора нарушается. Я так понял что "e.layerY" отсчитывает позицию не от начала документа а от начала видимой области т.е. окна браузера. Думаю что это решаемо, просто пока не знаю как.

Продолжаем критиковать и предлагаем свои варианты, решения!
Заранее благодарю за понимание.

Последний раз редактировалось stweet, 23.01.2012 в 03:43. Причина: не внимательность.
Ответить с цитированием