如何使<div>可调整大小?

问题描述 投票:0回答:5

有没有办法通过拖放来调整

<div>
容器的大小?

html css drag-and-drop resize
5个回答
87
投票

最好的方法是使用CSS3。至少 Webkit 和 Gecko 支持。

根据w3c规范

div.my_class {
  resize:both;
  overflow:auto; /* something other than visible */
}

Webkit 和 Firefox 对规范的解释方式不同。在 Webkit 中,大小仅限于设置的宽度和高度。还有一个问题:如何使用 CSS 使元素的尺寸调整为小于初始尺寸? 关于这一点。


17
投票

div {
  border: 1px solid black;
}

.resizable-content {
  min-height: 30px;
  min-width: 30px;
  resize: both;
  overflow: auto;
  max-height: fit-content;
  max-width: fit-content;
}
<div class="resizable-content">Resize Me!</div>


9
投票

纯 CSS3 方法的问题是只有 div 的右下角可以拖动。用户几乎肯定会想要从任意的边框调整 div 的大小,而不仅仅是右下角。

在浪费了大量时间尝试通过从 Stack Overflow 复制代码片段来完成此任务之后,我强烈建议在您的项目中使用优秀的 InteractJS JavaScript 库。它允许您轻松创建可调整大小(且可拖动)的 div,并且可以从各个方向调整大小。


5
投票

let root = document.documentElement;
        let spliter = document.querySelector('.spliter-div');
        let rowDiv = document.querySelector('.row-divs');
        let cd1 = document.getElementById('cd-1');
        var isDown = false;
        var isHover = false;
        var minWidth = 127;
        var maxWidth = 600;

        function setPosition() {
            var cl = this.document.querySelector('.col-div');
            if (cl) {
                root.style.setProperty('--m-x', (cl.offsetWidth + 3.5) + 'px');
            }
            minWidth = (parseInt(rowDiv.clientWidth / 10) * 2) + 22;
            maxWidth = parseInt(rowDiv.clientWidth - minWidth);
        }
        function moveTo(e) {
            if (e.clientX > minWidth && e.clientX < maxWidth) {
                if (cd1.classList.contains('col-div-flex')) {
                    cd1.classList.remove('col-div-flex');
                }
                cd1.style.width = e.clientX  + 'px';
                root.style.setProperty('--m-x', (e.clientX + 9.5) + 'px');
            }
        }
        window.addEventListener('DOMContentLoaded', function (e) {
            setPosition();
        });
        window.addEventListener('resize', function (e) {
            setPosition();
        });
        root.addEventListener('mousedown', function (e) {
            if (isHover) {
                isDown = true;
            }
        }, true);
        document.addEventListener('mouseup', function (e) {
            isDown = false;
            if (isHover) {
                //...
            }
        }, true);
        document.addEventListener('mousemove', function (e) {
            if (isDown) {
                moveTo(e);
            }
        });
        spliter.addEventListener('mouseenter', function (e) {
            isHover = true;
            spliter.style.cursor = 'col-resize';
        });
        spliter.addEventListener('mouseout', function (e) {
            isHover = false;
        });
:root{
    --m-x: 0px;
}

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

body{
    margin-bottom: 60px ;
}

.container-divs{
    display: flex ;
    flex: 1 1 auto ;
    height: 100% ;
    width: 100% ;
}

.row-divs{
    display: flex ;
    width: 100% ;
}

.col-div{
    margin: 3px ;
    padding: 3px ;
    min-width: 20% ;
    max-width: 80% ;
}

.col-div-flex{
    flex: 1 0 0%;
}

.border-div{
    border: 1px #a3a3a3 ridge;
    border-radius: 9px;
}

.spliter-div{
    width: 5px ;
    height: 96% ;
    margin: 3px 0;
    background: #9a969676;
    position: absolute;
    left: var(--m-x);
    margin-top: 9px ;
    cursor: col-resize;
}
<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Divs - Resizeable</title>
</head>
<body>
    <div class="container-divs">
        <div class="row-divs">
            <div id="cd-1" class="col-div col-div-flex border-div" style="background-color:#d5ff00f7">
            </div>
            <div class="spliter-div"></div>
            <div id="cd-2" class="col-div col-div-flex border-div" style="background-color: #6719b5e2">
            </div>
        </div>
    </div>
</body>
</html>


0
投票

如果您需要为 mustberesizeable tags 数组中的每个标签(也是

)执行某个函数 doOnResize(tag),您可以简单地将此数组复制到 window 的数组中:

window[WIN_RESIZED] = [] // init the window's array
for (var i in tags) {      
  window[WIN_RESIZED].push(tags[i])
}

那组之后

window.addEventListener('resize', function(e){
  for (var i in window[WIN_RESIZED]) {
    doOnResize(window[WIN_RESIZED][i])
  }
})

必须写在开头的某个地方

const WIN_RESIZED = 'move_resized_divs'

具有任意名称,例如“move_resized_divs

© www.soinside.com 2019 - 2024. All rights reserved.