You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现类似VS Code的JavaScript动态拆分面板拖拽调整功能?

动态拆分面板拖拽调整大小问题

我已实现JavaScript动态拆分面板,可根据父元素及其子元素判断垂直或水平拆分:若父元素已有同方向拆分面板则直接添加新结构,不同方向则包裹激活面板后拆分。但无法实现类似VS Code的鼠标拖拽调整面板大小的功能,尝试过split.js和jQuery UI均未成功,相关代码如下:

HTML代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Dynamic Split Panes</title>

    <script src="jquery.js"></script>

    <link rel="stylesheet" href="main.css">
</head>
<body>
    <div id="container">
        <div class="ep">
            <div class="ec" id="ec"></div>
        </div>
    </div>

    <script src="main.js"></script>
</body>
</html>

CSS代码

html,
body{
    height: 100%;
    width: 100%;
    margin: 0;
    padding: 0;
    overflow: hidden;
}

#container{
    display: flex;
    width: 100%;
    height: 100%;
    background-color: black;
}

.ep{
    display: flex;
    flex: 1;
}

.ec{
    flex: auto;
    background-color: white;
}

.gutter-ver{
    height: 10px;
    width: 100%;
    background-color: red;
}

.gutter-hor{
    height: 100%;
    width: 10px;
    background-color: red;
}

.ui-resizable-ghost { 
    border: 1px dotted gray; 
    background-color: rgba(128, 128, 128, 0.544);
}

JavaScript代码

var ec_active = document.querySelector(".ec");
var ec = null;
function createEC(dir){
    if(dir == "ver"){
        if(ec_active.parentElement.style.flexDirection == "row"){
            // `element` is the element you want to wrap
            var parent = ec_active.parentNode;
            var wrapper = document.createElement('div');
            wrapper.classList.add("ep");
            wrapper.style.flexDirection = "column";
            // set the wrapper as child (instead of the element)
            parent.replaceChild(wrapper, ec_active);
            // set element as child of wrapper
            wrapper.appendChild(ec_active);


            ec = document.createElement("div");
            ec.classList.add("ec");
            
            var gv = document.createElement("div");
            gv.classList.add("gutter-ver");

            ec_active.parentElement.appendChild(gv);
            ec_active.parentElement.appendChild(ec);
        }else if(ec_active.parentElement.style.flexDirection == "column"){
            ec = document.createElement("div");
            ec.classList.add("ec");
            
            var gv = document.createElement("div");
            gv.classList.add("gutter-ver");

            ec_active.parentElement.appendChild(gv);
            ec_active.parentElement.appendChild(ec);
        }else{
            ec = document.createElement("div");
            ec.classList.add("ec");
            
            var gv = document.createElement("div");
            gv.classList.add("gutter-ver");

            ec_active.parentElement.style.flexDirection = "column";

            ec_active.parentElement.appendChild(gv);
            ec_active.parentElement.appendChild(ec);
        }
    }else{
        if(ec_active.parentElement.style.flexDirection == "column"){
            // `element` is the element you want to wrap
            var parent = ec_active.parentNode;
            var wrapper = document.createElement('div');
            wrapper.classList.add("ep");
            wrapper.style.flexDirection = "row";
            // set the wrapper as child (instead of the element)
            parent.replaceChild(wrapper, ec_active);
            // set element as child of wrapper
            wrapper.appendChild(ec_active);


            ec = document.createElement("div");
            ec.classList.add("ec");
            
            var gv = document.createElement("div");
            gv.classList.add("gutter-hor");

            ec_active.parentElement.appendChild(gv);
            ec_active.parentElement.appendChild(ec);
        }else if(ec_active.parentElement.style.flexDirection == "row"){
            ec = document.createElement("div");
            ec.classList.add("ec");
            
            var gv = document.createElement("div");
            gv.classList.add("gutter-hor");

            ec_active.parentElement.appendChild(gv);
            ec_active.parentElement.appendChild(ec);

            // resizeEC(ec_active, ec);
        }else{
            ec = document.createElement("div");
            ec.classList.add("ec");
            
            var gv = document.createElement("div");
            gv.classList.add("gutter-hor");

            ec_active.parentElement.style.flexDirection = "row";

            ec_active.parentElement.appendChild(gv);
            ec_active.parentElement.appendChild(ec);

            // resizeEC(ec_active, ec);
        }
    }
}


document.addEventListener("click", (e)=>{
    ec_active = e.target;
});

function refreshGutters(){
    var gutters_hor = document.querySelectorAll(".gutter-hor");
    gutters_hor.forEach((gutter_hor)=>{
        gutter_hor.onmousedown = (e)=>{
            var elm_prev_gutter = gutter_hor.previousElementSibling;
            var elm_next_gutter = gutter_hor.nextElementSibling;

            var elm_prev_gutter_width = $(elm_prev_gutter).width();
            var elm_next_gutter_width = $(elm_next_gutter).width();
            
            init_pos = gutter_hor.getBoundingClientRect().x;
            init_mouse_pos = e.clientX;
            gutter_hor.onmousemove = (e)=>{
                if(e.clientX > init_mouse_pos){
                    gutter_hor.style.left = e.clientX;
                }
            };
        };
    });
}

内容的提问来源于stack exchange,提问作者Kshitij Tyagi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 20:50:24