Rumah  >  Artikel  >  hujung hadapan web  >  Bagaimana untuk menggunakan JavaScript untuk meluncurkan imej ke atas dan ke bawah dan menambah kesan zum sambil mengehadkannya kepada bekas?

Bagaimana untuk menggunakan JavaScript untuk meluncurkan imej ke atas dan ke bawah dan menambah kesan zum sambil mengehadkannya kepada bekas?

WBOY
WBOYasal
2023-10-16 09:40:561457semak imbas

JavaScript 如何实现图片的上下滑动并加入缩放效果同时限制在容器内?

JavaScript Bagaimana untuk meluncurkan imej ke atas dan ke bawah dan menambah kesan zum sambil mengehadkannya kepada bekas?

Dalam reka bentuk web moden, selalunya perlu melakukan operasi interaktif dan peningkatan kesan pada imej. Antaranya, kesan gelongsor dan zum naik dan turun gambar adalah keperluan biasa. Artikel ini akan memperkenalkan cara menggunakan JavaScript untuk mencapai kesan ini dan mengehadkannya dalam bekas.

1. Pelaksanaan kesan gelongsor atas dan bawah

Menyedari kesan gelongsor atas dan bawah gambar bergantung terutamanya pada peristiwa tetikus atau sentuhan, dan memerlukan kawalan kedudukan gambar.

Pertama, dalam bahagian HTML, kami mencipta bekas dan elemen imej:

<div id="container">
  <img id="image" src="img.jpg">
</div>

Kemudian, dalam JavaScript, kita perlu menambah pendengar acara kepada elemen imej dan menggerakkan imej berdasarkan perubahan kedudukan tetikus atau Kedudukan acara sentuh:

var container = document.getElementById('container');
var image = document.getElementById('image');

var startY; // 记录初始位置

image.onmousedown = start;
image.addEventListener('touchstart', start, false);

function start(e) {
  e.preventDefault();
  
  if (e.touches) {
    startY = e.touches[0].clientY;
    document.addEventListener('touchmove', move, false);
    document.addEventListener('touchend', end, false);
  } else {
    startY = e.clientY;
    document.onmousemove = move;
    document.onmouseup = end;
  }
}

function move(e) {
  var currentY = e.touches ? e.touches[0].clientY : e.clientY;
  var diffY = currentY - startY;
  
  image.style.top = image.offsetTop + diffY + 'px';
}

function end() {
  document.removeEventListener('touchmove', move, false);
  document.removeEventListener('touchend', end, false);
  document.onmousemove = null;
  document.onmouseup = null;
}

Melalui kod di atas, apabila pengguna menekan tetikus atau menyentuh skrin, kedudukan awal akan dirakam, dan apabila tetikus atau jari bergerak, kedudukan gambar juga akan berubah. Pada penghujung operasi, alih keluar pendengar acara.

2. Pelaksanaan kesan zum

Realisasi kesan zum gambar adalah berdasarkan pertimbangan kedudukan dan gerak isyarat tetikus atau peristiwa sentuhan. Berikut ialah contoh menggunakan gerak isyarat untuk menentukan zum:

var scalingFactor = 1.0; // 初始化缩放比例
var gestureStartDistance; // 记录初始手势距离

image.addEventListener('gesturestart', start, false);
image.addEventListener('gesturechange', change, false);
image.addEventListener('gestureend', end, false);

function start(e) {
  e.preventDefault();
  gestureStartDistance = getGestureDistance(e);
}

function change(e) {
  var currentDistance = getGestureDistance(e);
  scalingFactor = currentDistance / gestureStartDistance;
  
  image.style.transform = 'scale(' + scalingFactor + ')';
}

function end() {
  gestureStartDistance = null;
}

function getGestureDistance(e) {
  var x1 = e.touches[0].pageX;
  var y1 = e.touches[0].pageY;
  var x2 = e.touches[1].pageX;
  var y2 = e.touches[1].pageY;
  
  return Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
}

Dalam kod di atas, apabila jari mula menyentuh skrin, jarak gerak isyarat awal direkodkan. Apabila jari bergerak, nisbah zum ditetapkan dengan mengira nisbah jarak gerak isyarat semasa kepada jarak gerak isyarat awal dan digunakan pada imej.

3. Terhad kepada bekas

Untuk memastikan imej meluncur dan bersisik di dalam bekas tanpa melimpahi bekas, kita perlu membuat beberapa pertimbangan kedudukan dan saiz.

Pertama, dalam bahagian CSS, tetapkan lebar dan tinggi bekas, dan tambah gaya pada bekas overflow: hidden; untuk menyembunyikan kandungan limpahan:

#container {
  width: 500px;
  height: 500px;
  overflow: hidden;
}

Kemudian, dalam JavaScript, kita perlu menentukan kedudukan dan kedudukan imej semasa gelongsor dan zum. Sama ada saiz melebihi sempadan bekas dan laraskannya:

function move(e) {
  var currentY = e.touches ? e.touches[0].clientY : e.clientY;
  var diffY = currentY - startY;
  
  var minTop = container.clientHeight - image.height; // 图片最小可到达的top值
  var maxTop = 0; // 图片最大可到达的top值
  
  var newTop = image.offsetTop + diffY;
  newTop = Math.max(minTop, Math.min(maxTop, newTop));
  
  image.style.top = newTop + 'px';
}

function change(e) {
  var currentDistance = getGestureDistance(e);
  scalingFactor = currentDistance / gestureStartDistance;
  
  var newWidth = image.width * scalingFactor;
  var newHeight = image.height * scalingFactor;
  
  var minWidth = container.clientWidth;
  var minHeight = container.clientHeight;
  
  var maxWidth = image.width;
  var maxHeight = image.height;
  
  newWidth = Math.max(minWidth, Math.min(maxWidth, newWidth));
  newHeight = Math.max(minHeight, Math.min(maxHeight, newHeight));
  
  image.style.width = newWidth + 'px';
  image.style.height = newHeight + 'px';
}

Melalui kod di atas, kami akan mengira nilai dan saiz atas minimum dan maksimum berdasarkan saiz bekas dan saiz imej , dan semasa proses gelongsor dan penskalaan, Hakim dan laraskan.

Ringkasnya, gelongsor ke atas dan ke bawah imej dan penambahan kesan zum direalisasikan melalui JavaScript, dan ia terhad kepada bekas. Kesan gelongsor dicapai melalui pemantauan peristiwa tetikus atau sentuhan dan pengiraan kedudukan. Melalui pemantauan peristiwa gerak isyarat dan pengiraan jarak, kesan zum dicapai. Dengan menilai kedudukan dan saiz, kesan terhad kepada bekas dicapai.

Atas ialah kandungan terperinci Bagaimana untuk menggunakan JavaScript untuk meluncurkan imej ke atas dan ke bawah dan menambah kesan zum sambil mengehadkannya kepada bekas?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn