← Все статьи

Гайды

Правила увеличения изображений при наведении и быстрого скачивания

Изображения — вторая половина взятия медиа под контроль. Это руководство собирает три правила JustZix для работы с картинками: увеличение при наведении, нетерпеливая загрузка, чтобы ничего не оставалось пустым, и кнопка быстрого скачивания, уважающая правила одного источника.

Увеличение при наведении, только на CSS

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

img {
  transition: transform .18s ease;
}

img:hover {
  transform: scale(1.6);
  position: relative;
  z-index: 2147483647;
}

Масштабирование через transform сохраняет вёрстку стабильной, потому что изображение по-прежнему занимает свою исходную коробку. Высокий z-index при наведении означает, что увеличенное изображение плавает над соседним контентом, а не обрезается.

Точная лупа с JavaScript

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

(function () {
  document.addEventListener('pointermove', function (e) {
    var img = e.target;
    if (!img || img.tagName !== 'IMG') { return; }
    var r = img.getBoundingClientRect();
    var x = ((e.clientX - r.left) / r.width) * 100;
    var y = ((e.clientY - r.top) / r.height) * 100;
    img.style.transformOrigin = x + '% ' + y + '%';
  }, true);
  document.addEventListener('pointerenter', function (e) {
    if (e.target && e.target.tagName === 'IMG') {
      e.target.style.transform = 'scale(2.4)';
      e.target.style.transition = 'transform .12s';
    }
  }, true);
  document.addEventListener('pointerleave', function (e) {
    if (e.target && e.target.tagName === 'IMG') {
      e.target.style.transform = '';
    }
  }, true);
})();

Лупа увеличивает к тому месту, где находится курсор, так что панорамирование по большой картинке ощущается естественно. Сброс transform на pointerleave возвращает изображение к нормальному размеру.

Принудите каждое изображение загрузиться

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

document.querySelectorAll('img[loading="lazy"]').forEach(function (img) {
  img.loading = 'eager';
  if (img.dataset.src && !img.src) {
    img.src = img.dataset.src;
  }
  if (img.dataset.srcset && !img.srcset) {
    img.srcset = img.dataset.srcset;
  }
});

Многие сайты прячут настоящий URL в атрибуте data-src и копируют его в src, только когда изображение прокручивается в зону видимости. Копирование его самостоятельно принуждает загрузку немедленно. Та же идея работает для srcset.

Кнопка скачивания в один клик

Это правило добавляет небольшую кнопку скачивания в угол каждого изображения, когда вы наводите на него. Оно использует стандартный атрибут download на якоре, который просит браузер сохранить файл.

(function () {
  document.addEventListener('pointerenter', function (e) {
    var img = e.target;
    if (!img || img.tagName !== 'IMG' || img._dl) { return; }
    img._dl = true;
    var a = document.createElement('a');
    a.textContent = 'Сохранить';
    a.href = img.currentSrc || img.src;
    a.download = '';
    a.style.cssText = 'position:absolute;z-index:2147483647;'
      + 'background:#111;color:#fff;font:600 11px sans-serif;'
      + 'padding:3px 7px;border-radius:5px;text-decoration:none';
    var r = img.getBoundingClientRect();
    a.style.left = (r.left + window.scrollX + 4) + 'px';
    a.style.top = (r.top + window.scrollY + 4) + 'px';
    document.body.appendChild(a);
    img.addEventListener('pointerleave', function () {
      a.remove();
      img._dl = false;
    }, { once: true });
  }, true);
})();

Атрибут download работает чисто для изображений с того же источника. Для изображений с другого источника браузер может вместо сохранения открыть файл в новой вкладке, что является ожидаемым поведением, а не тем, что правилу стоит пытаться побороть. Использование currentSrc выбирает разрешение, которое браузер действительно выбрал из адаптивного srcset.

Собираем всё вместе

Все три доступны в наших готовых примерах или скачайте JustZix и постройте свои. Для видеостороны управления медиа начните с принудите нативное управление на каждом видео.

Оцени эту статью

Оценок пока нет — оцени первым.

Попробуй сам

Установи JustZix и вставь любой сниппет из этой статьи. Две минуты от нуля до работающего правила на всех твоих устройствах.

Получить JustZix

Возможности · Как это работает · Примеры · Применение