Slider

Vieraw

Администратор
Команда форума
Администратор
12 Май 2012
277
145
43
25
И так поиграемся с JS, сделаем простой слайд с анимацией (для анимации необходима поддержка css3).
Приступим.
Нам понадобятся html размертка, css стили, js код, картинки и немного времени.
HTML:
<div class="slider">
			<ul>
				<li>
					<img src="img/1.jpg" alt="">
				</li>
				<li>
					<img src="img/2.jpg" alt="">
				</li>
				<li>
					<img src="img/3.jpg" alt="">
				</li>
				<li>
					<img src="img/4.jpg" alt="">
				</li>
				<li>
					<img src="img/5.jpg" alt="">
				</li>
				<li>
					<img src="img/6.jpg" alt="">
				</li>
				<li>
					<img src="img/7.jpg" alt="">
				</li>
<li>
					<img src="img/8.jpg" alt="">
				</li>
			</ul>
		</div>
В html ничего сложного нету, блок для слайдера и список с восьмью картинками.
HTML:
			.slider
			{
				position: relative;
				overflow: hidden;
				width: 700px;
				height: 290px;
			}
			.slider ul, .slider li
			{
				margin: 0;
				padding: 0;
			}
			.slider ul
			{
				list-style: none;
				width: 9999px;
				transition: margin 0.5s ease-out 0s;
			}
			.slider ul li
			{
				float: left;
			}
			.slider .nav
			{
				position: absolute;
				bottom: 12px;
				left: 15px;
 
			}
			.slider .nav span
			{
				display: block;
				background: #fff;
				margin-left: 8px;
				opacity: 0.8;
				width: 16px;
				height: 16px;
				cursor: pointer;
				border-radius: 50%;
				float: left;
			}
			.slider .nav span.on
			{
				background: grey;
			}
Т.к. картинки у нас 700x290, то и блок для слайдера создаем такого же размере. Убираем стили со списка, на не нужны маркеры, которые идут по умочанию. Устанавливаем ширину в 9999px (можно и меньше, главно чтобы все картинки поместились) и делаем все его элементы палавающими, для того что бы они выстрились в одну строку. Тут же устнавливаем анимацию на свойство margin спомощью которого будем двигать картинки. Самому блоку со слайдером устанавливаем overflow: hidden. Делается это для того что бы скрыть все картинки кроме одной. Прописываем стили для навигации, которой будут переключатся слайды.
Если вы прочитали то, что написанно выше и заметили, что мы оформляем навигаци, но в html ее нет, молодцы. Ее действительно нет в html по той причине, что создавать ее будем на js в зависимости от количества картинок по которым необходимо переключаться.
Переходим к JS.
Нам понадобятся несколько вспомогательных функций: ready, addClass, removeClass. (Названия говорят сами за себя)
Их код:
HTML:
			function ready(fn)
			{
				if (document.readyState != 'loading')
				{
					fn();
				}
				else
				{
					document.addEventListener('DOMContentLoaded', fn);
				}
			}
			function addClass(el, className)
			{
				if (el.classList)
				{
					el.classList.add(className);
				}
				else
				{
					el.className += ' ' + className;
				}
			}
			function removeClass(el, className)
			{
				if (el.classList)
				{
 
					el.classList.remove(className);
				}
				else
				{
					el.className = el.className.replace(new RegExp('(^|\\b)' + className.split(' ').join('|') + '(\\b|$)', 'gi'), ' ');
				}
			}
Переходим к основному коду, он будет выполнятся после полной загрузки страницы. Для этого его необходимо передать, как аргумент, в функцию redy:
HTML:
ready(function()
{тут наш код
}
Генерируем навигацию по слайдам:
HTML:
var slider = document.querySelector('.slider');
				var li = document.querySelectorAll('.slider ul li');
 
				var nav = document.createElement('div');
				nav.className = 'nav';
 
				Array.prototype.slice.call(li).map(function(item, i)
				{
					var span = document.createElement('span');
					span.setAttribute('rel', i);
					if(i == 0)
					{
						addClass(span, 'on');
					}
					nav.appendChild(span);
				});
				slider.appendChild(nav);
Переключатся слайды будут по клику в навигации, поэтому что бы не вешать на каждый ее элемент обработчик клика. Мы сделаем один обрабочки на весь документ и будем проверять где произошел клик.
HTML:
document.addEventListener('click', function(e)
				{
					var target = e && e.target || event.srcElement;
					if(target.tagName === 'SPAN' && target.parentNode.className === 'nav')
					{
						var rel = target.getAttribute('rel');
						var ul =  document.querySelector('.slider ul');
						removeClass(document.querySelector('.slider .nav span.on'), 'on');
						addClass(target, 'on');
						ul.style.marginLeft = -slider.offsetWidth * rel + 'px';
					}
					return false;
				}, false);
Ну вот и все, если что-то не понятно спрашивайте. Так же принимаюеся конструктивная критика.
 

Вложения

  • 1.jpg
    1.jpg
    40,5 KB · Просмотры: 13
  • 2.jpg
    2.jpg
    36,3 KB · Просмотры: 10
  • 3.jpg
    3.jpg
    68,4 KB · Просмотры: 11
  • 4.jpg
    4.jpg
    113,4 KB · Просмотры: 10
  • 5.jpg
    5.jpg
    83,8 KB · Просмотры: 9
  • 6.jpg
    6.jpg
    45 KB · Просмотры: 9
  • 7.jpg
    7.jpg
    90,7 KB · Просмотры: 9
  • 8.jpg
    8.jpg
    68,4 KB · Просмотры: 9
  • slider.arc
    1,3 KB · Просмотры: 8
  • Like
Реакции: Juzilkree и StringName