JS實(shí)現(xiàn)點(diǎn)擊圖片放大縮小及拖拽功能
前言
本文使用 vue創(chuàng)建一個(gè)可拖拽和縮放的圖片查看器組件,該組件不僅可以展示圖片,還支持用戶通過鼠標(biāo)拖動(dòng)和縮放來查看細(xì)節(jié)。本文將介紹如何封裝一個(gè)簡單的圖片拖拽與縮放組件。
先看效果圖:
組件功能概述
本組件具備以下功能:
- 顯示圖片
- 支持鼠標(biāo)拖動(dòng)以調(diào)整圖片位置
- 支持鼠標(biāo)滾輪縮放圖片
- 自動(dòng)居中圖片
代碼實(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>
在模板中,我們定義了一個(gè)包含圖片的容器。通過綁定鼠標(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, // 沒有傳值時(shí)使用默認(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(); // 初始化時(shí)居中圖片 }, 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)擊圖片時(shí)切換縮放 toggleZoom () { this.scale = this.scale === 1 ? 2 : 1; // 點(diǎn)擊圖片時(shí)切換縮放比例 }, // 鼠標(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)移動(dòng)事件 drag (event) { if (this.isDragging) { // 如果正在拖拽 const dx = event.clientX - this.lastMouseX; // 計(jì)算 X 軸移動(dòng)距離 const dy = event.clientY - this.lastMouseY; // 計(jì)算 Y 軸移動(dòng)距離 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)的滾動(dòng)行為 const scaleChange = event.deltaY > 0 ? 0.1 : -0.1; // 根據(jù)滾動(dòng)方向調(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>
樣式部分確保了圖片容器的正確顯示,以及在縮放時(shí)的平滑過渡效果。
總結(jié)
通過以上代碼,我們實(shí)現(xiàn)了一個(gè)簡單的圖片拖拽與縮放組件。用戶可以方便地查看圖片細(xì)節(jié),提高了交互體。也可以根據(jù)項(xiàng)目需求進(jìn)一步擴(kuò)展和優(yōu)化這個(gè)組件,比如增加雙擊放大功能、支持多種圖片格式等,目前這樣的已經(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í)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01js實(shí)現(xiàn)根據(jù)身份證號(hào)自動(dòng)生成出生日期
這篇文章主要介紹了js實(shí)現(xiàn)根據(jù)身份證號(hào)自動(dòng)生成出生日期,需要的朋友可以參考下2015-12-12JS使用window.requestAnimationFrame()對列表切片進(jìn)行渲染
這篇文章主要為大家介紹了JS使用requestAnimationFrame對列表切片進(jìn)行渲染,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05js代碼延遲一定時(shí)間后執(zhí)行一個(gè)函數(shù)的實(shí)例
下面小編就為大家?guī)硪黄猨s代碼延遲一定時(shí)間后執(zhí)行一個(gè)函數(shù)的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02js關(guān)閉當(dāng)前頁面(窗口)的幾種方式總結(jié)
js關(guān)閉當(dāng)前頁面(窗口)的幾種方式總結(jié),需要的朋友可以參考一下2013-03-03element-ui 圖片壓縮上傳功能實(shí)現(xiàn)
這篇文章主要介紹了element-ui 圖片壓縮上傳功能實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-10-10