美文网首页让前端飞Web前端之路
js 实现左右或上下div拖动改变宽高,类似codepen

js 实现左右或上下div拖动改变宽高,类似codepen

作者: alanwhy | 来源:发表于2020-07-09 11:04 被阅读0次

原文链接实现了左右,此处就不做代码重复

codepen 中可以发现上面的代码部分可以左右拖动,上下也是可以拖动改变的

image.png

上代码

此处需要注意 codepen有一个 header,我们大概理解高度为 60px
使用了 vue 作为开发框架 不影响使用
    <div class="run-view-root">
        <div class="header">
            <img class="header-title" src="./../assets/img/title.png" alt="" />
            <div class="header-back" @click="linkToHome">
                返回首页
            </div>
        </div>
        <div class="container" id="container-box">
            <div id="code-container">
                <div class="code-text html-code"></div>
                <div class="code-text css-code"></div>
                <div class="code-text js-code"></div>
            </div>
            <div id="resize"></div>
            <div id="result-preview"></div>
        </div>
    </div>
export default {
    methods: {
        linkToHome() {
            this.$router.push({
                name: "Home"
            });
        },
        resizeChange() {
            // 获取dom
            let resize = document.getElementById("resize");
            let top = document.getElementById("code-container");
            let bottom = document.getElementById("result-preview");
            let box = document.getElementById("container-box");
            resize.onmousedown = (e) => {
                let startY = e.clientY;
                // 此处减去header的60px
                resize.top = resize.offsetTop - 60;
                document.onmousemove = (e) => {
                    let endY = e.clientY;

                    let moveLen = resize.top + (endY - startY);
                    let maxT = box.clientHeight - resize.offsetHeight;
                    // 保留最小200的高度
                    if (moveLen < 200) moveLen = 200;
                    if (moveLen > maxT - 200) moveLen = maxT - 200;

                    resize.style.top = moveLen;
                    top.style.height = moveLen + "px";
                    // 减去resize的高度10px
                    bottom.style.height = box.clientHeight - moveLen - 10 + "px";
                };
                document.onmouseup = (evt) => {
                    // 清除事件
                    document.onmousemove = null;
                    document.onmouseup = null;
                    // 鼠标捕获事件
                    resize.releaseCapture && resize.releaseCapture();
                };
                // 鼠标捕获事件
                resize.setCapture && resize.setCapture();
                return false;
            };
        }
    },
    mounted() {
        this.resizeChange();
    }
};
$--run-background-color: #1e1f26;
$--run-border-color: #333642;
.run-view-root {
    min-width: 1200px;
    width: 100%;
    height: 100%;
    .header {
        display: flex;
        align-items: center;
        justify-content: space-between;
        height: 60px;
        box-sizing: border-box;
        border-bottom: 1px solid $--run-border-color;
        background: $--run-background-color;
        .header-title {
            margin-left: 40px;
        }
        .header-back {
            margin-right: 40px;
            color: #fff;
            cursor: pointer;
            &:hover {
                text-decoration: underline;
            }
        }
    }
    .container {
        width: 100%;
        height: calc(100% - 60px);
        #code-container {
            display: flex;
            width: 100%;
            height: calc(50% - 5px);
            background: $--run-background-color;
            .code-text {
                width: 33.33%;
                border-right: 2px solid $--run-border-color;
                &:last-child {
                    border: 0px;
                }
            }
        }
        #resize {
            width: 100%;
            height: 9px;
            background: $--run-border-color;
            border-bottom: 1px solid black;
            box-shadow: 0 0 1px black;
            cursor: s-resize;
            z-index: 999;
        }
        #result-preview {
            width: 100%;
            height: calc(50% - 5px);
            background: radial-gradient(circle, #444857, #2c303a);
        }
    }
}

最终效果

此处只实现了上下的拖动,左右拖动可参考原文链接,都是同理

image.png

原文链接:实现左右可拖动改变宽度的div内容显示区,并且控制拖动范围

相关文章

网友评论

    本文标题:js 实现左右或上下div拖动改变宽高,类似codepen

    本文链接:https://www.haomeiwen.com/subject/tmsjcktx.html