Горизонтальный скроллер на JavaScript
Горизонтальный скроллер на JavaScript
Захотел сделать горизонтальный скроллер для фотогалереи, естественно, без использования всяких сторонних скриптов. Условие: кроссбраузерность, валидная верстка и стандартные стили, поддержка колесика мыши. Начнем с верстки:
Code (HTML) : Убрать нумерацию
- <div class="scroller_container">
- <div class="scroller_navigate"><img src="images/left.gif" alt=""></div>
- <div class="scroller_window" id="scroller_window">
- <div class="scroller_row" id="scroller_row">
- <div id="scroller_rule">
- <!-- список превьюшек в линейке скроллера -->
- <a href="#"><img src="..." width="150" height="100" alt=""></a>
- <a href="#"><img src="..." width="150" height="100" alt=""></a>
- <a href="#"><img src="..." width="150" height="100" alt=""></a>
- <a href="#"><img src="..." width="150" height="100" alt=""></a>
- </div>
- </div>
- </div>
- <div class="scroller_navigate"><img src="images/right.gif" alt=""></div>
- </div>
Code: Убрать нумерацию
- <style type="text/css">
- .scroller_container div {
- float: left;
- vertical-align: baseline;
- }
- .scroller_window {
- width: 850px; /* ширина окна скроллера */
- overflow: hidden;
- }
- .scroller_row {
- position: relative;
- white-space: nowrap;
- width: 100%;
- padding: 22px 0 22px 0; /* отступы для перфорации пленки */
- background: url('images/foto.gif') repeat-x;
- }
- .scroller_row img {
- padding: 0px;
- margin: 0px;
- }
- .scroller_row a {
- padding: 0px;
- margin: 0px;
- }
- .scroller_navigate {
- padding: 2px 1px 0 1px;
- cursor: pointer;
- }
- a img {
- border: 0px;
- }
- </style>
Code (JavaScript) : Убрать нумерацию
- // Глобальный объект скроллера
- var scroller={ };
- // Инициализация скроллера
- function scroller_init() {
- var el;
- // Получить ширину внутренней части скроллера
- el=document.getElementById('scroller_rule');
- scroller.width=el.clientWidth;
- // Получить ширину окна скроллера
- el=document.getElementById('scroller_window');
- scroller.window=el.clientWidth;
- // Установка обработчика колесика мыши
- if (el.addEventListener) {
- // Mozilla, Opera, Safari, Chrome
- if (!(smart_chrome_check()=='666' || typeof(opera)=='object')) {
- el.addEventListener('DOMMouseScroll', scroll_wheel, false);
- }
- else {
- el.addEventListener('mousewheel', scroll_wheel, false);
- }
- }
- else {
- // IE
- el.attachEvent('onmousewheel', scroll_wheel);
- }
- scroller.position=0;
- scroller.step=2;
- scroller.timer=null;
- // fix размеров для background (Opera, Chrome)
- el=document.getElementById('scroller_row');
- el.style.width=scroller.width;
- }
- // Проверка на Google Chrome
- function smart_chrome_check() {
- // 66 - Internet Explorer && Chrome Trap
- return(arguments.callee.toString().replace(/[^6]/g,''));
- }
- // Обработчик колесика мыши
- function scroll_wheel(e) {
- e = e ? e : window.event;
- var wheelElem = e.target ? e.target : e.srcElement;
- var wheelData = e.detail ? e.detail * -1 : e.wheelDelta / 40;
- // В движке WebKit возвращается значение в 100 раз больше
- if (Math.abs(wheelData)>100) { wheelData=Math.round(wheelData/100); }
- if (wheelData<0) {
- do_scroll('right',10*Math.abs(wheelData));
- }
- else {
- do_scroll('left',10*Math.abs(wheelData));
- }
- // Подавление события колесика мыши, чтобы оно не передавалось дальше
- if (window.event) {
- e.cancelBubble = true;
- e.returnValue = false;
- e.cancel = true;
- }
- if (e.stopPropagation && e.preventDefault) {
- e.stopPropagation();
- e.preventDefault();
- }
- return false;
- }
- // Функция скроллера
- function do_scroll(dir,step) {
- var el=document.getElementById('scroller_row');
- // Прокрутка влево
- if (dir=='left') {
- scroller.position+=step;
- // Если скроллер вышел за левую границу, то установить позицию в 0
- if (scroller.position>0) {
- scroller.position=0;
- }
- }
- // Прокрутка вправо
- else {
- scroller.position-=step;
- // Если скроллер вышел за правую границу, то установить позицию в край
- if (scroller.position<(scroller.window-scroller.width)) {
- scroller.position=scroller.window-scroller.width;
- }
- }
- // Установить позицию полосы скроллера
- el.style.left=scroller.position+'px';
- }
- // Таймер скроллера
- function scroll_timer(dir) {
- if (scroller.timer==null) {
- scroller.timer=setInterval("do_scroll('"+dir+"', "+scroller.step+");",10);
- }
- }
- // Остановка скроллера
- function scroll_stop() {
- if (scroller.timer!=null) {
- clearInterval(scroller.timer);
- scroller.timer=null;
- }
- }
Code (HTML) : Убрать нумерацию
- <div class="scroller_navigate"><img src="images/left.gif" alt=""
- onmousemove="scroll_timer('left');" onmouseout="scroll_stop();"></div>
- ...
- <div class="scroller_navigate"><img src="images/right.gif" alt=""
- onmousemove="scroll_timer('right');" onmouseout="scroll_stop();"></div>
Code (JavaScript) : Убрать нумерацию
- <script type="text/javascript">scroller_init();</script>
Просмотров: 13262 | Комментариев: 21
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
DiPrm
(29.04.2017 в 22:13):
Pure JavaScript рулит! Пару лет назад прочитал статью и вдохновился к написанию собственного лайтбокса: http://busibox-pro.getforge.io/
Eblinkoff
(09.09.2015 в 15:04):
Спасибо, мне оказалось полезно. Да, целиком не перенесёшь, ну, да и ладно. Это и не нужно, подпилил под себя, сделал резиновым и ок. Впереди написание лайтбокса, большое спасибо!
SBM
(06.01.2015 в 22:51):
Не так очевидно, тем, кто недавно взялся за JavaScript)
Если не сложно, можно дать пример
Если не сложно, можно дать пример
ManHunter
(06.01.2015 в 22:26):
Переписать на вертикальную прокрутку. Очевидно же.
SBM
(06.01.2015 в 22:18):
Очень симпатичный скрипт, а как сделать так же, только вертикально?
ManHunter
(01.02.2013 в 11:56):
Обновил скроллер на сервере, теперь там есть плавная прокрутка при скролле колесиком.
незнакомка
(08.07.2012 в 19:58):
Случайно зашла, отличные статьи
ManHunter
(17.11.2011 в 10:59):
Вообще-то еще не так давно для фотографий применялась фотопленка, и выглядела она примерно так же, как скроллер :)
Станислас
(17.11.2011 в 10:57):
Симпатичная вещч. Правда внешний вид больше подходит для сайтов с кинотематикой (одна перфорация чего стоит), но задумка очень удобная, стянул для своего сайта.
Большое спасибо.
Большое спасибо.
ManHunter
(26.10.2011 в 13:01):
Здесь же работает. Вывод? Дело не в бобине.
Джеймхуй Бонд
(26.10.2011 в 12:56):
Хотели использовать на своём сайте, но не судьба.
Скроллер распирает шаблон страницы до размеров общей длины ленты.
и бэкграунд (foto.gif) отображается только на изначально видимой части скроллера, если двигать ленту то изначально скрытая часть отображается без фона.
Скроллер распирает шаблон страницы до размеров общей длины ленты.
и бэкграунд (foto.gif) отображается только на изначально видимой части скроллера, если двигать ленту то изначально скрытая часть отображается без фона.
ManHunter
(14.10.2011 в 23:09):
Когда-нибудь будет. Когда конкретно - не знаю.
Елена
(14.10.2011 в 22:47):
А лайтбокс ожидается?
Спасибо за статью.
Спасибо за статью.
kruvas
(12.09.2011 в 03:19):
интересно выглядит... только есть небольшой недочет - при скролле роликом мышки картинки двигаются рывком и ровно на кадрик - ощущение что перфорация не движется. решил добавить функцию для анимации.
получилась всего одна дополнительная функция animate, и в ф-ии scroll_wheel надо заменить вызов do_scroll на animate с такими же аргументами
вот что получилось в итоге
http://78.46.63.240/animated.html
получилась всего одна дополнительная функция animate, и в ф-ии scroll_wheel надо заменить вызов do_scroll на animate с такими же аргументами
вот что получилось в итоге
http://78.46.63.240/animated.html
Владимир
(08.09.2011 в 00:41):
Спасибо нужная статья прочитал с удовольствием .
ManHunter
(25.08.2011 в 20:29):
Ну значит себе в ближайшие планы поставлю написание лайтбокса. А там видно будет. Отпуск на носу, настроение нихера не рабочее.
AlexKlu
(25.08.2011 в 20:24):
Согласен с комрадом Isaev-ым... Подскажи, дружище, как можно при клике разворот фотки получить. Уж больно глянулся этот скроллер...
ManHunter
(17.08.2011 в 23:11):
Если я что-то могу сделать самостоятельно, то я это сделаю самостоятельно, и сделаю это на чистом JavaScript без всяких посторонних фреймворков. jquery - это НЕ программирование.
Вадим
(17.08.2011 в 22:55):
Личное мое мнение - на данный момент лучше всего все яваскрипты делать под jquery. В любом случае на современном сайте как минимум данная библиотека должна быть подключена, а уж на ее основе и делать все необходимые яваскрипты.
ManHunter, хороший скрипт, только еще бы зациклить его, т.е. бесконечную прокрутку сделать.
ManHunter, хороший скрипт, только еще бы зациклить его, т.е. бесконечную прокрутку сделать.
ManHunter
(17.08.2011 в 11:07):
Это обязательно будет когда я нарисую свой лайтбокс для картинок. Но это пока только в задумках, за реализацию еще не брался.
Isaev
(17.08.2011 в 04:43):
Как обычно, профподход... А при клике бы плавное масштабирование на весь размер
Добавить комментарий
Заполните форму для добавления комментария