RSS
 

Эффект фото ленты

31 Июл

Однажды передо мной стала задача создать фото ленту на javascript. Этот эффект очень часто применяется на разных сайтах. Но мне захотелось написать собственный вариант. Как раз в  момент написания скрипта, я изучал примеры работы с таблицами, с их столбцами и строками. Немного подумав, я пришел к следующему решению.

Ленту я составил из таблицы (<div> применять не пришлось).

Лента состоит из 3 рисунков (количество рисунков можно регулировать по желанию) и двух боковых стрелок, при клике на которые будет выполняться  перелистывания ленты. Сам процесс перелистывания сделал следующим образом.

  1. <table id=»effectTable» border=»0? cellspacing=» 0? cellpadding=»0? width=»450?>
  2. <tbody>
  3. <tr>
  4. <td style=»width: 9px;» align=»left» valign=»middle»><img style=»cursor:pointer;» onclick=»next();» src=»left.gif» border=»0? alt=»" width=»7? height21? /></td>
  5. <td style=»width: 144px;» align=»center» valign=»top»><a id=»lnk1? href=»javascript:winOpen(’1b.jpg’)»><img src=»1.jpg» alt=»" width=»100? height=»75? /></a></td>
  6. <td style=»width: 144px;» align=»center» valign=»top»><a id=»lnk2? href=»javascript:winOpen(’2b.jpg’)»><img src=»2.jpg» alt=»" width=»100? height=»75? /></a></td>
  7. <td style=»width: 144px;» align=»center» valign=»top»><a id=»lnk3? href=»javascript:winOpen(’3b.jpg’)»><img src=»3.jpg» alt=»" width=»100? height=»75? /></a></td>
  8. <td style=»width: 9px;» align=»right» valign=»middle»><img style=»cursor:pointer;» onclick=»previous();» src=»right.gif» border=»0? alt=»" width=»7? height21? /></td>
  9. </tr>
  10. </tbody>
  11. </table>

В первую очередь, рисунок самой крайней ячейки убирается (display=’none’), далее запускается функция setInterval(), которая в процентном соотношении (для достижения плавного эффекта сужения), начинает сужать эту ячейку. И когда ширина ячейки доходит до 1 пикселя, она удаляется и заменяется, созданной, новой ячейкой, только уже с противоположной стороны ленты. Дальше запускается следующая функция setInterval(), которая начинает расширять новую ячейку до размера остальных ячеек. Когда достигается определенная ширина, создается рисунок и вставляется в эту ячейку.

