【问题标题】:Vertical dragBar for resizing two divs用于调整两个 div 大小的垂直拖动条
【发布时间】:2019-08-24 00:24:52
【问题描述】:


我想要一个垂直的 dragBar 来调整两个 div 的大小。我已经为此创建了一个示例,但我遇到了一个问题。
实际:当我调整上部 div 的大小并向下移动滑块时,父 div 的区域会增加,因此会给出一个滚动条。
预期:在调整大小时,如果滑块向下移动,它应该只显示上div包含的数据,当滑块向上移动时,它应该显示下div的内容,并且不应该增加父div的总长度.

var handler = document.querySelector('.handler');
var wrapper = handler.closest('.wrapper');
var boxA = wrapper.querySelector('.box1');
var boxB = wrapper.querySelector('.box2');
var isHandlerDragging = false;

document.addEventListener('mousedown', function(e) {
  // If mousedown event is fired from .handler, toggle flag to true
  if (e.target === handler) {
    isHandlerDragging = true;
  }
});

document.addEventListener('mousemove', function(e) {
  // Don't do anything if dragging flag is false
  if (!isHandlerDragging) {
    return false;
  }

  // Get offset
  var containerOffsetTop= wrapper.offsetTop;
  var containerOffsetBottom= wrapper.offsetBottom;


  // Get x-coordinate of pointer relative to container
  var pointerRelativeXpos = e.clientY - containerOffsetTop;
  var pointerRelativeXpos2 = e.clientY - e.offsetTop + e.offsetHeight;
  
 
  var boxAminWidth = 30;

  
  boxA.style.height = (Math.max(boxAminWidth, pointerRelativeXpos - 2)) + 'px';
  boxA.style.flexGrow = 0;
   boxB.style.height = (Math.max(boxAminWidth, pointerRelativeXpos2 - 8)) + 'px';
  boxB.style.flexGrow = 0;
});
document.addEventListener('mouseup', function(e) {
  // Turn off dragging flag when user mouse is up
  isHandlerDragging = false;
});
body {
  margin: 40px;
}

.wrapper {
  background-color: #fff;
  color: #444;
  /* Use flexbox */
  
}

.box1, .box2 {
  background-color: #444;
  color: #fff;
  border-radius: 5px;
  padding: 20px;
  font-size: 150%;
  margin-top:2%;
  
  /* Use box-sizing so that element's outerwidth will match width property */
  box-sizing: border-box;
  
  /* Allow box to grow and shrink, and ensure they are all equally sized */
 
}

.handler {
  width: 20px;
  height:7px;
  padding: 0;
  cursor: ns-resize;
}

.handler::before {
  content: '';
  display: block;
  width: 100px;
  height: 100%;
  background: red;
  margin: 0 auto;
}
<div class="wrapper">
  <div class="box1">A</div>
  <div class="handler"></div>
  <div class="box2">B</div>
</div>

希望我清楚地解释了我在项目中面临的问题。任何帮助表示赞赏。

【问题讨论】:

标签: javascript jquery html css


【解决方案1】:

看起来你在正确的轨道上。您只需要使用 flex direction 列使包装器成为一个 flexbox 并为其分配一个高度。盒子 2 的 flex 也需要为 1,以便它可以根据需要增长和收缩。最后,我需要删除在 JavaScript 中设置 flex 增长为 0 的代码。结果如下。

var handler = document.querySelector('.handler');
    var wrapper = handler.closest('.wrapper');
    var boxA = wrapper.querySelector('.box1');
    var boxB = wrapper.querySelector('.box2');
    var isHandlerDragging = false;

    document.addEventListener('mousedown', function(e) {
        // If mousedown event is fired from .handler, toggle flag to true
        if (e.target === handler) {
            isHandlerDragging = true;
        }
    });

    document.addEventListener('mousemove', function(e) {
        // Don't do anything if dragging flag is false
        if (!isHandlerDragging) {
            return false;
        }

        e.preventDefault();

        // Get offset
        var containerOffsetTop= wrapper.offsetTop;
        var containerOffsetBottom= wrapper.offsetBottom;


        // Get x-coordinate of pointer relative to container
        var pointerRelativeXpos = e.clientY - containerOffsetTop;
        var pointerRelativeXpos2 = e.clientY - e.offsetTop + e.offsetHeight;


        var boxAminWidth = 30;


        boxA.style.height = (Math.max(boxAminWidth, pointerRelativeXpos - 2)) + 'px';
        boxB.style.height = (Math.max(boxAminWidth, pointerRelativeXpos2 - 8)) + 'px';
    });
    document.addEventListener('mouseup', function(e) {
        // Turn off dragging flag when user mouse is up
        isHandlerDragging = false;
    });
body {
            margin: 40px;
        }

        .wrapper {
            background-color: #fff;
            color: #444;
            /* Use flexbox */
            display: flex;
            flex-direction: column;
            height: 200px;
        }

        .box1, .box2 {
            background-color: #444;
            color: #fff;
            border-radius: 5px;
            padding: 20px;
            font-size: 150%;
            margin-top:2%;

            /* Use box-sizing so that element's outerwidth will match width property */
            box-sizing: border-box;

            /* Allow box to grow and shrink, and ensure they are all equally sized */

        }


        .box2 {
            flex: 1;
        }

        .handler {
            width: 20px;
            height:7px;
            padding: 0;
            cursor: ns-resize;
        }

        .handler::before {
            content: '';
            display: block;
            width: 100px;
            height: 100%;
            background: red;
            margin: 0 auto;
        }
<div class="wrapper">
    <div class="box1">A</div>
    <div class="handler"></div>
    <div class="box2">B</div>
</div>

【讨论】:

  • 嘿,非常感谢 :) 你拯救了我的一天 :) 这解决了我上面提出的问题。但是现在在这个改变之后,我面临一个新的问题。即使在鼠标向上状态下,滑块手柄也可以滚动。无法猜测导致此问题的原因
  • 当您尝试在调整 div 大小的同时尝试拖动某些东西时,似乎会发生这种情况。例如,当您不小心同时选择了下一个时。我可以通过将 e.preventDefault() 添加到 mousemove 事件来防止这种情况。我已经编辑了我的答案:)
  • 嘿,我在我的 jsFiddle 代码中尝试了同样的方法。它工作得很好。非常感谢 :)。但是当我在自己的项目中尝试相同的代码时,问题又出现了。我正在发布我的项目的 jsfiddle 示例。你能指出这有什么问题吗?因为我使用了与上面相同的代码和 css 属性,但是当我双击手柄时,手柄上升,并且当手柄在底端移动时调整大小也不完美。 JsFiddle:jsfiddle.net/kn507gtw
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-07
  • 1970-01-01
  • 1970-01-01
  • 2015-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多