Javascript.RU

Эффект фото ленты 2 (разбор HR_PhotoLine.js) продолжение

Продолжим разбор остальных методов объекта HelpeR.
Следующий метод это lenta. Он отвечает за создание ленты с фото и их описаниями а так же за подключение эффекта HR_Blackout к фотографиям ленты.
Сначала создается сама лента это элемент div. Далее устанавливаются все его свойства.

this.lenta_DIV = document.createElement('div');
this.lenta_DIV.setAttribute('id','HR_lenta_DIV');
var i,c,z,pic_len = this.pics_array.length;
this.lenta_DIV.style.overflow = 'hidden';
this.lenta_DIV.style.width = (this.lenta_pics * parseInt(this.pic_params['width']) + parseInt(this.pic_params['padding']) * this.lenta_pics * 2 + 2) + 'px';

Помните про свойство overflow и ширину ленты, про которые я описывал в html версии фото ленты.
Далее в цикле создаются рисунки которые имею ссылки на большой вариант с массива ln_big_photos, а внутри объекта это массив this.pics_big_array.
Обратите внимание, что при создании ряда фотографий, учитывается сколько фото должно быть в ленте (свойство this.lenta_pics), как только количество достигает этой цифры, остальные фото получают значение margin-right с минусовым показателем, что бы фото ушло за ленту и ее не было видно. После проверяется подключен ли эффект HR_Blackout если да, то ссылка получает класс HR (это требуется для этого эффекта). И в конце цикла в ссылку вставляется рисунок как дочерний узел, а замет уже ссылка вставляется в див ленты. После полного окончания проверяется если включен эффект HR_Blackout, то он подгружаются и под конец весь этот див вставляется в центральную ячейку таблицы.

for(z=0; z < pic_len; z++) {
	  
	  (img = new Image()).src = this.pic_dir + this.pics_array[z];
	  for(var c in this.pic_params) {
	    eval("img.style." + c + " = '" + this.pic_params[c] + "';");
	  }
	  
	  if(z > this.lenta_pics - 1) {
	    img.style.marginRight = '-' + (parseInt(this.pic_params['width']) + parseInt(this.pic_params['padding']) * 2) + 'px';
	  }
	  
	  var ahref = document.createElement('a');
	  ahref.setAttribute('title',this.pics_title[z]);
	  ahref.setAttribute('target','_blank');
	  ahref.href = this.pic_dir + this.pics_big_array[z];
	    /* HR Blackout */
	  if(this.HR_Blackout) {
	    ahref.className = 'HR';
      }
	  /* HR Blackout */
	  ahref.appendChild(img);
	  this.lenta_DIV.appendChild(ahref);
	}
	
	if(this.HR_Blackout) {
	    document.write("<script language='javascript' src='" + this.HR_Blackout_src + "'><\/script>");
    }
	document.getElementById('HR_lenta_table').rows[0].cells[1].appendChild(this.lenta_DIV);

И в конце таким же образом создается див с описаниями фото. Каждое описание обрамляется дивом который получает свойства из объекта this.desc_params. Помните про свойство float для браузеров Mozilla и IE. И этот див тоже вставляется в центральную ячейку таблицы.
Теперь перейдем к разбору метода next и previous.
Next
Метод next начинается с проверки возможен ли еще клик по левой стрелки, т.е. имеются ли еще фото в ленте для прокрутки. Имеется переменная, которая изначально равна нулю this.pic_pos = 0; b и к ней прибавляется число которое должно присутствовать в ленте и это число должно быть меньше или равно числу всех имеющихся рисунков в ленте. Далее значение href ссылки присваивается пустота, что бы не возникали глюки если пользовательно начнет сто раз автоматной очередью кликать по стрелочке. Далее увеличение this.pic_pos происходит в методе move, т.к. это требуется вот для этой строки this.last_pic = this.pic_pos + this.lenta_pics; Здесь определяется тот рисунок, который должен появиться с правой стороны ленты. Далее определяется массив с рисунками которые существую в ленте и массив с описаниями рисунков для использования в методе move. И под конец вызывается сам метод move с аргументом left. И тоже самое касательно метода previous, только в ней идет все наоборот.

next : function() {
    if(this.pic_pos + this.lenta_pics <= this.pics_array.length - 1) {
	  document.getElementById('HR_link_left').href  = 'javascript:;';
	  document.getElementById('HR_link_right').href = 'javascript:;';
      this.last_pic = this.pic_pos + this.lenta_pics;
      this.lenta_imgs = document.getElementById('HR_lenta_DIV').getElementsByTagName('img');
	  this.titles = document.getElementById('HR_desc_DIV').getElementsByTagName('div');
	  this.timer = setTimeout("HR_lenta.move('left');", 1);
	}
  },
  
  previous : function() {
    if(this.pic_pos > 0) {
	  document.getElementById('HR_link_left').href  = 'javascript:;';
	  document.getElementById('HR_link_right').href = 'javascript:;';
	  this.pic_pos--;
      this.last_pic = this.pic_pos + this.lenta_pics;
      this.lenta_imgs = document.getElementById('HR_lenta_DIV').getElementsByTagName('img');
	  this.timer = setTimeout("HR_lenta.move('right');", 1);
	}
  },

