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

Давайте на мгновение задумаемся, какие функции нам нужны.

  • Полноэкранный режим: когда пользователь щелкает изображение, мы хотим, чтобы оно открывало увеличенную версию изображения в полноэкранном окне.
  • Автоматически: мы не хотим, чтобы его нужно было отдельно активировать для каждого изображения. Мы хотим, чтобы он автоматически применялся к изображениям на странице.
  • Темный фон: многие изображения отлично смотрятся на темном фоне, поэтому мы сделаем фон темным за окном предварительного просмотра.
  • Интуитивно понятный: мы хотим, чтобы пользователю было легко понять, и не хотим, чтобы он чувствовал себя застрявшим в полноэкранном режиме. Браузеры уже показывают сообщение, но мы хотим упростить для пользователя возврат из полноэкранного просмотра изображения.

Начнем с стиля.

body { width:100%; height:100%; }
.row { display:flex; flex-wrap: wrap; }
.col { flex:1; }
#darkbox { width:99%; height:100%; position:absolute; top:0; left:0; background-color:#333; overflow: hidden; }
.imgsmall { max-width:300px; cursor:pointer; }
.imgfull { display:block; max-height:85%; margin-left:auto; margin-right:auto; position: relative; top: 50%; transform: translateY(-50%); }
.closebtn { position:absolute; top:2rem; right:2rem; width:1.5rem; height:1.5rem; style="cursor:pointer;" }

Стили .row и .col - это очень быстрая настройка flexbox для отображения изображений на странице. Как вы показываете свои изображения, зависит от вас, поэтому вам не нужно следовать этому, если вы не хотите.

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

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

Для кнопки закрытия я создал квадратное изображение размером 64 пикселя с помощью инструмента редактирования изображений и добавил заглавную букву X в белый текст. Я масштабировал это, чтобы соответствовать размеру изображения, и сохранил его с прозрачным фоном как png. (Вы, вероятно, не увидите изображение ниже, потому что оно белое на белом.)

Убрав стили, давайте продолжим код JavaScript.

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

<div class="row">
  <div class="col"><img class="imgsmall" src="images/1.png" /></div>
  <div class="col"><img class="imgsmall" src="images/2.jpg" /></div>
  <div class="col"><img class="imgsmall" src="images/3.jpg" /></div>
  <div class="col"><img class="imgsmall" src="images/4.jpg" /></div>
  <div class="col"><img class="imgsmall" src="images/5.jpg" /></div>
 </div>

Теперь о коде.

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

var imgUrl = '';

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

function startFullScreen(img) {
  imgUrl = img.src;
  if (!document.fullscreenElement) {
   document.documentElement.requestFullscreen();
  }
 }
 
 function endFullScreen() {
  document.exitFullscreen();
 }

Мы вызовем startFullScreen и передадим ему элемент изображения, по которому мы щелкнули, чтобы начать полноэкранный просмотр этого изображения. Это устанавливает src изображения в нашу переменную imgUrl, а затем запрашивает у браузера переход в полноэкранный режим. Через мгновение мы добавим eventListener, который будет обрабатывать все остальное, когда мы переключаемся в полноэкранный режим или из него. Функция endFullScreen просто сообщает браузеру, чтобы он прекратил работу в полноэкранном режиме.

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

document.addEventListener("fullscreenchange", function(e) {
  
  if (document.fullscreenElement) {
   // Create the darkBox
   var div = document.createElement("div");
   div.id = "darkbox";
   div.innerHTML = '<img class="imgfull" src="'+imgUrl+'" /> <img alt="exit fullscreen" title="Click to exit fullscreen (ESC)" class="closebtn" src="close.png" onclick="endFullScreen();" />';
   document.getElementById("main").style.background = '#333';
   document.getElementById("main").style.overflow = 'hidden';
   document.getElementById("main").appendChild(div);
  } else {
   // remove the darkbox and reset the page
   document.getElementById("main").style.background = 'white';
   document.getElementById("main").style.overflow = 'auto';
   var element = document.getElementById("darkbox");
   element.parentNode.removeChild(element);
  }
 }, false);

Как вы видете. Когда событие запускается, мы проверяем, полноэкранный он или нет. Если это так, мы создаем новый div и присваиваем ему идентификатор «darkbox». Затем мы заполняем его тегом изображения, который имеет класс imgFull и imgUrl в качестве src. Мы также добавляем кнопку закрытия, используя это простое изображение X, которое мы создали, и размещаем его в правом верхнем углу. Мы также меняем цвет фона тела и устанавливаем переполнение как скрытое, чтобы полосы прокрутки не отображались.

Если мы выходим из полноэкранного режима, мы должны удалить элемент div «darkbox» и сбросить тег body обратно.

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

(function() {
  
  imgelements = document.querySelectorAll("img");
  for(i = 0; i < imgelements.length; i++) {
   // add click event listener for all images on page
   imgelements[i].addEventListener("click", function(e) {
    var targetElement = event.target || event.srcElement;
    startFullScreen(targetElement);
   }, false);
  }
 })();

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

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

Примечание. Фотография, показанная в этом превью, сделана Эбен Одонкор из Pexels.

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