vue左右拖拽,内置iframe拖拽卡顿问题
Posted `l l l s j 。
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue左右拖拽,内置iframe拖拽卡顿问题相关的知识,希望对你有一定的参考价值。
如图:实现左侧是 iframe的 pdf预览器,右侧是输入文字,问问题。中间可以调节2侧宽度
<div class="box" ref="box">
<div class="left">
<!--左侧div内容-->
</div>
<div class="resize" title="收缩侧边栏" @mousedown="changeIframeDivStyle('')" @onmouseup="changeIframeDivStyle('none')" >
⋮
</div>
<div class="mid">
<!--在此处添加遮罩层-->
<div class="iframeDiv"></div>
<!--右侧div内容-->
<iframe></iframe>
</div>
</div>
/* 这块是重点 */
.iframeDiv
width: 100%;
height: 100%;
position: absolute;
z-index: 1111;
filter: alpha(opacity=0);
opacity: 0;
background: transparent;
margin-top: 30px;
/*display: none;*/
/* 拖拽相关样式 */
/*包围div样式*/
.box
width: 100%;
height: 100%;
margin: 1% 0px;
overflow: hidden;
box-shadow: -1px 9px 10px 3px rgba(0, 0, 0, 0.11);
/*左侧div样式*/
.left
width: calc(32% - 10px); /*左侧初始化宽度*/
height: 100%;
background: #FFFFFF;
float: left;
/*拖拽区div样式*/
.resize
cursor: col-resize;
float: left;
position: relative;
top: 45%;
background-color: #d6d6d6;
border-radius: 5px;
margin-top: -10px;
width: 10px;
height: 50px;
background-size: cover;
background-position: center;
/*z-index: 99999;*/
font-size: 32px;
color: white;
/*拖拽区鼠标悬停样式*/
.resize:hover
color: #444444;
/*右侧div'样式*/
.mid
float: left;
width: 68%; /*右侧初始化宽度*/
height: 100%;
background: #fff;
box-shadow: -1px 4px 5px 3px rgba(0, 0, 0, 0.11);
dragControllerDiv: function ()
var resize = document.getElementsByClassName('resize');
var left = document.getElementsByClassName('left');
var mid = document.getElementsByClassName('mid');
var box = document.getElementsByClassName('box');
for (let i = 0; i < resize.length; i++)
// 鼠标按下事件
resize[i].onmousedown = function (e)
//颜色改变提醒
resize[i].style.background = '#818181';
var startX = e.clientX;
resize[i].left = resize[i].offsetLeft;
// 鼠标拖动事件
document.onmousemove = function (e)
var endX = e.clientX;
var moveLen = resize[i].left + (endX - startX); // (endx-startx)=移动的距离。resize[i].left+移动的距离=左边区域最后的宽度
var maxT = box[i].clientWidth - resize[i].offsetWidth; // 容器宽度 - 左边区域的宽度 = 右边区域的宽度
if (moveLen < 32) moveLen = 32; // 左边区域的最小宽度为32px
if (moveLen > maxT - 150) moveLen = maxT - 150; //右边区域最小宽度为150px
resize[i].style.left = moveLen; // 设置左侧区域的宽度
for (let j = 0; j < left.length; j++)
left[j].style.width = moveLen + 'px';
mid[j].style.width = (box[i].clientWidth - moveLen - 10) + 'px';
;
// 鼠标松开事件
document.onmouseup = function (evt)
//隐藏遮罩div
var iframeDiv = document.getElementsByClassName("iframeDiv");
iframeDiv[0].style.display = "none";
//颜色恢复
resize[i].style.background = '#d6d6d6';
document.onmousemove = null;
document.onmouseup = null;
resize[i].releaseCapture && resize[i].releaseCapture(); //当你不在需要继续获得鼠标消息就要应该调用ReleaseCapture()释放掉
;
resize[i].setCapture && resize[i].setCapture(); //该函数在属于当前线程的指定窗口里设置鼠标捕获
return false;
;
,
changeIframeDivStyle(display)
var iframeDiv = document.getElementsByClassName('iframeDiv');
iframeDiv[0].style.display = display;
,
// mounted 调用
this.dragControllerDiv();
转载自:https://blog.csdn.net/qian_li_hui/article/details/127410905
vue拖拽不固定列
前端框架Ant Design of Vue 表格使用 vue-draggable-resizabl -- 固定列问题修复

glass_Girl
原创
关注
0点赞·289人阅读
表格如果加了列拖拽功能,并且设置了列fixed。
出现了一个头疼的现象
问题:
因为拖拽需要设置width。这个时候。你屏幕宽度超过了他们设置的widht之和。Ant Des的表格自适应放宽。可是加了resizabl的列依旧是固定宽度。导致。显示了两个相同的列。还是不一样的长度
解决方式 :
在拖拽/加载时判断是否超长。动态去掉fixed配置项
页面引入
import vdr from "vue-draggable-resizable-gorkys";
import "vue-draggable-resizable-gorkys/dist/VueDraggableResizable.css";
import debounce from "lodash/debounce";
登录后复制
:components='components'
this.components =
header:
cell: (h, props, children) =>
const key, ...restProps = props;
// 此处的this.columns 是定义的table的表头属性变量
const col = this.columns.find((col) =>
const k = col.dataIndex || col.key;
return k === key;
);
if (!col || !col.width)
return h("th", ...restProps , [...children]);
const minWidth = 200, maxWidth = col || ;
const dragProps =
key: col.dataIndex || col.key,
class: "",
attrs:
w: col.width,
h: "auto",
axis: "x",
minWidth,
maxWidth,
draggable: false,
resizable: true,
handles: ["mr"]
,
on:
resizing: (l, t, w) =>
col.width = Math.max(w, 1);
,
resizestop: () =>
this.resize();
;
const drag = h(vdr, ...dragProps , [...children]);
restProps.class += " resize-table-th";
return h(
"th",
...restProps
,
[drag]
);
;
登录后复制

重新计算表列:this.resize();
记得给表格添加 样式:.draggable-table,设置::scroll="x:true"
// 动态计算Columns
export function calculateColumns(columns)
const domTable =
window.document.querySelector(".draggable-table .ant-table-body") || ;
const scrollWidth = 0,clientWidth = 0 = domTable;
scrollX = clientWidth < scrollWidth - 1;
if (scrollX)
columns = columns.map(o =>
if (o.fixedInit)
o.fixed = o.fixedInit; // 恢复浮动列配置
return o;
);
else
columns = columns.map(o =>
if (o.fixed)
o.fixedInit = o.fixed;
o.fixed = undefined;
return o;
);
return columns
登录后复制

窗口变化都要去更新
mounted()
this.$options._resize = debounce(this.resize, 150);
window.addEventListener("resize", this.$options._resize);
,
beforeDestroy()
window.removeEventListener("resize", this.$options._resize);
,
登录后复制
样式:
// 可拖拽表头表格样式
.resize-table-th .vdr
height: 100% !important;
width: 100% !important;
padding: @rem7 @rem16 !important;
border: none;
transform: none !important;
position: relative !important;
.resize-table-th
padding: 0 !important;
&:hover .handle-mr
background: @yn-auxiliary-color;
.resize-table-th .handle
cursor: col-resize;
border: none !important;
box-shadow: none !important;
.resize-table-th .handle-mr
width: 2px !important;
z-index: 2;
cursor: col-resize;
background: inherit;
border: none;
height: calc(100% - @rem12) !important;
top: @rem6 !important;
right: 0 !important;
display: block !important;
登录后复制

然后不论怎么拖拽。变窗口大小。固定列都能正常展示了 参考技术A Vue.js 提供了一个拖拽组件 vue-draggable,可以实现不固定列的拖拽功能。
使用方法:
1. 安装vue-draggable:
npm install vue-draggable --save
2. 在main.js中引入vue-draggable:
import VueDraggable from 'vue-draggable'
Vue.use(VueDraggable)
3. 在页面中使用vue-draggable:
<draggable v-model="list" :options="group:'people'">
<div v-for="item in list" :key="item.name"> item.name </div>
</draggable>
以上是关于vue左右拖拽,内置iframe拖拽卡顿问题的主要内容,如果未能解决你的问题,请参考以下文章
在vue脚手架中元素绑定鼠标移动事件onmousemove,当鼠标按下拖拽元素,能在指定元素里左右移动,如何实现?