Статьи

Создание плагина WordPress для карусели: часть 3

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

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

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

Связывание файла JavaScript

Здесь мы будем использовать JavaScript, чтобы сделать наши стрелки полезными. Что касается CSS-части, создайте новый файл. Я назвал это carousel.js и поместил его в корень папки плагина.

Нам нужно указать WordPress, что мы используем файл JavaScript. Для этого мы будем использовать wp_enqueue_script() .

 wp_enqueue_script('carousel', plugin_dir_url(__FILE__) . 'carousel.js', array('jquery'), '1.0', true); 

Первые два параметра такие же, как и для wp_enqueue_style() . Затем мы находим массив. В этом массиве перечислены зависимости, скрипты, необходимые нашему скрипту для работы. Я решил использовать jQuery, чтобы обойти проблемы совместимости браузера, поэтому я указываю WordPress, что хочу его использовать: как мы видели в нашей статье о правильном включении скриптов в WordPress , 'jquery' — это признанное значение в WordPress.

Четвертый параметр — это номер версии скрипта. Это не очень важно здесь (см. Статью, ранее связанную для получения дополнительной информации), но нам нужно было использовать последний параметр и установить его в значение true чтобы наш скрипт был включен в нижний колонтитул.

Преимущество выбора wp_enqueue_script() колонтитула вместо заголовка заключается в том, что мы можем использовать wp_enqueue_script() где угодно. У нас нет ограничений на его использование перед wp_head() как с wp_enqueue_style() . Тогда мы сможем включить наш сценарий, только если это необходимо: только если мы отобразим карусель.

