Статьи

Сделайте простое слайдшоу JavaScript без jQuery

Эта статья была рецензирована Дэном Принсом и Крисом Перри . Спасибо всем рецензентам SitePoint за то, что сделали контент SitePoint как можно лучше!

«Я просто хочу сделать простое слайд-шоу JavaScript без jQuery».

Слайд-шоу, также называемое каруселью изображений, слайдером или вращающимся баннером, является популярным учебным пособием среди людей, изучающих JavaScript.

В этом уроке мы рассмотрим следующие темы:

  • сделать простое слайд-шоу без каких-либо внешних библиотек, таких как jQuery
  • понимать вопросы UX и специальных возможностей, включая необходимость использования слайд-шоу
  • добавить элементы управления в слайд-шоу.

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

В этом руководстве предполагается, что вы знаете некоторый JavaScript, включая функции, события нажатия и изменения стиля. Для тех, кто посчитает это полезным, я написал краткую дорожную карту, где можно научиться делать практические вещи с помощью JavaScript как можно скорее .

Сделать базовое слайд-шоу

HTML

Для HTML нам понадобится контейнер для слайдов и сами слайды. Вот как это будет выглядеть:

<ul id="slides"> <li class="slide showing">Slide 1</li> <li class="slide">Slide 2</li> <li class="slide">Slide 3</li> <li class="slide">Slide 4</li> <li class="slide">Slide 5</li> </ul> 

CSS

Основной CSS должен будет выполнить эти вещи:

  • определить контейнер для слайдов
  • поместите слайды друг на друга в контейнере
  • определить, как должен выглядеть слайд, когда он показывает или скрывает
  • изменить прозрачность для эффекта затухания.

Прежде чем смотреть на CSS, помните, что вам может потребоваться изменить имена классов и идентификаторов, чтобы избежать конфликтов на ваших собственных сайтах. Названия в этой статье были выбраны, чтобы быть короткими и читабельными.

Вот как будет выглядеть ядро ​​CSS:

 /* essential styles: these make the slideshow work */ #slides { position: relative; height: 300px; padding: 0px; margin: 0px; list-style-type: none; } .slide { position: absolute; left: 0px; top: 0px; width: 100%; height: 100%; opacity: 0; z-index: 1; -webkit-transition: opacity 1s; -moz-transition: opacity 1s; -o-transition: opacity 1s; transition: opacity 1s; } .showing { opacity: 1; z-index: 2; } 

