Эта статья была рецензирована Дэном Принсом и Крисом Перри . Спасибо всем рецензентам 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'; }
Давайте разберемся, что здесь происходит.
- Во-первых, мы используем
querySelectorAll
чтобы получить слайды из нашего контейнера. - Далее мы устанавливаем переменную для отслеживания текущего слайда.
- Затем мы создаем интервал для показа следующего слайда каждые две секунды (выражается как 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, фирма по оптимизации конверсии, проверила эффективность слайд-шоу и пришла к следующему выводу:
Мы много раз тестировали ротационные предложения и обнаружили, что это плохой способ представления содержимого домашней страницы.
Стоит прочитать подробное описание их результатов, если у вас есть шанс.
Мобильные пользователи не могут быть счастливы
Слайд-шоу может увеличить время загрузки и использования данных на мобильных устройствах в дополнение к усложнению управления.
Когда использовать слайд-шоу
Итак, учитывая потенциальные проблемы, которые может создать слайд-шоу, когда будет подходящее время для их использования? Вот несколько предложений.
Давать общее впечатление
Если вам все равно, видит ли пользователь какой-либо отдельный слайд, но вы просто хотите, чтобы у него было общее визуальное впечатление о чем-то, можно использовать слайд-шоу. В этом случае, если пользователь видит только один слайд, ничего существенного не будет потеряно.
Когда контент легко доступен за пределами слайд-шоу
Например, может быть, вы хотите показать фотографии курорта, музея, события или продуктовой линейки в виде слайд-шоу, но у вас также есть полная фотогалерея или коллекция продуктов в другом месте в легко доступной части вашего сайта. , Тогда было бы хорошо использовать слайд-шоу.
В ситуации прогрессивного улучшения
Это более общий вопрос, но он не должен вызывать слишком много проблем, если вы хотите использовать слайд-шоу как аккуратную визуальную вещь, которая не имеет решающего значения для функциональности сайта. Пока это аккуратный дополнительный и не критический блокпост, у вас все будет хорошо.
Указатели доступности
Если содержание вашего слайд-шоу настолько важно, что вам нужно сделать его доступным, подумайте о том, хотите ли вы сначала представить этот контент в виде слайд-шоу.
Если вы (или ваши клиенты!) Настаиваете на использовании слайд-шоу, вот отличная статья о том, как сделать его доступным .
Согласно этой статье:
Есть пять принципов, которые необходимо соблюдать, чтобы создать доступный
слайд-шоу:
- Разрешить пользователю остановить все движение
- Обеспечить видимые элементы управления, доступные для клавиатуры, мыши и сенсорного
- Обеспечьте действительный и понятный порядок фокусировки через слайд-шоу
- Действительное кодирование и таблицы стилей
- Обеспечить значимую альтернативу слайд-шоу
Кроме того, комментатор в этой статье указал на полезный ресурс для решения, следует ли использовать слайд-шоу .
Чтобы сделать наше слайд-шоу более доступным, мы добавим несколько элементов управления.
Добавить элементы управления в слайд-шоу
Пришло время добавить кнопку «Пауза / Воспроизведение», кнопку «Далее» и кнопку «Назад».
Кнопка паузы / воспроизведения
Сначала добавьте кнопку в 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 и доступности, а также как добавить элементы управления.
Самый важный вывод заключается в следующем: всякий раз, когда вы размещаете что-то на странице, подумайте о том, как это влияет на восприятие пользователя и как оно помогает достичь главной цели сайта. Если нет четкого ответа, возможно, пришло время пересмотреть.
Так что ты думаешь? У вас есть какие-нибудь истории о впечатлениях от слайд-шоу? Ужасные? Весёлые? Не стесняйтесь поделиться в комментариях.