分隔條左右拖動 js 實現(xiàn)

splitter

原理】:

  1. 定位

分為3個部分:左邊部分、分隔條、右邊部分,左邊部分與分隔條采用絕對定位。

  1. 事件

監(jiān)聽分隔條的 onmousedownonmousemove 、onmouseup 事件, onmousedown 記錄下分隔條的初始位置,onmousemove 進行計算,onmousedown 的時候取消操作。

  1. 位置計算

見代碼注釋。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>分隔條左右拖動 splitter</title>
    <style>
        #root {
            position: relative;
            width: 800px;
            height: 300px;
            margin: 20px auto;
        }
        #left {
            width: 200px;
            background: #ffdd40;
            position: absolute;
            top: 0;
            bottom: 0;
        }
        #right {
            margin-left: 220px;
            background: pink;
            height: 100%;
        }
        #line {
            position: absolute;
            top: 0;
            bottom: 0;
            left: 209px;
            width: 4px;
            background: #e7e7e7;
            box-shadow: 0px 0px 8px #ccc;
            cursor: w-resize;
        }
    </style>
</head>

<body>
    <center>左右拖動分隔條改變顯示區(qū)域?qū)挾?lt;span id="msg"></span></center>
    <div id="root">
        <div id="left">左邊部分</div>
        <div id="right">右邊部分</div>
        <!-- 分隔條 -->
        <div id="line"></div>
    </div>
</body>
<script>
    // 改變分隔條左右寬度所需常量
    const leftWidth = 200;  // 左邊部分寬度
    const rightToLeftGap = 20;  // 右邊部分與左邊部分的距離
    const lineWidth = 4; // 分隔條寬度
    const splitMinLeft = 209; // 分隔條左邊部分最小寬度
    const splitMaxLeft = 408; // 分隔條左邊部分最大寬度

    var oRoot = document.getElementById('root'),
        oLeft = document.getElementById('left'),
        oRight = document.getElementById('right'),
        oLine = document.getElementById('line');

    window.onload = function () {
        oLine.onmousedown = handleLineMouseDown;
    };

    // 分隔條操作
    function handleLineMouseDown(e) {
        // 記錄下初始位置的值
        let disX = e.clientX;
        oLine.left = oLine.offsetLeft;

        document.onmousemove = function (e) {
            let moveX = e.clientX - disX;   // 鼠標拖動的偏移距離
            let iT = oLine.left + moveX,    // 分隔條相對父級定位的 left 值
                maxT = oRoot.clientWidth - oLine.offsetWidth;

            iT < 0 && (iT = 0);
            iT > maxT && (iT = maxT);

            if (iT <= splitMinLeft || iT >= splitMaxLeft) return false;

            let leftLineGap = splitMinLeft - leftWidth; // 分隔條距左邊部分的距離
            let oLeftWidth = iT - leftLineGap;
            let oRightMarginLeft = oLeftWidth + lineWidth + rightToLeftGap;

            oLine.style.left = `${iT}px`;
            oLeft.style.width = `${oLeftWidth}px`;
            oRight.style.marginLeft = `${oRightMarginLeft}px`;
            return false;
        };

        // 鼠標放開的時候取消操作
        document.onmouseup = function () {
            document.onmousemove = null;
            document.onmouseup = null;
        };
    }
</script>
</html>

? Demo

參考代碼:如何添加左右div中間動態(tài)調(diào)整的分割線功能?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • ??JavaScript 與 HTML 之間的交互是通過事件實現(xiàn)的。 ??事件,就是文檔或瀏覽器窗口中發(fā)生的一些特...
    霜天曉閱讀 3,700評論 1 11
  • HTML標簽解釋大全 一、HTML標記 標簽:!DOCTYPE 說明:指定了 HTML 文檔遵循的文檔類型定義(D...
    米塔塔閱讀 3,530評論 1 41
  • 1 放大鏡實例 頁面結(jié)構(gòu):創(chuàng)建左右兩個容器,左邊容器中添加一張圖片背景圖,右邊容器中添加一張與背景圖成比例放大的圖...
    果木山閱讀 341評論 0 0
  • offset家族三大家族和一個事件對象三大家族(offset/scroll/client)事件對象/event ...
    Yuann閱讀 1,092評論 0 5
  • 嘉油站這么久沒更新了 想我沒 嘉油站很久沒更新了,今天突然很想聊一聊“關系” 很多時候,“關系”是一個很微...
    小小嘉吖閱讀 425評論 0 0

友情鏈接更多精彩內(nèi)容