JS實(shí)現(xiàn)點(diǎn)擊圖片放大縮小及拖拽功能
前言
本文使用 vue創(chuàng)建一個可拖拽和縮放的圖片查看器組件,該組件不僅可以展示圖片,還支持用戶通過鼠標(biāo)拖動和縮放來查看細(xì)節(jié)。本文將介紹如何封裝一個簡單的圖片拖拽與縮放組件。
先看效果圖:

組件功能概述
本組件具備以下功能:
- 顯示圖片
- 支持鼠標(biāo)拖動以調(diào)整圖片位置
- 支持鼠標(biāo)滾輪縮放圖片
- 自動居中圖片
代碼實(shí)現(xiàn)
下面是組件的完整代碼,包括模板、js和樣式部分。
1. 模板部分
<template>
<div style="height: 90vh;">
<div
class="image-container"
@mousedown="startDrag"
@mouseup="stopDrag"
@mousemove="drag"
@wheel="handleWheel"
>
<img
:src="imgSrc"
:style="{ transform: `scale(${scale})`, cursor: isDragging ? 'grabbing' : 'grab' }"
ref="image"
/>
<!-- @click="toggleZoom" 點(diǎn)擊放大-->
</div>
</div>
</template>
在模板中,我們定義了一個包含圖片的容器。通過綁定鼠標(biāo)事件,我們可以實(shí)現(xiàn)拖拽和縮放的功能。
2. js部分
<script>
import testImg from './testImg.jpeg'; // 導(dǎo)入圖片
export default {
name: 'ImageView',
props: {
// 圖片路徑
imgSrc: {
type: String,
default: () => testImg, // 沒有傳值時使用默認(rèn)圖片
}
},
data () {
return {
scale: 1, // 初始縮放比例
isDragging: false, // 是否正在拖拽
lastMouseX: 0, // 上一次鼠標(biāo) X 坐標(biāo)
lastMouseY: 0, // 上一次鼠標(biāo) Y 坐標(biāo)
offsetX: 0, // 圖片相對容器的 X 偏移量
offsetY: 0, // 圖片相對容器的 Y 偏移量
imageWidth: 0, // 圖片實(shí)際寬度
imageHeight: 0, // 圖片實(shí)際高度
};
},
mounted () {
const img = this.$refs.image; // 獲取圖片元素
this.imageWidth = img.naturalWidth; // 獲取圖片的實(shí)際寬度
this.imageHeight = img.naturalHeight; // 獲取圖片的實(shí)際高度
this.centerImage(); // 初始化時居中圖片
},
methods: {
// 居中圖片的方法
centerImage () {
const container = this.$el.querySelector('.image-container'); // 獲取容器
const containerWidth = container.clientWidth; // 容器寬度
const containerHeight = container.clientHeight; // 容器高度
// 計(jì)算居中后的 X 和 Y 偏移量
const centeredX = (containerWidth - this.imageWidth * this.scale) / 2;
const centeredY = (containerHeight - this.imageHeight * this.scale) / 2;
this.offsetX = centeredX; // 更新 X 偏移量
this.offsetY = centeredY; // 更新 Y 偏移量
// 設(shè)置圖片的新位置
this.$refs.image.style.left = `${centeredX}px`;
this.$refs.image.style.top = `${centeredY}px`;
},
// 點(diǎn)擊圖片時切換縮放
toggleZoom () {
this.scale = this.scale === 1 ? 2 : 1; // 點(diǎn)擊圖片時切換縮放比例
},
// 鼠標(biāo)按下事件
startDrag (event) {
this.isDragging = true; // 標(biāo)記為正在拖拽
this.lastMouseX = event.clientX; // 記錄當(dāng)前鼠標(biāo) X 坐標(biāo)
this.lastMouseY = event.clientY; // 記錄當(dāng)前鼠標(biāo) Y 坐標(biāo)
this.offsetX = this.$refs.image.offsetLeft; // 記錄當(dāng)前左偏移
this.offsetY = this.$refs.image.offsetTop; // 記錄當(dāng)前上偏移
},
// 鼠標(biāo)抬起事件
stopDrag () {
this.isDragging = false; // 停止拖拽
},
// 鼠標(biāo)移動事件
drag (event) {
if (this.isDragging) { // 如果正在拖拽
const dx = event.clientX - this.lastMouseX; // 計(jì)算 X 軸移動距離
const dy = event.clientY - this.lastMouseY; // 計(jì)算 Y 軸移動距離
const newLeft = this.offsetX + dx; // 計(jì)算新的左偏移
const newTop = this.offsetY + dy; // 計(jì)算新的上偏移
// 更新圖片的位置
this.$refs.image.style.left = `${newLeft}px`; // 設(shè)置新的左偏移
this.$refs.image.style.top = `${newTop}px`; // 設(shè)置新的上偏移
}
},
// 鼠標(biāo)滾輪事件處理縮放
handleWheel (event) {
event.preventDefault(); // 阻止默認(rèn)的滾動行為
const scaleChange = event.deltaY > 0 ? 0.1 : -0.1; // 根據(jù)滾動方向調(diào)整縮放
this.scale = Math.max(0.2, this.scale + scaleChange); // 限制最小縮放比例為 0.2
},
},
};
</script>
在js部分,我們使用 Vue 的數(shù)據(jù)和方法來實(shí)現(xiàn)組件的核心功能。通過事件處理函數(shù),我們管理圖片的縮放和拖拽邏輯。
3. 樣式部分
<style scoped>
.image-container {
position: relative; /* 使容器相對定位 */
overflow: hidden; /* 防止內(nèi)容超出邊界 */
cursor: grab; /* 默認(rèn)光標(biāo)樣式 */
width: 100%; /* 容器寬度 */
height: 100%; /* 容器高度 */
}
img {
position: absolute; /* 使得 img 可以被拖拽 */
transition: transform 0.3s; /* 平滑的縮放效果 */
}
</style>
樣式部分確保了圖片容器的正確顯示,以及在縮放時的平滑過渡效果。
總結(jié)
通過以上代碼,我們實(shí)現(xiàn)了一個簡單的圖片拖拽與縮放組件。用戶可以方便地查看圖片細(xì)節(jié),提高了交互體。也可以根據(jù)項(xiàng)目需求進(jìn)一步擴(kuò)展和優(yōu)化這個組件,比如增加雙擊放大功能、支持多種圖片格式等,目前這樣的已經(jīng)滿足需求,需要使用及擴(kuò)展的自行優(yōu)化,記得@我去抄作業(yè)
到此這篇關(guān)于JS實(shí)現(xiàn)點(diǎn)擊圖片放大縮小及拖拽功能的文章就介紹到這了,更多相關(guān)JS點(diǎn)擊圖片放大縮小及拖拽內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
微信小程序?qū)崿F(xiàn)圖片上傳功能實(shí)例(前端+PHP后端)
這篇文章主要給大家介紹了關(guān)于微信小程序?qū)崿F(xiàn)圖片上傳功能的相關(guān)內(nèi)容,文中詳細(xì)介紹了前端+PHP后端的示例代碼,對大家的理解和學(xué)習(xí)具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01
js實(shí)現(xiàn)根據(jù)身份證號自動生成出生日期
這篇文章主要介紹了js實(shí)現(xiàn)根據(jù)身份證號自動生成出生日期,需要的朋友可以參考下2015-12-12
JS使用window.requestAnimationFrame()對列表切片進(jìn)行渲染
這篇文章主要為大家介紹了JS使用requestAnimationFrame對列表切片進(jìn)行渲染,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
js代碼延遲一定時間后執(zhí)行一個函數(shù)的實(shí)例
下面小編就為大家?guī)硪黄猨s代碼延遲一定時間后執(zhí)行一個函數(shù)的實(shí)例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02
js關(guān)閉當(dāng)前頁面(窗口)的幾種方式總結(jié)
js關(guān)閉當(dāng)前頁面(窗口)的幾種方式總結(jié),需要的朋友可以參考一下2013-03-03
element-ui 圖片壓縮上傳功能實(shí)現(xiàn)
這篇文章主要介紹了element-ui 圖片壓縮上傳功能實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2023-10-10

