Гид по технологиям

Увеличитель изображений на сайте

7 min read Frontend Обновлено 07 Jan 2026
Увеличитель изображений на сайте: инструкция
Увеличитель изображений на сайте: инструкция

Зачем нужен увеличитель изображений

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

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

Лупа на фоне рук, лежащих на открытом ноутбуке.

Когда стоит использовать увеличитель

  • Каталоги товаров с мелкими деталями (текстура ткани, швы, маркировка).
  • Галереи фотографий, портфолио, медицинские изображения, схемы.
  • Когда высокая детализация влияет на конверсию или доверие.

Важно: если у вас уже есть возможность просматривать полноразмерную версию изображения в модальном окне, увеличитель остаётся полезным как быстрый «просмотр с близкого расстояния», особенно на страницах со множеством изображений.

Скриншот функции увеличения изображения на Amazon

Коротко о рабочем подходе

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

Структура проекта и файлы

Создайте папку и внутри неё три файла: index.html, style.css, main.js. В index.html добавьте базовую разметку и подключите CSS/JS.

  
  
  
  
    
    
  Image Magnifier  
    
  
  
  
  
  
  

В теле добавляем заголовок, подсказки и контейнер для изображения и «лупы». Обратите внимание: в примере ниже класс .hidden скрывает элемент через visibility, а не display — это помогает сохранить поток и вычисления стилей.

  
  

Image Magnifier

Press Arrow Up or Arrow Down to increase or decrease athe zoom level. Zoom Level: 1

Код CSS из примера оформляет контейнер и саму «лупу». Важно: переменные :root задают ширину/высоту увеличителя — удобно изменять размер одной переменной.

:root {  
  --magnifier-width: 150;  
  --magnifier-height: 150;  
}  
  
body {  
  display: flex;  
  flex-direction: column;  
  align-items: center;  
}  
  
.container {  
  width: 400px;  
  height: 300px;  
  background-size: cover;  
  background-image: url("https://cdn.pixabay.com/photo/2019/03/27/15/24/animal-4085255_1280.jpg");  
  background-repeat: no-repeat;  
  position: relative;  
  cursor: none;  
}  
  
.magnifier {  
  border-radius: 400px;  
  box-shadow: 0px 11px 8px 0px #0000008a;  
  position: absolute;  
  width: calc(var(--magnifier-width) * 1px);  
  height: calc(var(--magnifier-height) * 1px);  
  cursor: none;  
  background-image: url("https://cdn.pixabay.com/photo/2019/03/27/15/24/animal-4085255_1280.jpg");  
  background-repeat: no-repeat;  
}  
  
span {  
  display: block;  
}  
  
.header {  
  display: flex;  
  flex-direction: column;  
  align-items: center;  
}  
  
.hidden {  
  visibility: hidden;  
}  
  
div > span:nth-child(3) {  
  font-size: 20px;  
}  

JavaScript управляет взаимодействием: позиционирование «лупы», вычисление фоновой позиции и реакция на клавиши увеличения/уменьшения масштаба.

let magnifier = document.querySelector(".magnifier");  
let container = document.querySelector(".container");  
  
let magnifierWidth = getComputedStyle(magnifier).width.substring(  
   0,  
   getComputedStyle(magnifier).width.indexOf("p")  
);  
  
let magnifierHeight = getComputedStyle(magnifier).width.substring(  
   0,  
   getComputedStyle(magnifier).height.indexOf("p")  
);

Обратите внимание: в примере есть опечатка — при получении magnifierHeight используется getComputedStyle(magnifier).width вместо .height. Это распространённая ошибка; в рабочем коде замените первый .width на .height.

Далее задаём начальные переменные для уровня масштабирования и позиций курсора.

let zoomLevelLabel = document.querySelector(".zoom-level");  
let zoom = 2;  
let maxZoomLevel = 5;  
let pointerX;  
let pointerY;  
let magnifyX;  
let magnifyY;  

Функции‑помощники для получения текущего уровня зума и позиции указателя:

function getZoomLevel() {  
  return zoom;  
}  
  
