js实现左右布局 中间可以左右拖动

41 阅读1分钟
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <link href="https://vjs.zencdn.net/7.10.2/video-js.css"
            rel="stylesheet">
        <script src="https://vjs.zencdn.net/7.10.2/video.js"></script>
        <style>
            * {
                margin: 0;
                padding: 0;
                box-sizing: border-box;
            }
            
            body, html {
                height: 100%;
                overflow: hidden;
            }
            
            .container {
                display: flex;
                height: 100vh;
                width: 100%;
            }
            
            .left-panel {
                /* flex:flex-grow flex-shrink flex-basis: 项目放大比例/缩小比例/分配多余空间之前,项目占据的主轴空间; */
                flex: 0 0 auto;
                width: 30%;
                min-width: 100px;
                max-width: 80%;
                background-color: #f0f0f0;
                overflow: auto;
                resize: none;
                height: 100%;
            }
            
            .right-panel {
                flex: 1 1 auto;
                min-width: 100px;
                background-color: #e0e0e0;
                overflow: auto;
                height: 100%;
            }
            
            .drag-handle {
                flex: 0 0 8px;
                background-color: #ccc;
                cursor: col-resize;
                height: 100%;
                position: relative;
            }
            
            .drag-handle::after {
                content: "";
                position: absolute;
                top: 0;
                bottom: 0;
                left: 2px;
                width: 4px;
                background-color: #999;
            }
            
            .drag-handle:hover {
                background-color: #bbb;
            }
            
            .drag-handle:hover::after {
                background-color: #777;
            }

            .video{
                width: 100%;
                height: 300px;
            }
        </style>
    </head>
    <body>
        <div class="container">
            <div class="left-panel">
                <!-- 左侧内容 -->
                <video id="my_video_1" class="video-js video" controls
                    preload="auto">
                    <source src="./video.mp4" type="video/mp4">

                </video>
            </div>
            <div class="drag-handle" id="dragHandle"></div>
            <div class="right-panel">
                <!-- 右侧内容 -->
            </div>
        </div>

        <!-- <svg width="200" height="200">
            <rect width="100" height="100" fill="blue" stroke-width="3" />
        </svg>
        <br />
        <svg width="200" height="200">
            <rect x="10" y="50" width="100" height="100" fill="yellow"
                stroke="red" stroke-width="10" stroke-width="0.8"
                fill-opacity="1" />
        </svg>
        <br />
        <svg width="500" height="200">
            <polyline points="10,20 30,40 50,60" stroke="red"
                stroke-width="10" />
        </svg>
        <br />
        <svg width="500" height="200">
            <polyline points="10,30 30,40 50,60 70,100" fill="none" stroke="red"
                stroke-width="2" />
        </svg>
        <br />
        <svg width="500" height="200">
            <text x='0' y='20'> 11111111</text>
            <text x='0' y='40' transform='rotate(20 30 40)'> 11111111</text>
            <text x='0' y='60' transform='rotate(20)'> 11111111</text>
        </svg>
        <br /> -->
        <!-- 
        <svg width="200" height="200"
            xmlns:xlink='http://www.w3.org/1999/xlink'>
            <a xlink:href="demo1.html" target='_black'>
                <text x='0' y='20' fill="red" font-size='20' text-anchor='end'>
                    22222</text>
            </a>
        </svg>
        <br /> -->
        <!-- <svg width="500" height="400">
          <path d="M0 0 L100 0 L50 50" fill="red"></path>
        </svg>
        <br />  -->

        <!-- <svg width="500" height="400" fill="yellow">
            <path d="M100 350 q150 -300 300 0 " fill="none" stroke="pink"
                stroke-width="3"></path>
        </svg>
        <br />
        <svg width="500" height="400" fill="yellow">
            <defs>
                <filter id='f1'>
                    <fegaussianblur stdDeviation='20' />
                </filter>
            </defs>

            <rect width="100" height="100" fill="pink" stroke="yellow" stroke-width="4" filter="url(#f1)"
        </svg>
        <br /> -->

    </body>
    <script>
        const dragHandle = document.getElementById('dragHandle');
        const container = document.querySelector('.container');
        const leftPanel = document.querySelector('.left-panel');
        const rightPanel = document.querySelector('.right-panel');
        
        let isDragging = false;
        
        dragHandle.addEventListener('mousedown', (e) => {
            isDragging = true;
            document.body.style.cursor = 'col-resize';
            leftPanel.style.userSelect = 'none';
            leftPanel.style.pointerEvents = 'none';
            rightPanel.style.userSelect = 'none';
            rightPanel.style.pointerEvents = 'none';
        });
        
        document.addEventListener('mousemove', (e) => {
            if (!isDragging) return;
            
            const containerRect = container.getBoundingClientRect();
            const percent = (e.clientX - containerRect.left) / containerRect.width * 100;
            
            // 限制最小和最大宽度
            const newPercent = Math.max(10, Math.min(80, percent));
            
            leftPanel.style.width = `${newPercent}%`;
        });
        
        document.addEventListener('mouseup', () => {
            isDragging = false;
            document.body.style.cursor = '';
            leftPanel.style.userSelect = '';
            leftPanel.style.pointerEvents = '';
            rightPanel.style.userSelect = '';
            rightPanel.style.pointerEvents = '';
        });
    </script>
</html>