【问题标题】:How do you allow a user to manually resize a <div> element vertically?您如何允许用户手动调整 <div> 元素的垂直大小?
【发布时间】:2019-08-29 02:31:53
【问题描述】:

我在另一个 div 中有 2 个 div 元素,它们每个都显示为一个块。所以 div1 就在 div2 的上方。

我想添加一个用户可以单击并拖动的“栏”,最终会调整 div2 的大小,而 div1 将由数量相同。

div1div2 的父级具有样式:display:flex;flex-direction:column;div1 具有flex-grow:1,因此它会自动调整大小。

我希望调整大小栏是这样的:

如何添加这样的内容?还有什么方法可以改变它在 CSS 中的外观吗?

【问题讨论】:

  • 可能的指导:stackoverflow.com/questions/55559527(这是row,你可以适应column flexbox)你要演示吗?跨度>
  • 文本输入使用什么元素?如果你有一个 textarea 看到这个question
  • @T04435 div2 有一个文本区域,但也有其他元素,所以我想做它,所以只有 div2 被调整大小。
  • @kukkuz 我在那里看到了代码 sn-p,这就是我想要的,但是有没有办法简单地做到这一点而不使用 JS?以及如何改变酒吧的外观
  • 有了 CSS 你就可以选择使用resize

标签: html css flexbox slider


【解决方案1】:

在您的 列 flexbox 中,您可以在其中一个 div 上使用 resize,并使用设置为一个的 flex-grow 自动调整另一个 - 缺点 slider 不是很可定制:

  • resize: vertical 添加到弹性项目之一
  • flex: 1添加到另一个弹性项目(这样这个弹性项目将在调整大小时自动调整以响应另一个弹性项目的高度变化)

body {
  margin: 0;
}

.outer {
  display: flex;
  flex-direction: column;
  height: 100vh;
}

.block {
  height: 50%;
}

.block-1 {
  background-color: red;
  resize: vertical; /* resize vertical */
  overflow: auto; /* resize works for overflow other than visible */
}

.block-2 {
  background-color: green;
  flex: 1; /* adjust automatically */
}
<div class="outer">
  <div class="block block-1">
    Block 1
  </div>
  <div class="block block-2">
    Block 2
  </div>
</div>

解决方案

相反,您可以使用mousedown 侦听器注册一个更新block-1 高度的mousemove 侦听器(并重置mouseup 事件) -请看下面的演示:

let block = document.querySelector(".block-1"),
  slider = document.querySelector(".slider");

// on mouse down (drag start)
slider.onmousedown = function dragMouseDown(e) {
  // get position of mouse
  let dragX = e.clientY;
  // register a mouse move listener if mouse is down
  document.onmousemove = function onMouseMove(e) {
    // e.clientY will be the position of the mouse as it has moved a bit now
    // offsetHeight is the height of the block-1
    block.style.height = block.offsetHeight + e.clientY - dragX + "px";
    // update variable - till this pos, mouse movement has been handled
    dragX = e.clientY;
  }
  // remove mouse-move listener on mouse-up (drag is finished now)
  document.onmouseup = () => document.onmousemove = document.onmouseup = null;
}
body {
  margin: 0;
}

.outer {
  display: flex;
  flex-direction: column;
  height: 100vh;
}

.block {
  height: 50%;
}

.block-1 {
  background-color: red;
  resize: vertical; /* resize vertical */
  overflow: auto; /* resize works for overflow other than visible */
}

.block-2 {
  background-color: green;
  flex: 1; /* adjust automatically */
  min-height: 0;
  overflow: hidden; /* hide overflow on small width */
}

.slider {
  text-align: center;
  letter-spacing: 10px;
  background-color: #dee2e6;
  cursor: row-resize;
  user-select: none; /* disable selection */
}
<div class="outer">
  <div class="block block-1">
    Block 1
  </div>
  <div class="slider">slider</div>
  <div class="block block-2">
    Block 2
  </div>
</div>

【讨论】:

  • 正是我想要的谢谢!不过我在某个地方搞砸了。对于 querySelector 部分,我将参数设置为“#id_of_first_block”和“.class_of_slider”。我将 JS 代码粘贴在 &lt;script&gt; 标记中,位于两个 div 元素上方。确保将display:flex 放在容器元素中,将flex-grow:1 放在第二块中以使其自动调整大小,并将resize:vertical 放在第二块中。
  • 由于某种原因它什么也没做。当我将鼠标悬停在上方时,会出现垂直调整图标。当我单击并上下拖动时,没有任何反应。我知道我在某个地方搞砸了,因为你的代码 sn-p 运行得很好
  • @AndrewKor 你能给我一个codepen或fiddle吗,让我看看
  • 首先是一些指针:1) 滑块元素的多个类声明 2) 不要在元素之间使用脚本标签 - 最好将其保留在末尾​​span>
  • 所以你可以这样做:1) 为你的列 flexbox 指定一个高度 - 否则 flex-grow 没有意义 2) 你正在为底部元素设置高度 - 所以这里是符号反转:@ 987654339@
猜你喜欢
  • 2015-11-17
  • 1970-01-01
  • 2023-03-25
  • 2018-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-16
相关资源
最近更新 更多