Теперь вы можете добавить другие стили, чтобы изменить внешний вид слайд-шоу. Я использовал следующее для этой демонстрации:

 /* non-essential styles: just for appearance; change whatever you want */ .slide { font-size: 40px; padding: 40px; box-sizing: border-box; background: #333; color: #fff; } .slide:nth-of-type(1) { background: red; } .slide:nth-of-type(2) { background: orange; } .slide:nth-of-type(3) { background: green; } .slide:nth-of-type(4) { background: blue; } .slide:nth-of-type(5) { background: purple; } 

JavaScript

У JavaScript есть одно задание: скрыть текущий слайд и показать следующий. Для этого нам просто нужно изменить классы рассматриваемых слайдов.

Вот как будет выглядеть JavaScript:

 var slides = document.querySelectorAll('#slides .slide'); var currentSlide = 0; var slideInterval = setInterval(nextSlide,2000); function nextSlide() { slides[currentSlide].className = 'slide'; currentSlide = (currentSlide+1)%slides.length; slides[currentSlide].className = 'slide showing'; } 

Давайте разберемся, что здесь происходит.

  1. Во-первых, мы используем querySelectorAll чтобы получить слайды из нашего контейнера.
  2. Далее мы устанавливаем переменную для отслеживания текущего слайда.
  3. Затем мы создаем интервал для показа следующего слайда каждые две секунды (выражается как 2000 мс).

Давайте более nextSlide рассмотрим, что происходит внутри функции nextSlide :

  • Сначала мы изменим класс текущего слайда, чтобы он не показывался. CSS-переход автоматически обрабатывает затухание.
  • Затем мы добавляем один к текущему слайду, но используем оператор% для возврата к нулю, если мы достигли конца слайдов. В качестве быстрого напоминания оператор% делит два числа и выплевывает остаток. Это отлично подходит для случаев, когда вы должны делать математику с циклами, такими как часы или календарь. В данном случае у нас есть 5 слайдов, поэтому вот что происходит с каждым числом: 1% 5 = 1, 2% 5 = 2, 3% 5 = 3, 4% 5 = 4 и 5% 5 = 0.
  • Как только у нас появится номер нового слайда, мы изменим класс этого слайда так, чтобы слайд показывался. Еще раз, наш CSS-переход непрозрачности автоматически обрабатывает эффект затухания.

Congrats! Теперь у вас есть базовое слайд-шоу.

Примечание о совместимости:
CSS-переходы несовместимы с IE9 и ниже, поэтому вместо эффекта затухания слайд-шоу будет изящно ухудшаться при отображении следующего слайда.

Вот основное слайд-шоу в действии:

UX и доступность

Прежде чем использовать слайд-шоу, внимательно подумайте о его роли на вашей странице. Давайте посмотрим, как слайд-шоу может испортить пользовательский опыт и доступность вашего сайта, если вы не будете осторожны.

Слайд-шоу может скрыть критический контент

Если что-то является приоритетом на вашем сайте, это не должно быть скрыто в слайд-шоу. Вы не можете рассчитывать на то, что люди увидят данный слайд в идеальных условиях, не говоря уже о том, когда проблемы с доступностью вступают в игру.

Согласно исследованию, проведенному в Университете Нотр-Дам , только 1,07% людей нажимали на функцию в слайд-шоу, и из этой и без того небольшой доли людей, 3% или меньше нажимали на любой отдельный слайд, кроме первого. В этом примере показано, как опасно зависеть от слайд-шоу для критического контента.

Пользователь может запутаться в основной цели сайта

Это особенно проблема с большими слайд-шоу домашней страницы. Если вы не можете решить, что показать пользователю, как вы можете ожидать, что пользователь сам решит, что ему делать? ( Чирикать это )

Ваш сайт должен иметь четкий и очевидный путь к тому, что пользователь должен делать, и если слайд-шоу мешает этому, возможно, пришло время пересмотреть стратегию страницы.

WiderFunnel, фирма по оптимизации конверсии, проверила эффективность слайд-шоу и пришла к следующему выводу:

Мы много раз тестировали ротационные предложения и обнаружили, что это плохой способ представления содержимого домашней страницы.

Стоит прочитать подробное описание их результатов, если у вас есть шанс.

Мобильные пользователи не могут быть счастливы

Слайд-шоу может увеличить время загрузки и использования данных на мобильных устройствах в дополнение к усложнению управления.

Когда использовать слайд-шоу

Итак, учитывая потенциальные проблемы, которые может создать слайд-шоу, когда будет подходящее время для их использования? Вот несколько предложений.

Давать общее впечатление

Если вам все равно, видит ли пользователь какой-либо отдельный слайд, но вы просто хотите, чтобы у него было общее визуальное впечатление о чем-то, можно использовать слайд-шоу. В этом случае, если пользователь видит только один слайд, ничего существенного не будет потеряно.

Когда контент легко доступен за пределами слайд-шоу

Например, может быть, вы хотите показать фотографии курорта, музея, события или продуктовой линейки в виде слайд-шоу, но у вас также есть полная фотогалерея или коллекция продуктов в другом месте в легко доступной части вашего сайта. , Тогда было бы хорошо использовать слайд-шоу.

В ситуации прогрессивного улучшения

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

Указатели доступности

Если содержание вашего слайд-шоу настолько важно, что вам нужно сделать его доступным, подумайте о том, хотите ли вы сначала представить этот контент в виде слайд-шоу.

Если вы (или ваши клиенты!) Настаиваете на использовании слайд-шоу, вот отличная статья о том, как сделать его доступным .

Согласно этой статье:

Есть пять принципов, которые необходимо соблюдать, чтобы создать доступный
слайд-шоу:

  1. Разрешить пользователю остановить все движение
  2. Обеспечить видимые элементы управления, доступные для клавиатуры, мыши и сенсорного
  3. Обеспечьте действительный и понятный порядок фокусировки через слайд-шоу
  4. Действительное кодирование и таблицы стилей
  5. Обеспечить значимую альтернативу слайд-шоу

Кроме того, комментатор в этой статье указал на полезный ресурс для решения, следует ли использовать слайд-шоу .

Чтобы сделать наше слайд-шоу более доступным, мы добавим несколько элементов управления.

Добавить элементы управления в слайд-шоу

Пришло время добавить кнопку «Пауза / Воспроизведение», кнопку «Далее» и кнопку «Назад».

Кнопка паузы / воспроизведения

Сначала добавьте кнопку в HTML:

 <button class="controls" id="pause">Pause</button> 

Затем добавьте это в JavaScript:

 var playing = true; var pauseButton = document.getElementById('pause'); function pauseSlideshow() { pauseButton.innerHTML = 'Play'; playing = false; clearInterval(slideInterval); } function playSlideshow() { pauseButton.innerHTML = 'Pause'; playing = true; slideInterval = setInterval(nextSlide,2000); } pauseButton.onclick = function() { if(playing) { pauseSlideshow(); } else { playSlideshow(); } }; 

Вот что происходит в сценарии:

  • Переменная воспроизведения хранит информацию о том, воспроизводится ли слайд-шоу.
  • Мы храним кнопку паузы в переменной, поэтому нам не нужно искать ее в нашем документе.
  • Функция pauseSlideshow приостанавливает слайд-шоу и вместо этого заставляет кнопку «Пауза» произносить «Play».
  • Функция playSlideshow воспроизводит слайд-шоу и заставляет кнопку «Play» сказать «Пауза».
  • Наконец, мы прикрепляем обработчик щелчков, чтобы кнопка «Пауза / Воспроизведение» переключала слайд-шоу между паузой и воспроизведением.

Вот как ваше слайд-шоу будет работать с кнопкой паузы:

Кнопки «Следующая» и «Предыдущая»

Сначала добавьте кнопки «Next» и «Previous» в ваш HTML:

 <button class="controls" id="previous">Previous</button> <button class="controls" id="next">Next</button> 

Для вашего JavaScript измените это …

 function nextSlide() { slides[currentSlide].className = 'slide'; currentSlide = (currentSlide+1)%slides.length; slides[currentSlide].className = 'slide showing'; } 

… к этому:

 function nextSlide() { goToSlide(currentSlide+1); } function previousSlide() { goToSlide(currentSlide-1); } function goToSlide(n) { slides[currentSlide].className = 'slide'; currentSlide = (n+slides.length)%slides.length; slides[currentSlide].className = 'slide showing'; } 

В приведенном выше сценарии мы добавили общую функцию goToSlide для большей гибкости. Мы также немного изменили математику внутри переменной currentSlide , чтобы избежать отрицательных чисел. Чтобы проверить это самостоятельно, выберите число для slides.length и посмотрите, что происходит с currentSlide при изменении n .

Теперь добавьте этот JavaScript, чтобы при нажатии кнопки делали то, что им нужно:

 var next = document.getElementById('next'); var previous = document.getElementById('previous'); next.onclick = function() { pauseSlideshow(); nextSlide(); }; previous.onclick = function() { pauseSlideshow(); previousSlide(); }; 

Теперь у вас есть рабочие элементы управления!

Вот как может выглядеть слайд-шоу с элементами управления и некоторыми добавленными стилями:

Обратите внимание, что мы приостанавливаем слайд-шоу, когда пользователь нажимает «Далее» или «Предыдущий», так что при автоматическом воспроизведении навигация пользователя не будет нарушена.

Поскольку элементы управления являются кнопками HTML, к ним можно получить доступ через клавиатуру автоматически.

Не стесняйтесь стилизовать и расположить элементы управления так, как вам нравится — при условии, что они понятны и удобны в использовании.

Если вы хотите добавить элементы управления клавиатуры влево и вправо (не включены здесь), убедитесь, что вы отключили эти элементы управления, когда пользователь может использовать стрелки в другом месте — например, в текстовом поле.

Запасы, когда JavaScript недоступен

Иногда JavaScript не загружается, отключается, не поддерживается устройством и т. Д. В идеале конечный пользователь получит что-то полезное даже в таких ситуациях. От того, как вы справитесь с запасными вариантами слайд-шоу, зависит от ваших целей. Вы можете показать только первое изображение или все изображения в списке.

Если основная цель слайд-шоу состоит в том, чтобы создать общее визуальное впечатление о чем-либо, и более важно сохранить макет страницы, чем показать все изображения, тогда вам нужно будет показать первое изображение.

Если нужно увидеть все изображения, вы можете перечислить их.

В любом случае мы рассмотрим шаги здесь.

Скрыть элементы управления, когда JavaScript не доступен

Используйте CSS, чтобы скрыть элементы управления по умолчанию.

 .controls { display: none; } 

Затем используйте JavaScript, чтобы показать элементы управления. Таким образом, пользователь увидит элементы управления, только если включен JavaScript.

 var controls = document.querySelectorAll('.controls'); for(var i=0; i<controls.length; i++){ controls[i].style.display = 'inline-block'; } 

Приведенный выше код перебирает все элементы управления и делает их все видимыми.

Список изображений слайдов, когда JavaScript не доступен

Сначала измените свой класс .slide с position: absolute; для position: static; , Таким образом, слайды будут перечислены по умолчанию.

Затем добавьте JavaScript, чтобы перебрать все слайды и изменить их положение на абсолютное, вот так (убедитесь, что поместили этот код после определения переменной slides ):

 for(var i=0; i<slides.length; i++) { slides[i].style.position = 'absolute'; } 

Таким образом, слайды не будут перечислены, если JavaScript доступен.

Вывод

Мы рассмотрели, как сделать простое слайд-шоу, как справиться с некоторыми проблемами UX и доступности, а также как добавить элементы управления.

Самый важный вывод заключается в следующем: всякий раз, когда вы размещаете что-то на странице, подумайте о том, как это влияет на восприятие пользователя и как оно помогает достичь главной цели сайта. Если нет четкого ответа, возможно, пришло время пересмотреть.

Так что ты думаешь? У вас есть какие-нибудь истории о впечатлениях от слайд-шоу? Ужасные? Весёлые? Не стесняйтесь поделиться в комментариях.