iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么利用vue组件实现图片的拖拽和缩放功能
  • 504
分享到

怎么利用vue组件实现图片的拖拽和缩放功能

2023-06-26 07:06:23 504人浏览 泡泡鱼
摘要

这篇文章将为大家详细讲解有关怎么利用Vue组件实现图片的拖拽和缩放功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。前言vue实现一个组件其实很简单但是要写出一个好的可复用的组件那就需要多学

这篇文章将为大家详细讲解有关怎么利用Vue组件实现图片的拖拽和缩放功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

前言

vue实现一个组件其实很简单但是要写出一个好的可复用的组件那就需要多学习和钻研一下,一个好的组件必须有其必不可少的有优点:一是能提高应用开发效率、测试性、复用性等;二是组件应该是高内聚、低耦合的;三是组件应遵循单向数据流的原则。

在实现我的图片的拖拽组件我们的搞清其原理,在这里我使用的是mousedown,mousemove和mouseup来实现拖拽。

如图所示:

怎么利用vue组件实现图片的拖拽和缩放功能

方法如下:

新建ElementDrag.vue文件内容如下:

<template>    <div class="drag-outer"     ref="dragWrap"    @mousemove="dragMousemove">        <div class="drag-inner"        ref="dragElement"         @mousedown="dragMousedown"        @mouseup.stop="isMousedown = false">            <slot></slot>        </div>    </div></template>

定义moveStart用于记录拖拽元素初始位置。定义isMousedown变量来判断鼠标是否按下, 如果isMousedown === true鼠标移动就改变darg-inner位置。

