# :-: vue自由拖拽、缩放组件
github地址:[https://github.com/kirillmurashov/vue-drag-resize](https://links.jianshu.com/go?to=https%3A%2F%2Fgithub.com%2Fkirillmurashov%2Fvue-drag-resize)
演示:http://kirillmurashov.com/vue-drag-resize/
安装:
```
npm i -s vue-drag-resize
```
使用:
```
<template>
<div>
<VueDragResize :isActive="true" :isResizable="false" >
<img src="@/assets/logo/logo_lv.png" v-drag height="100px" width="100px" />
</VueDragResize>
</div>
</template>
<style>
.vdr.active:before{
outline: none
}
</style>
<script>
import VueDragResize from 'vue-drag-resize'
export default {
name: 'vue-drag-resize 全解,vue拖拽缩放组件',
components: {
VueDragResize
},
data () {
return {}
},
methods: {},
mounted () {
}
}
</script>
```
属性:
isActive 是否激活状态
Type: Boolean || Required: false || Default: false
处于激活状态的组件才能进行拖拽与缩放等操作,状态呈现激活状态
isDraggable 是否允许拖拽
Type: Boolean || Required: false || Default: true
isResizable 是否允许缩放
Type: Boolean || Required: false || Default: true
aspectRatio 是否等比例缩放
Type: Boolean || Required: false || Default: false
设置为true,则会按照元素的元比例缩放。坑:定义了这个属性,发现重新设置宽高的时候出现了异常(新值比例不同于旧值),需要在重设宽高的时候把aspectRatio设置为false,再将其设置回去,才能保证新值的等比例
w 组件宽度
Type: Number || Required: false || Default: 200
h 组件高度
Type: Number || Required: false || Default: 200
minw 最小宽度
Type: Number || Required: false || Default: 50
注意,不能设置为0,因为这个组件里面属性要求大于0
minh 最小高度
Type: Number || Required: false || Default: 50
注意,不能设置为0,因为这个组件里面属性要求大于0
x 定位left
Type: Number || Required: false || Default: 0
y 定位top
Type: Number || Required: false || Default: 0
z 层级
Type: Number || Required: false || Default: auto
注意在元素激活的时候,z会被设置为最高的,所以在管理z的时候要注意
sticks 元素缩放的节点定义
Type: Array || Required: false || Default: ['tl', 'tm', 'tr', 'mr', 'br', 'bm', 'bl', 'ml']
tl - Top left
tm - Top middle
tr - Top right
mr - Middle right
br - Bottom right
bm - Bottom middle
bl - Bottom left
ml - Middle left
preventActiveBehavior 单击组件外区域来禁止组件行为
Type: Boolean || Required: false || Default: false
设置这个属性true,就可以解决在其他区域操作返回到组件区域的时候,不需要再次点击就激活组件
parentLimitation 是否超出父级元素
Type: Boolean || Required: false || Default: false
设置为true,则限制操作组件不能超出父级元素
parentW 父级宽度
Type: Number || Required: false || Default: 0
该值限制了元素可以拖动的水平最大宽度,前提是parentLimitation=true
parentH 父级高度
Type: Number || Required: false || Default: 0
该值限制了元素可以拖动的水平最大高度,前提是parentLimitation=true
parentScaleX
Type: Number || Required: false || Default: 1
parentScaleY
Type: Number || Required: false || Default: 1
axis 允许拖拽的方向,
Type: String || Required: false || Default: both
取值可以为x、 y、 both、none
dragHandle 定义拖拽时的classname
Type: String || Required: false
dragCancel 定义取消拖拽时的classname
Type: String || Required: false
事件
clicked 组件点击事件
Required: false || Parameters: 组件实例
activated 点击组件外事件
Required: false || Parameters: 无
resizing 缩放时事件
Required: false || Parameters: object
{
left: Number, //the X position of the component
top: Number, //the Y position of the component
width: Number, //the width of the component
height: Number //the height of the component
}
resizestop 缩放结束
Required: false || Parameters: object
object 同resizing的object
dragging 拖拽时事件
Required: false || Parameters: object
object 同resizing的object
dragstop 拖拽结束事件
Required: false || Parameters: object
object 同resizing的object
issues
在拖拽元素里面添加input等类似的表单性元素,无法正常点击操作,特别是focus无法做到,click也是经常失效[摊手]
vue-drag-resize 的设计问题,在元素内部只能触发本元素,如果是有表单元素,只能被动的触发;解决:
<vue-drag-resize @activated="activateEv(index)" />
activateEv(index) {
console.log('activateEv' + index);
this.$refs['drag-input'].focus();
}
怎么修改使点击组件外面后,不需要点击组件才能进行?
:preventActiveBehavior="true" 设置这个属性,禁用点击组件外事件
更新计划
设置了组件的minh与minw,使用过程后台一直报警告
minh跟minw注意临界值。默认是50,查看源码发现必须要大于0 ,不能为0,这就是大部分开发人员后台报警告的原因。当然,如果想要设置为0,可以重新定义属性校验规则
多个拖拽元素,之前如何做到互斥?看github上的例子是互斥的,实际用起来发现经常性的无法互斥[摊手]
最佳的解决方案是使用数据去管理这些互斥的元素,可以在父级设置数据管理,或者引入vuex进行数据管理。关键点在点击,拖拽,失焦的时候,做到对数据的精确管理
如何管理多个拖拽元素之间的zIndex?
这是必定会遇到并且无法逃避的一个问题,操作上需要保持当前激活的组件是最上层,但是在总体上,又要确保其图层管理的初始。维护zIndex,并且注意在删除与置换层级的时候对应的数据修改。如果被激活,就设定为一个最大的值,失去激活状态,要恢复到初始值。
这个组件使用简单,清楚明了,我自己在用的时候,就是上手很快,但是要如何良好的应用它,以及处理一些异常的情况下,还是有很多的坑。基于这个组件,我实现了一个编辑器的平台,后续会更新这个组件更实用的一些应用实例,以及如何与vuex结合,实现一个基础的h5编辑器平台。再结合一些设置与多媒体的处理,即可以实现诸如易企秀、Maka等这种h5定制化平台。一步一步总可以实现的
- HTML
- 讯飞插件
- Python
- 王者荣耀
- demo_cg.py
- demo_cg_TT.py
- img.py
- MySQL
- 清空表数据
- ID自增长重置
- 用户密码及权限操作
- 外键在数据库中的作用
- MySQL增删改查语句
- DDL-数据库操作
- DDL-表操作-查询
- DDL-表操作-创建
- DDL-表操作-数据类型
- DDL-表操作-修改
- DDL-表操作-删除
- DML-语句
- DML-添加数据
- DML-修改数据
- DML-删除数据
- DQL-语法
- DQL-基本查询
- DQL-条件查询
- DQL-聚合函数
- DQL-分组查询
- DQL-排序查询
- DQL-分页查询
- DCL-介绍
- DCL-管理用户
- DCL-权限控制
- 函数
- JS
- ajax
- ajax get请求
- ajax post提交
- ajax 同时上传文本和文件到数据库(inpt text和input file)
- 路径传值+接收解析
- js 本地sessionStorage
- js Excel导出.xls
- 二维码生成插件
- VUE-CLI4
- 安装手脚架及插件
- ECharts-数据可视化
- element-ui-时间戳
- qrcode二维码生成插件
- vuedraggable-拖拽组件
- vue-drag-resize-自由拖拽、缩放组件
- gitee配置
- src
- plugins
- element.js
- echartsMixin.js
- views
- login
- login.vue
- btn.vue
- home
- home.vue
- Welcome.vue
- user
- users.vue
- router
- main.js
- App.vue
- 引入语法
- 获取路径传值
- ajax请求
- token语法
- NPM更换镜像方案
- PHP
- PHP 微信网页登录
- PHP 判断函数
- PHP 获取微信公众号openid
- PHP 实现发送模板消息(微信公众号版)
- PHP 阳历阴历转换计算生肖闰年
- PHP 接口数组形式
- PHP 同文件夹下顺序命名
- PHP 输出文件
- PHP E-mail发送
- PHP cURL资源
- PHP 远程访问控制服务器
- PHP 8.0 开启mysqli扩展
- PHP 使用 OSS 批量上传图片
- PHP md5 加密与解密
- ThinkPHP
- PT6
- TP6安装多应用
- TP5
- view渲染模板常见语法
- Visual Studio Code
- 介绍
- 插件-eslint
- vs code插件
- VSCode添加自定义模板
- SFTP
- md格式的文档
- mermaid
- frp内网穿透
- 自定义端口
- ui-china.cn
- 常用软件
- 框架
- 服务器
- 微信小程序
- 云函数 Email
- 参数传递
- 其他
- VMware虚拟机centos7设置静态ip 连接外网