А теперь перейдем к рассмотрению метода move. В первую очередь функция получает аргумент, который указывает в которую сторону должно происходить пролистывание. Затем для удобства я создал ссылки с короткими названиями для массивов. После проверяется которое направление задано аргументом и начинается увеличение margin'ов рисунков и описаний. Увеличение или уменьшение происходит со значением переменной this.step, которую определяет пользователь. Для эффекта движения функция вызывает сама себя до тех пор то пока рисунки не достигнут нужной позиции, а после таймер останавливается.

move : function(dir) {
  var first_pic   = this.lenta_imgs[this.pic_pos];
  var last_pic    = this.lenta_imgs[this.last_pic];
  var first_title = this.titles[this.pic_pos];
  var last_title  = this.titles[this.last_pic];
  
    if(dir == 'left') {
	  if(this.lenta_imgs[this.pic_pos].style.marginLeft) {
	    first_pic.style.marginLeft = (parseInt(first_pic.style.marginLeft) - this.step) + 'px';
		last_pic.style.marginRight = (parseInt(last_pic.style.marginRight) + this.step) + 'px';
		
		first_title.style.marginLeft = (parseInt(first_title.style.marginLeft) - this.step) + 'px';
		last_title.style.marginRight = (parseInt(last_title.style.marginRight) + this.step) + 'px';
		
		if(Math.abs(parseInt(first_pic.style.marginLeft)) >= (parseInt(this.pic_params['width']) + parseInt(this.pic_params['padding']) * 2)) {
		  first_pic.style.marginLeft = '-' + (parseInt(this.pic_params['width']) + parseInt(this.pic_params['padding']) * 2) + 'px';
		  last_pic.style.marginRight = '0px';
		  
		  first_title.style.marginLeft = '-' + (parseInt(this.pic_params['width']) + parseInt(this.pic_params['padding']) * 2) + 'px';
		  last_title.style.marginRight = '0px';
		  clearTimeout(this.timer);
		  this.pic_pos++;
		  document.getElementById('HR_link_left').href  = 'javascript:HR_lenta.next();';
	      document.getElementById('HR_link_right').href = 'javascript:HR_lenta.previous();';
		}
		else {
		  this.timer = setTimeout("HR_lenta.move('left')", this.speed);
		}
	  }
	  else {
	    first_pic.style.marginLeft = '-' + (this.step) + 'px';
		last_pic.style.marginRight = (parseInt(last_pic.style.marginRight) + this.step) + 'px';
		
		first_title.style.marginLeft = '-' + (this.step) + 'px';
		last_title.style.marginRight = (parseInt(last_title.style.marginRight) + this.step) + 'px';
		this.timer = setTimeout("HR_lenta.move('left')", this.speed);
	  }
	}
	else if(dir == 'right') {
	  if(last_pic.style.marginRight) {
	    first_pic.style.marginLeft = (parseInt(first_pic.style.marginLeft) + this.step) + 'px';
		last_pic.style.marginRight = (parseInt(last_pic.style.marginRight) - this.step) + 'px';
		
		first_title.style.marginLeft = (parseInt(first_title.style.marginLeft) + this.step) + 'px';
		last_title.style.marginRight   = (parseInt(last_pic.style.marginRight) - this.step) + 'px';
		
		if(Math.abs(parseInt(last_pic.style.marginRight)) >= (parseInt(this.pic_params['width']) + parseInt(this.pic_params['padding']) * 2)) {
		  first_pic.style.marginLeft = '0px';
		  last_pic.style.marginRight = '-' + (parseInt(this.pic_params['width']) + parseInt(this.pic_params['padding']) * 2) + 'px';
		  
		  first_title.style.marginLeft = '0px';
		  last_title.style.marginRight = '-' + (parseInt(this.pic_params['width']) + parseInt(this.pic_params['padding']) * 2) + 'px';
		  clearTimeout(this.timer);
		  document.getElementById('HR_link_left').href  = 'javascript:HR_lenta.next();';
	      document.getElementById('HR_link_right').href = 'javascript:HR_lenta.previous();';
		}
		else {
		  this.timer = setTimeout("HR_lenta.move('right')", this.speed);
		}
	  }
	}
	else {
	  alert("Ошибка!\nДиректория не определена!");
	}
  }

Финал. Для старта всего того, что мы создали нам следует объявить объект HelpeR, далее при успешном создании самой таблицы вызвать создание ленты и эффект готов!

var HR_lenta = new HelpeR();
if(HR_lenta.table()) {
  HR_lenta.lenta();
}

Надеюсь, что эффект окажется полезным для вас. И если вы его решите использовать, всегда буду рад вашим отзывам!

0

 
Поиск по сайту
Другие записи этого автора
HelpeR
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Популярные таги
Последние темы на форуме
Forum