function getPointerPosition() {  
  return { x: pointerX, y: pointerY }  
}  

Функция обновления изображения в лупе создаёт искусственное событие mousemove и отправляет его контейнеру — способ синхронизировать лупу при изменении уровня зума клавишами.

function updateMagImage() {  
  let evt = new MouseEvent("mousemove", {  
    clientX: getPointerPosition().x,  
    clientY: getPointerPosition().y,  
    bubbles: true,  
    cancelable: true,  
    view: window,  
  });  
  
  container.dispatchEvent(evt);  
}  

Обработчик клавиатуры увеличивает/уменьшает уровень при нажатии ArrowUp / ArrowDown и вызывает перерасчёт лупы:

window.addEventListener("keyup", (e) => {  
  if (e.key === "ArrowUp" && maxZoomLevel - Number(zoomLevelLabel.textContent) !== 0) {  
    zoomLevelLabel.textContent = +zoomLevelLabel.textContent + 1;  
    zoom = zoom + 0.3;  
    updateMagImage();  
  }  
  
  if (e.key === "ArrowDown" && !(zoomLevelLabel.textContent <= 1)) {  
    zoomLevelLabel.textContent = +zoomLevelLabel.textContent - 1;  
    zoom = zoom - 0.3;  
    updateMagImage();  
  }  
});  

Главный обработчик — mousemove на контейнере. Он делает лупу видимой, считает координаты относительно контейнера с учётом скролла, позиционирует элемент и задаёт backgroundSize/backgroundPosition исходя из зума и координат курсора.

container.addEventListener("mousemove", (e) => {  
  magnifier.classList.remove("hidden");  
  let rect = container.getBoundingClientRect();  
  let x = e.pageX - rect.left;  
  let y = e.pageY - rect.top;  
  
  x = x - window.scrollX;  
  y = y - window.scrollY;  
  
  magnifier.style.transform = `translate(${x}px, ${y}px)`;  
  const imgWidth = 400;  
  const imgHeight = 300;  
  
  magnifier.style.backgroundSize =  
    imgWidth * getZoomLevel() + "px " + imgHeight * getZoomLevel() + "px";  
  
  magnifyX = x * getZoomLevel() + 15;  
  magnifyY = y * getZoomLevel() + 15;  
  
  magnifier.style.backgroundPosition = -magnifyX + "px " + -magnifyY + "px";  
});  

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

container.addEventListener("mouseout", () => {  
  magnifier.classList.add("hidden");  
});  

window.addEventListener("mousemove", (e) => {  
   pointerX = e.clientX;  
   pointerY = e.clientY;  
});

Скриншот работающего увеличителя изображения

Оптимизация, доступность и надёжность

Доступность

  • Обеспечьте альтернативный способ получения увеличенного вида для пользователей клавиатуры и экранных читалок. Например, добавьте кнопку «Увеличить» рядом с изображением, которая открывает увеличенную версию в модальном окне.
  • Подпишите кнопку понятным aria-label: aria-label=”Увеличить изображение”.

Производительность

  • Если у вас много изображений на странице, не загружайте полноразмерные версии для всех одновременно. Используйте ленивую загрузку (loading=”lazy”) и подгружайте большой вариант только при первом наведении/клике.
  • Для высокого зума понадобится изображение с достаточным разрешением; иначе крупные пиксели испортят впечатление.

Кросс‑браузерность

  • Проверяйте transform и backgroundSize в старых браузерах. Для мобильных устройств поведение можно адаптировать: при касании открывать полноэкранный зум, вместо плавающей лупы.

Варианты реализации и альтернативы

  1. Классический подход — CSS background + JS для вычисления позиций (как в статье).
  2. Использовать canvas: отрисовывать увеличенную часть в canvas, что даёт больше контроля (фильтры, сглаживание), но сложнее.
  3. SVG: если изображение в векторе, масштабирование даёт идеальную чёткость.
  4. Модальное окно с увеличенным изображением: простая и доступная альтернатива для мобильных.