Я постарался словами описать сам процесс движения фото-ленты. Вот и сам скрипт:

  1. <script language=«javascript»>
  2. <!–
  3. var c=2;
  4. var timer;
  5. var timer2;
  6. var src;
  7. // ссылка на таблицу (ленту)
  8. var table=document.getElementById(«effectTable»);
  9. // массив с путями к рисункам которые содержаться в ленте
  10. var picId=new Array(«1.jpg»,«2.jpg»,«3.jpg»,«4.jpg»,«5.jpg»,«6.jpg»,«7.jpg»);
  11. // создается объект attributes, который содержит параметры нового рисунка
  12. var attributes={src:picId,width:100,height:75,border: 0};
  13. // функция для клика в левую сторону
  14. function next() {
  15. // если счетчик c не достиг последнего рисунка в ленте
  16. if(c < (picId.length-1)) {
  17. // обращение к таблица.первый_ряд.первый_столбец.первый_дочерний_узел, который является рисунком и скрывается. Обратите внимание, что счет ряда начинается с 0, а столбцом с 1
  18. table.rows[ 0].cells[1].firstChild.style.display=«none»;
  19. c+=1; // увеличивается счетчик
  20. // перезаписываются элементы объекта attributes, главное здесь новый путь к рисунку
  21. attributes={src:picId,width:100,height:75,border: 0};
  22. // переменной src с глобальной видимостью присваивается новое значение
  23. src=picId;
  24. // запускается таймер для уменьшения ширины ячейки
  25. timer=setInterval(«cellNarrowing(1,3,1,3)», 5);
  26. }
  27. }
  28. // анологично функции next рабоатет функция previous только в обратном направлении
  29. function previous() {
  30. if(c > 2) {
  31. table.rows[ 0].cells[3].firstChild.style.display=«none»;
  32. attributes={src:picId,width:100,height:75,border: 0};
  33. src=picId;
  34. c-=1;
  35. timer=setInterval(«cellNarrowing(3,1,3,1)», 5);
  36. }
  37. }
  38. // функция для сужения ячейки
  39. function cellNarrowing(cellIndex,cellAddIndex,cellDeleteIndex,stretchCellParam) {
  40. // переменной cell приравнивается ссылка на ячеку, которую нужно сузить
  41. var cell=table.rows[ 0].cells[cellIndex];
  42. // переменной cellWidth приравнивается ширина СУЖАЮЩЕЙСЯ ячейки
  43. var cellWidth=parseInt(cell.style.width);
  44. // если ширина ячейки достигла 2 или 1
  45. if(parseInt(cell.style.width)<=2) {
  46. // останавливаем таймер
  47. clearInterval(timer);
  48. // устанавливает ширину ячейки раной еденице
  49. cell.style.width=«1px»;
  50. // удаляем сузевшуюся ячейку
  51. table.rows[ 0].deleteCell(cellDeleteIndex);
  52. // добавляем новую ячейку. Создаем новый элемент документа <а>, всавляем его в эту ячеку и придаем ячейке иширину равной 1
  53. table.rows[ 0].insertCell(cellAddIndex);
  54. var newLink=document.createElement(«a»);
  55. var bigImgIndex=src.lastIndexOf(«.»);
  56. var bigImg=src.substring( 0,bigImgIndex)+«b.jpg»;
  57. newLink.setAttribute(«href»,«javascript:winOpen(«»+bigImg+»")»);
  58. table.rows[ 0].cells[cellAddIndex].appendChild(newLink);
  59. table.rows[ 0].cells[cellAddIndex].style.width=«1px»;
  60. table.rows[ 0].cells[cellAddIndex].style.textAlign=«center»;
  61. // и наконец запускаем функцию которая растягивает новую ячейку до определенной ширины
  62. timer2=setInterval(«stretchCell(«+stretchCellParam+«)»,5);
  63. }
  64. else {
  65. // если же ячейка еще не сузилась, то В ПРОЦЕНТОМ соотношении сужаем ее. Обратите внимание умножаем на 60. Не думайте, что результат останется тем же, нет он уменьшится ;)
  66. cell.style.width=Math.round(cellWidth*60/100)+«px»;
  67. }
  68. }
  69. function winOpen(img) {
  70. var nw = window.open(img,«newWindow»,«width=500, height=375, menubar=no, resizable=no, status=no, titlebar=no, toolbar=no»);
  71. nw.focus();
  72. }
  73. // функция расширения новой ячейки
  74. function stretchCell(cellIndex) {
  75. // ссылка на новую ячейку
  76. var cell=table.rows[ 0].cells[cellIndex];
  77. // ширина новой ячейки
  78. var cellWidth=parseInt(cell.style.width);
  79. // в этот раз уже увеличиваем в процентом соотношении, уже умножаем на 210
  80. cell.style.width=Math.round(cellWidth*210/100)+«px»;
  81. // если ширина достигнута созадется новый рисунок к которому привызываются все параметры из объекта attributes (объект имеет глобальную видимость)
  82. if(parseInt(cell.style.width)>=144) {
  83. clearInterval(timer2);
  84. table.rows[ 0].cells[cellIndex].style.width=«144px»;
  85. var newElement=document.createElement(«img»);
  86. for(i in attributes) {
  87. newElement.setAttribute(i, attributes[i]);
  88. }
  89. // и наконец в новую ячейку вставляется новый рисунок
  90. cell.firstChild.appendChild(newElement);
  91. }
  92. }
  93. //–>
  94. </script>

P.S. регулируя процентные цифры 60 и 210 вы будете регулировать скорость прокрутки.

 
1 Comment

Posted in JavaScript

 

Теги: ,

Если понравился пост, то подпишитесь на новые!

Введите свой E-mail:

Оставить комментарий

 
 
  1. Lexa

    16.10.2009 at 03:06

    Спасибо за скриптик)
    Java рулез ;)