Поэтому лучшее место для размещения wp_enqueue_script() — это состояние нашей функции display_carousel() . Мы будем отображать карусель, только если есть элементы для отображения, поэтому мы включим наш сценарий с тем же условием.

 function display_carousel() { // … // Here we retrieve the links // … if (!empty($links)) { wp_enqueue_script(/* parameters listed above */); // … // Display // … } } 

Теперь мы готовы отредактировать наш файл JavaScript.

Что мы хотим сделать?

Сначала мы инкапсулируем весь наш код в функцию. Чтобы предотвратить конфликты с другими библиотеками, WordPress отключает использование $ в jQuery. Мы можем включить его снова с помощью этой функции.

 jQuery(function($) { // The code we will write must be placed here }); 

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

схема

Чтобы переместить его, мы будем играть с его CSS-свойством margin-left . По умолчанию он установлен на 0 и поэтому «отображает» первый элемент. Первый элемент достаточно большой, чтобы заполнить блок карусели, а второй, находящийся рядом с ним, нельзя увидеть благодаря свойству overflow .

Чтобы отобразить второй элемент, нам нужно переместить блок ul влево, чтобы выровнять левую сторону второго элемента с левой стороной блока карусели. Это может быть достигнуто с отрицательным левым полем. Чтобы проверить, какое значение нам нужно использовать, мы можем поэкспериментировать с некоторым кодом CSS (который мы удаляем сразу после того, как он нам не нужен).

 #carousel ul { margin-left: -100%; } 

Эта простая строка заслуживает объяснения. Если вы протестируете его, вы увидите, что первый элемент не отображается, вместо этого мы видим второй элемент. Вы можете проверить другое значение, чтобы лучше понять, что произошло. -50px с -50px мы перемещаем блок ul 50 пикселей влево. Со значениями, которые я показал вам в CSS выше, поскольку карусель имеет ширину 900 пикселей, я могу отобразить второй элемент со значением -900px .

Однако вместо этого мы можем использовать проценты. Преимущество состоит в том, что этот процент относительно контейнера. Здесь «100%» равно «900 пикселям», поэтому, если мы даем значение -100% , мы скрываем первый элемент и отображаем второй. Использование процентов позволяет изменять ширину контейнера без изменения значений свойства margin-left .

Функция для отображения другого элемента

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

 function carousel_show_another_link(direction) { } 

Куда мы идем?

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

 var ul = $('#carousel ul'); var current = -parseInt(ul[0].style.marginLeft) / 100; 

Первая строка возвращает блок ul . Как мы будем использовать его позже, хранение в переменной является хорошей идеей. Вторая строка может показаться немного странной. Цель состоит в том, чтобы сохранить целое число, представляющее текущий отображаемый элемент. Первый элемент будет представлен 0 , второй — 1 и т. Д.

Для этого мы получаем текущее значение свойства margin-left . Проблема в том, что это значение примерно равно -200% и нам нужно число: чтобы удалить «%», мы используем функцию parseInt() которая преобразует значение в целое число (например, '-200%' становится -200 ). Поскольку мы хотим получить положительное целое число, мы добавляем знак «минус» (например, чтобы получить 200 из -200 ) и делим на 100, чтобы получить желаемое значение (например, 2 , а не 200 ).

Вы можете удивиться, почему мы не использовали ul.css('margin-left') чтобы получить значение свойства margin-left . На самом деле .css() — это метод jQuery, и в нашем контексте это, кажется, лучшая идея. Проблема в том, что этот метод не даст нам процент. Используя те же значения, что и выше, если текущий элемент является третьим, свойство margin-left установлено на -200% а метод .css() вернет -1800px . Чтобы вычислить текущий элемент, используя это значение в пикселях, нам нужно использовать ширину большого контейнера, и я предпочитаю использовать только блок ul .

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

 var new_link = current + direction; 

Существует ли новый предмет?

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

 var links_number = ul.children('li').length; if (new_link >= 0 && new_link First we get the total number of items, which is the number of li tags in our list. This number is useful for the condition we described above as we want a positive integer that mustn't be greater than or equal to the number of items (don't forget that we begin with 0 and not 1 ). 

Отображение нового товара

Наконец, перемещение блока может быть достигнуто одной строкой. Мы должны рассчитать новое значение margin-left . Чтобы сделать это, давайте подумаем об этом. Для каждого «пройденного» элемента у нас есть ширина 100% для перемещения. Таким образом, новое значение margin-left будет в 100 раз больше новой позиции элемента, которую мы только что рассчитали, со знаком минус, чтобы перейти влево.

[js] ul.animate ({'margin-left': - (new_link * 100) + '%'});

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

Некоторые псевдонимы для более практического использования

Теперь мы создадим функции, которые будут вызываться каждый раз, когда пользователь нажимает на стрелку. Эти функции не требуют большого количества кода, так как единственное, что они делают, это вызывают функцию carousel_show_another_link() с правильным параметром. Ниже приведен код функции, которая вызывается, когда мы щелкаем «предыдущую» стрелку.

 function carousel_previous_link() { carousel_show_another_link(-1); return false; } 

Обратите внимание на return false; чтобы предотвратить поведение по умолчанию наших стрелок (не забывайте, что они являются ссылками). Таким образом, URL не изменится, когда пользователь щелкнет стрелку.

Функция, которая отображает «следующий» элемент, точно такая же, но с 1 в качестве параметра для carousel_show_another_link() . Я решил назвать его carousel_next_link() .

Прикрепление событий

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

 $(document).ready(function() { // Here we attach the events }); 

Мы хотим прикрепить функцию carousel_previous_link() к каждой «предыдущей» стрелке. С помощью дерева DOM нашей карусели мы можем легко получить их, точно так же, как мы извлекли их, когда хотели стилизовать их в CSS.

 $('#carousel ul li a.carousel-prev').click(carousel_previous_link); 

Затем мы можем прикрепить функцию #carousel ul li a.carousel-next carousel_next_link() к стрелкам вправо ( #carousel ul li a.carousel-next ) таким же образом.

Вы можете протестировать этот код, но должна появиться ошибка: при первом вызове функции carousel_show_another_link() свойство CSS margin-left для нашего блока ul не существует, поэтому при попытке получить его значение возникнет ошибка.

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

 $('#carousel ul').css('margin-left', 0); 

Это устанавливает свойство margin-left нашего блока ul в 0 по умолчанию. Это свойство теперь будет существовать без перемещения блока.

Теперь вы можете нажать на стрелки, карусель закончена, и она работает!

В заключение

В этом уроке мы рассмотрели создание плагина для карусели с использованием API менеджера ссылок WordPress. Это был хороший пример использования этого API, но также это был хороший способ увидеть, как объединить PHP, HTML, CSS и JavaScript в плагине WordPress.

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

Вы можете решить для себя, если вам нравится код, который мы использовали здесь. Если нет, не стесняйтесь редактировать его!

Даже если вам понравилось то, что мы сделали здесь, вы все равно можете улучшить результат. Например, посетители должны нажимать стрелки, чтобы увидеть другие элементы: вы можете попытаться автоматически анимировать карусель с помощью функции setTimeout() .

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