Подключаем и используем jquery компонент для создания на сайте лайтбокса — jquery.fancybox. Альтернатива плагину easyFancybox.
Скачать можно здесь.
Базовый функционал Fancybox
Подключаем скрипты и стили
function addsitefancybox() {
wp_enqueue_style( 'sitefancybox', plugins_url('/jquery.fancybox.css', __FILE__) );
wp_enqueue_script( 'sitefancybox', plugins_url('/jquery.fancybox.pack.js', __FILE__), array('jquery'), null, true );
wp_enqueue_script( 'sitefancybox-mousewheel', plugins_url('/jquery.mousewheel-3.0.6.pack.js', __FILE__), array('jquery'), null, true );
}
add_action( 'get_footer', 'addsitefancybox' );
Инициализируем fancybox при загрузке страницы
$("a[href$='.jpg'],a[href$='.jpeg'],a[href$='.png'],a[href$='.gif']").attr('rel', 'gallery').addClass('fancybox').fancybox();
$(document).ready(function() {
$('.fancybox').fancybox({
padding : 0,
openEffect : 'elastic',
closeBtn: false
});
});
Первый кусок кода находит все ссылки на изображения и задает им класс .fancybox, а также объединяет их в галерею.
Второй кусок инициализирует сам fancybox и задает его настройки, о них ниже.
Скачок при нажатии
Есть следующая проблема: при нажатии на ссылку fancybox лайтбокс работает нормально, но мы перескакиваем в начало страницы. Происходит это из-за свойсва height: 100%; в селекторе html/body.
Дополнительные компоненты fancybox (миниатюры, элементы управления)
Можно расширить функционал fancybox, добавив миниатюры изображений, автоматическую прокрутки, кнопки управления, расширение до оригинального размера и т.д.
Также может происходить скачок при включении лайтбокса из-за того что скрывается полоса прокрутки. Избавиться от этого эффекта можно прописав стиль:
body.compensate-for-scrollbar {overflow-y: scroll !important; overflow-x: hidden !important;}
Либо просто убрать у body width: 100%;
Настройки fancybox
- padding : 0 отступ белого поля от изображения (по-умолчанию 15px)
- margin : 20 отступ до границ экрана (по-умолчанию 20px)
- openEffect / closeEffect / nextEffect / prevEffect : ‘elastic’ эффект при открытии изображения (‘elastic’, ‘fade’ или ‘none’) (по-умолчанию fade)
- closeBtn: false скрыть кнопку закрытия (по-умолчанию true)
- loop: true изображения пролистываются по кругу
Подключаем fancybox локально
Чтобы не вызывать скрипты и стили fancybox там где они не нужны, устанавливаем проверку (is_singular() — страницы и записи любых типов):
function addsitefancybox() {
if ( is_singular() ) {
wp_enqueue_style( 'sitefancybox', plugins_url('/jquery.fancybox.css', __FILE__) );
wp_enqueue_script( 'sitefancybox', plugins_url('/jquery.fancybox.pack.js', __FILE__), array('jquery'), null, true );
wp_enqueue_script( 'sitefancybox-mousewheel', plugins_url('/jquery.mousewheel-3.0.6.pack.js', __FILE__), array('jquery'), null, true );
wp_enqueue_script( 'sitefancybox-init', plugins_url('/site-fancybox.js', __FILE__), array('jquery'), null, true );
}
}
add_action( 'wp_footer', 'addsitefancybox' );
Подключаем TouchSwipe
TouchSwipe-Jquery-Plugin добавляет fancybox возможность Touch перелистывания в мобильной версии.
Надо немного дополнить вызов fancybox
$(document).ready(function() { $('.fancybox').fancybox({ width: "100%", margin: [0, 0, 0, 0], padding: [0, 0, 0, 0], openEffect : 'none', closeEffect : 'none', prevEffect : 'fade', nextEffect : 'fade', closeBtn : false, arrows: false, helpers : { title : null, overlay : { css : { 'background' : 'rgba(0, 0, 0, 0.95)' } }, buttons : { } }, afterShow: function() { $('.fancybox-wrap').swipe({ swipe : function(event, direction) { if (direction === 'left' || direction === 'up') { $.fancybox.prev( direction ); } else { $.fancybox.next( direction ); } } }); }, afterLoad : function() { } }); });
Добавляем описание к изображениям
Добавляем к ссылке на изображение атрибут data-caption, пример:
<a href="/wp-content/uploads/2020/06/Dobavlyaem-opisanie-k-izobrazheniyam.jpg" data-caption="This is the caption"><img src="/wp-content/uploads/2020/06/Dobavlyaem-opisanie-k-izobrazheniyam-700x533.jpg" alt="" width="700" height="533"/></a>
В скрипт инициализации fabcybox добавляем параметр:
jQuery(document).ready(function() { jQuery('.fancybox').fancybox({ padding : 0, openEffect : 'elastic', closeEffect : 'elastic', closeBtn: false, beforeShow : function(){ this.title = jQuery(this.element).data('caption'); } }); });
Подпись для изображений проще всего брать из атрибута alt, который нужно прописывать у них в медиабиблиотеке.
Но чтобы получить атрибут alt нужно использовать доп.функцию определения ID
// Получить ID изображения
function cmb_get_image_id($image_src) {
global $wpdb;
$image = $wpdb->get_col($wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE guid='%s';", $image_src ));
return $image[0]; //return the image ID
}
Далее получаем alt
<?php $attachment_url = wp_get_attachment_image_url( $id, 'full' );
$attachment_id = cmb_get_image_id($attachment_url);
$image_alt = get_post_meta($attachment_id, '_wp_attachment_image_alt', true); ?>
Если выводятся изображения плагином Featured Galleries, то ID там есть в цикле
<?php $galleryArray = get_post_gallery_ids($post->ID); ?>
<?php foreach ($galleryArray as $id) { ?>
<?php $image_alt = get_post_meta($id, '_wp_attachment_image_alt', true); ?>
<a href="<?php echo wp_get_attachment_image_url( $id, 'full' ); ?>" data-caption="<?php echo $image_alt; ?>"><img src="<?php echo wp_get_attachment_image_url( $id, 'rectangle' ); ?>"></a>
<?php } ?>
Fancybox v.3
Недавно попробовал третью версию fancybox. Рекомендую использовать ее. Эта версия содержит все современные функции, работает плавно, без ошибок.
Для работы нужны только минифицированные основной скрипт и стили.
Скрипт инициализации слегка изменился:
$("a[href$='.jpg'],a[href$='.jpeg'],a[href$='.png'],a[href$='.gif']").attr('data-fancybox', 'gallery');
$(document).ready(function() {
$('[data-fancybox="gallery"]').fancybox({
});
});
Раздельные галереи
При открытии изображения fancybox показывает в галереи все изображения на странице с атрибутом data-fancybox=»gallery», т.е. в одной галереи. Если нужно чтобы галереи были разными, то нужно им задавать разные атрибуты data-fancybox.
data-fancybox="gallery01"
data-fancybox="gallery02"
data-fancybox="gallery03"
и т.д.
Добавляем общий скрипт для всех этих галерей (при этом отрываться они будут по раздельности):
// Options for all groups
$('[data-fancybox^="gallery"]').fancybox({
thumbs : {
autoStart : true
},
buttons : [
'zoom',
'close'
]
});
Стили при наведении
Чтобы при наведении был эффект:
a[data-fancybox] {position: relative; display: block;}
a[data-fancybox] img {display: block;}
a[data-fancybox]:before {
position: absolute;
top: 40%;
left: 50%;
margin: -8px 0 0 -9px;
content: '\f002';
font-family: FontAwesome5;
font-weight: 600;
color: #efefef;
font-size: 18px;
opacity: 0;
z-index: 1;
-webkit-transition: all 0.3s linear;
transition: all 0.3s linear;
}
a[data-fancybox]:hover:before {top: 50%; opacity: 1;}
a[data-fancybox]:after {
content: '';
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
background: rgba(57, 73, 73, 0.7);
opacity: 0;
-webkit-transition: all 0.3s linear;
transition: all 0.3s linear;
}
a[data-fancybox]:hover:after {opacity: 1;}
the requested content cannot be loaded
Это возникает в случае указания в href адреса изображения из текста. Происходит это из-за параметра data-type=»URL» которое добавляется к ссылке. Решается добавлением следующего скрипта:
jQuery("a[href$='.jpg'],a[href$='.jpeg'],a[href$='.png'],a[href$='.gif'],a[href$='.webp']").attr('data-type', 'image');
Конфликт со слайдером
Если у слайдера есть миниатюры. Открыв (увеличив) изображение и в режиме fancybox перелистав на другой изображение, при возврате в слайдере будет то изображение которое было в перемотке fancybox. И иногда это сбивает синхронизацию слайдов и миниатюр слайдов. В этом случае мы можем отключить функцию (backFocus: false) возврата и анимацию на текущий слайд.
jQuery(document).ready(function() {
jQuery('[data-fancybox="gallery"]').fancybox({
backFocus: false,
buttons: [
"zoom",
//"share",
"slideShow",
//"fullScreen",
//"download",
//"thumbs",
"close"
],
});
});
Также тут приведена функция выборочного набора кнопок fancybox.
Ничего не понял. Что куда вставлять? И зачем мне всю папку плагина скачивать?
Из всей папки плагина нам нужны только: jquery.fancybox.min.css, jquery.fancybox.min.js. Подключаем их на сайте:
function addsitefancybox() {
wp_enqueue_style( 'sitefancybox', plugins_url('/jquery.fancybox.min.css', __FILE__) );
wp_enqueue_script( 'sitefancybox', plugins_url('/jquery.fancybox.min.js', __FILE__), array('jquery'), null, true );
}
add_action( 'get_footer', 'addsitefancybox' );
Далее инициируем fancybox (вставляем функцию в файл со скриптами):
$("a[href$='.jpg'],a[href$='.jpeg'],a[href$='.png'],a[href$='.gif']").attr('data-fancybox', 'gallery');
Это все. Но я все это делаю в виде плагина, чтобы подключать только к сайтам где это требуется.