<script>export default {    name: 'ElementDrag',    data() {        return {            isMousedown: false, //鼠标是否按下            moveStart: {x: 0, y: 0}, //拖拽元素初始位置            translate: {x: 0, y: 0}, //计算拖拽元素在下下x,y方向各移动了多少            scale: 1, //拖拽元素缩放值        }    },    methods: {        dragMousedown() {            this.moveStart.x = event.clientX            this.moveStart.y = event.clientY            this.isMousedown = true         },        dragMousemove() {            if(this.isMousedown) {                this.translate.x += (event.clientX - this.moveStart.x) / this.scale                this.translate.y += (event.clientY - this.moveStart.y) / this.scale                this.$refs.dragElement.style.transfORM = `scale(${this.scale}) translate(${this.translate.x}px, ${this.translate.y}px)`                this.moveStart.x = event.clientX                this.moveStart.y = event.clientY            }        }    }}</script>

样式部分我们设置外层drag-outer用flex布局让里面元素快速居中, user-drag: none;禁用图片等元素的可拖拽属性。

<style lang="sCSS" scoped>.drag-outer {    width: 100%;    height: 100%;    overflow: hidden;    display: flex;    justify-content: center;    align-items: center;    .drag-inner {        transform-origin: center center;        display: flex;        justify-content: center;        align-items: center;        cursor: move;        user-select: none;        >* {            -WEBkit-user-drag: none;            user-drag: none;        }    }}</style>

添加鼠标滚轮事件缩放drag-inner元素, e.wheelDelta为正表示放大,为负缩小,值越大表示滚动越快。通过scale控制拖拽元素缩放。同过对组件传值scaleZoom来控制其缩放最大最小程度值。

...methods: {    props: {        type: Object,        default(){             return {                min: 0.5,                max: 5               }        }    },    ...    handleScroll(e) {        let speed = e.wheelDelta/120        if(e.wheelDelta > 0 && this.scale < this.scaleZoom.max) {            this.scale+=0.04*speed            this.$refs.dragElement.style.transform = `scale(${this.scale}) translate(${this.translate.x}px, ${this.translate.y}px)`        }else if(e.wheelDelta < 0 && this.scale > this.scaleZoom.min){            this.scale+=0.04*speed            this.$refs.dragElement.style.transform = `scale(${this.scale}) translate(${this.translate.x}px, ${this.translate.y}px)`        }    }},mounted() {    window.addEventListener('mousewheel',this.handleScroll,false) }

以上代码已经实现了功能我们预期的功能,但是为了更好的体验,需要进一步优化组件。添加isHover来控制鼠标是否移动到了drag-outer以外,如果isHover为false这时鼠标滚轮滚动不会缩放元素,并且将isMousedown设置为false。再使用插槽slot预览位置。

<template>    <div class="drag-outer"     ref="dragWrap"    @mouseenter="isHover = true"     @mouseleave="isHover = isMousedown = false"    @mousemove="dragMousemove">        <div class="drag-inner"        ref="dragElement"         @mousedown="dragMousedown"        @mouseup.stop="isMousedown = false">            <slot></slot>        </div>    </div></template>....data() {    return {        ...,        isHover: false,    }},methods: {    ...    handleScroll(e) {        if(this.isHover) {            let speed = e.wheelDelta/120            if(e.wheelDelta > 0 && this.scale < this.scaleZoom.max) {                this.scale+=0.04*speed                this.$refs.dragElement.style.transform = `scale(${this.scale}) translate(${this.translate.x}px, ${this.translate.y}px)`            }else if(e.wheelDelta < 0 && this.scale > this.scaleZoom.min){                this.scale+=0.04*speed                this.$refs.dragElement.style.transform = `scale(${this.scale}) translate(${this.translate.x}px, ${this.translate.y}px)`            }        }    }}

贴上组件的最终代码:

<template>    <div class="drag-outer"     ref="dragWrap"    :    @mouseenter="isHover = true"     @mouseleave="isHover = isMousedown = false"    @mousemove="dragMousemove">        <div class="drag-inner"        ref="dragElement"         :        @mousedown="dragMousedown"        @mouseup.stop="isMousedown = false">            <slot></slot>        </div>    </div></template><script>export default {    name: 'ElementDrag',    props: {        outerOptions: {            type: Object,            default () {                return {                    background: 'rgba(0,0,0,0.9)'                }            }        },        innerOptions: {            type: Object,            default () {                return {                    background: 'rgba(0,0,0,0.1)',                }            }        },        scaleZoom: {            type: Object,            default () {                return {                    max: 5,                     min: 0.2                }            }        }    },    data() {        return {            isMousedown: false,            isHover: false,            moveStart: {},            translate: {x: 0, y: 0},            scale: 1        }    },    methods: {        handleScroll(e) {            if(this.isHover) {                let speed = e.wheelDelta/120                if(e.wheelDelta > 0 && this.scale < this.scaleZoom.max) {                    this.scale+=0.04*speed                    this.$refs.dragElement.style.transform = `scale(${this.scale}) translate(${this.translate.x}px, ${this.translate.y}px)`                }else if(e.wheelDelta < 0 && this.scale > this.scaleZoom.min){                    this.scale+=0.04*speed                    this.$refs.dragElement.style.transform = `scale(${this.scale}) translate(${this.translate.x}px, ${this.translate.y}px)`                }            }        },        dragMousedown() {            this.moveStart.x = event.clientX            this.moveStart.y = event.clientY            this.isMousedown = true         },        dragMousemove() {            if(this.isMousedown) {                this.translate.x += (event.clientX - this.moveStart.x) / this.scale                this.translate.y += (event.clientY - this.moveStart.y) / this.scale                this.$refs.dragElement.style.transform = `scale(${this.scale}) translate(${this.translate.x}px, ${this.translate.y}px)`                this.moveStart.x = event.clientX                this.moveStart.y = event.clientY            }        }    },    mounted() {        window.addEventListener('mousewheel',this.handleScroll,false)     }}</script><style lang="scss" scoped>.drag-outer {    width: 100%;    height: 100%;    overflow: hidden;    display: flex;    justify-content: center;    align-items: center;    .drag-inner {        transform-origin: center center;        display: flex;        justify-content: center;        align-items: center;        cursor: move;        user-select: none;        >* {            -webkit-user-drag: none;            user-drag: none;        }    }}</style>

在home.vue文件使用:点击体验

<template>  <div class="home">    <ElementDrag>        <img src="https://img0.baidu.com/it/u=937276518,3474029246&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=750">    </ElementDrag>  </div></template><script>import ElementDrag from '@/components/ElementDrag'export default {  name: 'Home',  components: {    ElementDrag  }}</script><style scoped>.home {  width: 100vw;  height: 100vh;} </style>

为什么要使用Vue

Vue是一款友好的、多用途且高性能的javascript框架,使用vue可以创建可维护性和可测试性更强的代码库,Vue允许可以将一个网页分割成可复用的组件,每个组件都包含属于自己的html、CSS、JavaScript,以用来渲染网页中相应的地方,所以越来越多的前端开发者使用vue。

关于怎么利用vue组件实现图片的拖拽和缩放功能就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: 怎么利用vue组件实现图片的拖拽和缩放功能

本文链接: https://www.lsjlt.com/news/307366.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 利用vue组件实现图片的拖拽和缩放功能
    目录前言如图所示:方法如下:总结前言 vue实现一个组件其实很简单但是要写出一个好的可复用的组件那就需要多学习和钻研一下,一个好的组件必须有其必不可少的有优点:一是能提高应用开发效率...
    99+
    2022-11-13
  • 怎么利用vue组件实现图片的拖拽和缩放功能
    这篇文章将为大家详细讲解有关怎么利用vue组件实现图片的拖拽和缩放功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。前言vue实现一个组件其实很简单但是要写出一个好的可复用的组件那就需要多学...
    99+
    2023-06-26
  • 实现vue图片缩放方式-拖拽组件
    目录实现效果如下父组件如下子组件imgbox.vue如下实现效果如下 这几天做了个没做过的组件,以此记录下,需要的效果是在一个dom内,缩放拖拽图片。 封装的子组件imgbox.V...
    99+
    2022-11-13
  • vue怎么实现图片拖拽功能
    本篇内容介绍了“vue怎么实现图片拖拽功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!主要涉及到的元素知识,示意图:js代码部分:dire...
    99+
    2023-06-25
  • 怎么利用Vue实现拖拽穿梭框功能
    今天小编给大家分享一下怎么利用Vue实现拖拽穿梭框功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、使用原生js实现拖拽...
    99+
    2023-07-04
  • 小程序的拖拽、缩放和旋转手势功能怎么实现
    这篇文章主要介绍“小程序的拖拽、缩放和旋转手势功能怎么实现”,在日常操作中,相信很多人在小程序的拖拽、缩放和旋转手势功能怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”小程序的拖拽、缩放和旋转手势功能怎...
    99+
    2023-06-26
  • 怎么使用HTML5与CSS3实现无插件拖拽上传图片功能
    这篇文章主要介绍“怎么使用HTML5与CSS3实现无插件拖拽上传图片功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用HTML5与CSS3实现无插件拖拽上传图片功能”文章能帮助大家解决问题。...
    99+
    2023-07-04
  • 使用vue自定义如何实现Tree组件和拖拽功能
    目录vue自定义实现Tree组件和拖拽功能vue2 + js版vue2 + ts 版总结vue自定义实现Tree组件和拖拽功能 实现功能:树结构、右键菜单、拖拽 效果图 vue2 ...
    99+
    2022-12-09
    vue自定义Tree组件 vue Tree组件 vue拖拽功能
  • 怎么在HTML5中利用拖拽功能实现拼图游戏
    本篇文章为大家展示了怎么在HTML5中利用拖拽功能实现拼图游戏,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。<!--代码如下,最下面给出了我测试用的9张250*250的图片切片-->&l...
    99+
    2023-06-09
  • Vue图片监听鼠标滑轮滚动怎么实现图片缩小放大功能
    这篇文章主要讲解了“Vue图片监听鼠标滑轮滚动怎么实现图片缩小放大功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue图片监听鼠标滑轮滚动怎么实现图片缩小放大功能”吧!效果:实现思路在j...
    99+
    2023-07-05
  • 怎么用HTML5实现鼠标滚轮事件放大缩小图片的功能
    本篇内容介绍了“怎么用HTML5实现鼠标滚轮事件放大缩小图片的功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有...
    99+
    2022-10-19
  • Vue使用v-viewer插件实现图片预览和缩放和旋转等功能(推荐)
    目录前言科普:v-viewer安装依赖引入并使用依赖页面代码使用查看效果消除日志打印总结前言 昨天不是做了一个动态的图片展示吗,今天就寻思着能不能完善下功能,可以通过点击图片的方式进...
    99+
    2023-02-09
    Vue使用v-viewer插件实现图片预览 Vue图片缩放和旋转 Vue v-viewer插件使用
  • Android应用中怎么实现一个图片预览缩放功能
    Android应用中怎么实现一个图片预览缩放功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。具体实现方法如下<&#63;xml version="1....
    99+
    2023-05-31
    android roi
  • 怎么在Java中利用dropzone.js实现一个文件拖拽上传功能
    本篇文章为大家展示了怎么在Java中利用dropzone.js实现一个文件拖拽上传功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。jsp页面: 首先必须引入dropzone的js和css文件<...
    99+
    2023-05-31
    java dropzone.js ava
  • 怎么使用Vue实现移动端图片裁剪组件功能
    本篇内容主要讲解“怎么使用Vue实现移动端图片裁剪组件功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用Vue实现移动端图片裁剪组件功能”吧!  一、组件的初始化参数  1、图片img(...
    99+
    2023-07-04
  • 如何使用HTML5实现鼠标滚轮事件放大缩小图片的功能
    这篇文章主要介绍了如何使用HTML5实现鼠标滚轮事件放大缩小图片的功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 大部分浏览器都是支持...
    99+
    2022-10-19
  • 利用JavaScript怎么实现一个拖拽鼠标调整div大小的功能
    本篇文章为大家展示了利用JavaScript怎么实现一个拖拽鼠标调整div大小的功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向...
    99+
    2023-06-07
  • 利用vue怎么实现一个桌面向网页拖动文件的功能
    本文章向大家介绍利用vue怎么实现一个桌面向网页拖动文件的功能的基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。vue是什么软件Vue是一套用于构建用户界面的渐进式JavaScript框架,Vue与其它大型框架的区...
    99+
    2023-06-06
  • 利用java怎么实现一个将图片去色的功能
    本篇文章为大家展示了利用java怎么实现一个将图片去色的功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。现在我们要将这样的一张图片变成为代码package com.epoint.wdg.test;...
    99+
    2023-05-31
    java ava
  • vue中怎么利用复合组件实现注册表单功能
    本篇文章给大家分享的是有关vue中怎么利用复合组件实现注册表单功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。具体内容如下<!doct...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作