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,当鼠标按下拖拽元素,能在指定元素里左右移动,如何实现?

撸一个vue项目实现拖拽功能

撸一个vue项目实现拖拽功能

vue侧边栏可拖拽,右侧区域可自适应宽度

基于 SpringBoot + Vue 实现的可视化拖拽编辑的大屏项目

vue里怎么实现右侧悬浮,并且能上下拖拽的按钮功能?