一、实现效果

封装了三个methods方法,传入对应节点即可实现对应元素节点的拉伸收缩。

二、代码

1. 函数封装

/***
* 让指定的dom元素支持沿x轴的拉伸收缩
* oBox为指定的dom节点
* e为鼠标按键默认传入的对象
*/moveX(oBox, e) {let x = e.clientX;let oBoxW = oBox.offsetWidth;document.onmousemove = e => (oBox.style.width = oBoxW + e.clientX - x + 'px')document.onmouseup = () => [document.onmousemove, document.onmouseup] = [null, null]e.preventDefault && e.preventDefault()},
moveY(oBox, e) {if (e.path.some(v => v.getAttribute && v.getAttribute('class') && v.getAttribute('class').includes('lineBlock'))|| e.path.some(v => v.getAttribute && v.getAttribute('class') && v.getAttribute('class').includes('blockItem'))) {return}let y = e.clientY;let oBoxH = oBox.offsetHeight;document.onmousemove = e => oBox.style.height = oBoxH + e.clientY - y + 'px'document.onmouseup = () => [document.onmousemove, document.onmouseup] = [null, null]e.preventDefault && e.preventDefault()},
moveXY(oBox, e) {let x = e.clientX;let y = e.clientY;let oBoxH = oBox.offsetHeight;let oBoxW = oBox.offsetWidth;document.onmousemove = e => {let xx = e.clientXlet yy = e.clientYoBox.style.width = oBoxW + xx - x + 'px'oBox.style.height = oBoxH + yy - y + 'px'return false;}document.onmouseup = () => [document.onmousemove, document.onmouseup] = [null, null]e.preventDefault && e.preventDefault()},

2. 函数调用

定义了一个包含所有要添加横向拉伸事件的数组,遍历这个数组将这些节点的onmousedown事件设定为moveX函数。

let dragX = [];
dragX.push(...document.getElementsByClassName('blockItem'), ...document.getElementsByClassName('lineBlock'));dragX.map(v => (v.onmousedown事件设定为 = this.moveX.bind({}, v)));

3.dom节点

设定一个blockItemlineBlock的div就尝试拖拽了。

三、坑点介绍

1. 将需要拖拽的元素传入而不是使用e.target获取

一开始觉得一个参数就能搞定,但实际开发中发现e.target指向的不一定是这个元素本身,也有可能是它的某个子元素,这样就变成了对其子元素的拉伸实现。

2.父级元素支持拉伸导致给子元素添加的拉伸功能失效

在给父元素添加拉伸事件时判断是否当前鼠标按下对应元素是需要支持支持拉伸事件的子元素。(示例代码如下)

if (e.path.some(v => v.getAttribute && v.getAttribute('class') && v.getAttribute('class').includes('lineBlock'))
|| e.path.some(v => v.getAttribute && v.getAttribute('class') && v.getAttribute('class').includes('blockItem'))) {return
}

聪明的小伙伴应该发现了,以上代码虽然是在vue项目中实现的,但实际用到的语法主要还是原生js。也就是说,要想在原生js中实现呢元素拉伸功能根据以上思路也是非常方便。

END

vue实现dom元素拉伸相关推荐

  1. Vue获取DOM元素并修改属性

    Vue获取DOM元素 Vue获取DOM元素有两种方法 直接给相应的元素加id,然后再使用document.getElementById("id");获取 使用ref,给相应的元素加 ...

  2. Vue 获取DOM元素 ,给DOM增加事件的特殊情况

    Vue 获取DOM元素 ,给DOM增加事件的特殊情况 给标签绑定ref属性 使用this.$refs.xxx 获取原生的jsDOM对象 ref属性值不能重名 Vue.component('subCom ...

  3. 八.vue获取dom元素

    vue获取dom元素 方法一:直接给相应的元素加id,然后再document.getElementById("id");获取,然后设置相应属性或样式 方法二:使用ref,给相应的元 ...

  4. Vue笔记四:Vue获取DOM元素和组件元素的方法

    文章目录 Vue获取组件元素 ref获取组件元素 Vue获取组件元素 如果想使用哪个DOM元素,就给它加上ref属性,然后用$refs属性获取它的元素对象,示例如下: 全部代码: <!DOCTY ...

  5. vue获取dom元素注意问题

    mounted(){setTimeout(()=>{this.contentToggle();},1000)},methods:{contentToggle(){console.log(this ...

  6. vue获取DOM元素并设置属性

    这里我想到了2个方法: 方法一: 直接给相应的元素加id,然后再document.getElementById("id");获取,然后设置相应属性或样式 方法二: 使用ref,给相 ...

  7. Vue获取DOM元素的属性值

    项目中需要做一个小弹层,如下图: 我需要知道点击元素距离顶部的值,再计算弹层的top值,如下图: 在vue中如何获取到DOM元素距离窗口顶部的值呢? 1.通过$event获取 html: <di ...

  8. vue中dom元素和组件的获取

    Vue中获取DOM元素 <div id="app"><input type="button" value="获取元素" @ ...

  9. vue操作dom元素的三种方法介绍和分析

    相信大家在做项目的时候,肯定会遇到这样的问题:我点击新增按钮,需要弹出个弹框,然后我点击对应的关闭按钮,关闭弹框,但是新增按钮和关闭按钮操作的是另一个元素,所以需要获取dom元素进行操控,那么在vue ...

最新文章

  1. Glide二次封装库的使用
  2. 每日一问:你了解 Java 虚拟机结构么?
  3. 在Linux平台上部署open***
  4. 53.垃圾回收算法的实现原理、启动Java垃圾回收、Java垃圾回收过程、垃圾回收中实例的终结、对象什么时候符合垃圾回收的条件、GC Scope 示例程序、GC OutOfMemoryError的示例
  5. My97DatePicker在asp.net项目中的使用
  6. shapenet网络_GRNet网络:3D网格进行点云卷积,实现点云补全
  7. 混淆矩阵(TP+FN+FP+TN)
  8. 电子设计教程22:虚短与虚断
  9. 截止失真放大电路_每周经典电路分析:一个经典实际运放的内部电路分析(1)
  10. CAD中的dxf文件解析(一):准备工作
  11. 8.3 初步理解 Texture Alpha
  12. 织梦图集php,采集功能的使用方法 --- 图片集(一)
  13. 祖国(或以梦为马) 海子
  14. electron-vue 仿网易云客户端(待完成)
  15. 泛微OA 开发环境搭建 IDEA
  16. Linux-生产中常用命令
  17. 【Debug】OpenCV_Python:imshow() error “TypeError: Required argument 'mat' (pos 2) not found”
  18. 2019,AI芯片五大战事!
  19. 布尔代数(基本概念,运算规则,符号/数字代表的含义)
  20. Win64下汇编写对话框

热门文章

  1. 【强化学习】(一)RL基本概念
  2. mysql开启mrr_mysql 之 MRR
  3. Innodb MRR优化
  4. 米哈游贺甲:如何实现次世代卡通渲染效果?
  5. 【笔记】删除用户目录下的字体文件
  6. 关于计划复习计算机作文500字,期末考试复习计划作文500字(精选5篇)
  7. 分布式链路追踪—traceId生成与使用(MDC)
  8. NEH启发式算法+Tabu搜索算法
  9. EasyRecovery15易恢复适用于Win和Mac的电脑数据恢复软件
  10. udp处理不及_5个电子游戏续集,我们等不及了