Когда не использовать лупу: если изображения однотипны и важна только общая форма (иконки), лупа будет лишней; лучше фокусироваться на скорости и простоте интерфейса.

Ментальные модели и эвристики

  • «Покажи то, что пользователю важно» — увеличьте только ту область, которую пользователь явно указал курсором.
  • «Справа‑налево» — если большая версия изображения не загружена заранее, сначала покажите быструю загрузку (progressive) и замените её на детализированную картинку по мере готовности.

Роль‑ориентированные чек‑листы

Разработчик:

  • Проверить корректность вычисления координат с учётом прокрутки.
  • Исправить опечатки в getComputedStyle (height vs width).
  • Поддержать ресайз контейнера при изменении вёрстки.

Дизайнер:

  • Выбрать форму и размер лупы; учесть контраст рамки.
  • Предусмотреть как лупа выглядит на мобильных.

QA:

  • Тестировать на разных масштабах окна и при разных dpi / zoom браузера.
  • Проверить работу клавиатурных команд и поведение при быстрой смене уровня зума.

PM / менеджер продукта:

  • Решить, нужен ли левый/правый клик для закрепления увеличения.
  • Утвердить требуемое разрешение исходных изображений.

Критерии приёмки

  • Лупа появляется при наведении и исчезает при уходе курсора из контейнера.
  • При изменении уровня зума (ArrowUp/ArrowDown) изображение в лупе обновляется немедленно.
  • Координаты увеличенной области корректно соответствуют позиции курсора, включая прокрутку страницы.
  • Для мобильных устройств предусмотрлен приемлемый UX (например, открытие модального зума при тапе).

Мини‑методология для внедрения в проект (шаги)

  1. Оцените потребность: какие страницы получат пользу от лупы.
  2. Подготовьте изображения: добавьте версии с достаточным разрешением.
  3. Реализуйте прототип на одной карточке товара.
  4. Протестируйте на desktop + mobile + доступность.
  5. Измерьте влияние на поведение (время на странице, конверсия) через A/B‑тест.

Факты и рекомендации (факт‑бокс)

  • Минимальный требуемый размер изображения для качественного 2× зума — исходное разрешение должно быть ≈ 2× размеров показываемой области.
  • Цена внедрения: низкая, если в проекте уже есть крупные версии картинок; иначе — придётся расширить систему хранения изображений.

Частые ошибки и как их избежать

  • Ошибка: чтение width вместо height (см. примечание в коде). Решение: тестировать оба измерения и объединить логику в функцию getSize(elem).
  • Ошибка: использование cursor: none без альтернативы — это ухудшает UX при отладке. Используйте это только при действительно необходимом дизайне.
  • Ошибка: масштабирование маленького изображения. Решение: подготавливать изображение с запасом по пикселям.

Что делать на мобильных

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

Примеры тестов и сценарии приёмки

  • Навести курсор в центр изображения — лупа показывает соответствующую область.
  • Уменьшить окно браузера — лупа корректно остаётся над курсором.
  • Нажать ArrowUp несколько раз — уровень зума увеличивается до maxZoomLevel и дальше не растёт.
  • Быстро перемещать курсор — лупа не «ломает» фон и не отстаёт от курсора.

FAQ

Нужно ли подгружать отдельное изображение для лупы?

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

Как сделать лупу доступной для клавиатуры?

Добавьте фокусируемую кнопку «Увеличить», которая открывает модальное окно с увеличенной картинкой; используйте aria‑атрибуты и управление фокусом.

Поддерживается ли этот подход для мобильных?

Поддерживается частично — плавающая лупа неудобна на сенсорных устройствах, лучше использовать другой UX (модальное окно или pinch‑to‑zoom).

Краткое резюме

  • Увеличитель изображений повышает доверие и удобство при изучении деталей продукта.
  • Реализация на чистом JS и CSS проста, но требует внимания к производительности и доступности.
  • Тестируйте на разных устройствах, предоставьте альтернативы для мобильных и пользователей экранных читалок.

Ключевые шаги внедрения: прототип → тесты → оптимизация изображений → релиз.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство