【问题标题】:Vertically resize DIV elements within parent height在父高度内垂直调整 DIV 元素的大小
【发布时间】:2015-11-17 02:35:56
【问题描述】:

看到投反对票而士气低落,我真的尽我所能(我相信)解释我的问题并保持简短。如果您发现难以理解问题,我愿意跟进任何改进 建议:,(

我正在尝试创建一个 100% 高度的垂直侧边栏,其中包含 N 个 可调整大小的子项 元素 - 例如 Facebook 侧边栏(聊天...)或 Photoshop 的侧边栏

如果子元素不超过父元素的高度,并且调整一个元素的大小,另一个元素应相应地调整大小,因此实际上添加的子元素高度应始终与 (100%) 父元素高度匹配。

我尝试调整表格行的大小,但再次失败...
这就是我目前使用 CSS3 flex 所拥有的(似乎是个好主意):(

$("#panel>div").resizable({
  handles:'s'     /* try using "n" to see what happens... */
});
*{margin:0; box-sizing: border-box;}
html, body{height:100%;}
[class^=ui-resizable]{height:2px;background:#08f;cursor:row-resize;}

#panel{
  display:flex;
  flex-direction: column ;
  height:100%;
  width:200px;
}
#panel>div{
  flex: 1;
  background:#aaa;
}
<link href="https://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css" rel="stylesheet" type="text/css" />
<script src="https://code.jquery.com/jquery-1.11.3.js"></script>
<script src="https://code.jquery.com/ui/1.11.4/jquery-ui.js"></script>

<div id="panel">
  <div id="a">a</div>
  <div id="b">b</div>
  <div id="c">c</div>
</div>

在上面的demo中可以清楚的看到,由于使用了flex,jQuery无法调整元素的大小......

你会如何解决这个问题(没有插件)? 谢谢

【问题讨论】:

  • 始终寻求涉及更少代码的解决方案。当然说起来容易做起来难,但我看到一个解决方案可能只需要正确配置的 flexbox 布局。等待答复,先生。顺便说一句,我认为您的问题没有任何问题,我怀疑有些人会通过否决投票来随机破坏问题。希望我的赞成票将帮助您的问题浮出水面。 :)
  • @zer00ne 你是个真正的绅士! 我不坚持使用 flexbox 我只是想看看不同的想法和方法 - 学习一些新的东西......谢谢!
  • 经过进一步检查,我发现您希望能够手动重新调整 flex 子项的大小。这需要额外的时间,但喜欢这个想法。
  • @zer00ne 是的,我认为这毕竟是一个有趣的问题。所以基本上如果内容超过高度,可调整大小的元素应该有滚动条。它们的累积高度应始终与容器高度匹配(例如:a+b+c=always 100%),类似于 Facebook 的右侧边栏(在桌面上)和 Photoshop 的图层边栏。我已经对 SO 进行了广泛的研究,只找到插件建议(这并没有教太多)
  • 我现在没有时间写出完整的答案,但如果明天还没有答案,我会的。我只是想我可以通过说你可以在调整第一个 div 的大小时使用 resize 事件处理程序同时调整前一个 div 的大小(或者如果它不存在,下一个 div)来将你瞄准“一个”正确的方向。 “ui 对象”会跟踪原始大小和当前大小,因此您需要做的就是跟踪邻居的起始大小,并根据您正在调整大小的对象的当前大小更新它的当前大小。希望对你有帮助,如果没有,我明天再写出来。

标签: javascript jquery css jquery-ui


【解决方案1】:

结果我毕竟有一些时间:) fiddle

因此,这里的关键代码是,当您开始调整大小时,您选择了一个您也想调整大小的邻居:

if ($(this).next('.resiz').length>0){
    other= $(this).next('.resiz');
 }else{
    other = $(this).prev('.resiz');
 }
 startingHeight= other.height();

并存储它的高度。然后当我们调整大小时,我们也会调整另一个大小

 resize:function(e,ui){
     var dh = ui.size.height-ui.originalSize.height;
     if (dh>startingHeight){// can't resize the box more then it's neighbour
         dh =  startingHeight;
         ui.size.height = ui.originalSize.height+dh;
     }
     other.height(startingHeight-dh);
 }

希望对你有用

【讨论】:

  • 虽然还有一个小问题,但放大第二个 DIV 的高度...父级增加高度...快点吗?
  • 我在测试时没有遇到这个问题,所以我认为你的更改是偷偷摸摸的。现在没时间看,希望你能解决:)
  • 您的演示中也有,不用担心。你已经帮了很多忙了。我认为一些Math.min 会得到排序。再次感谢
  • 添加了关于调整过去邻居边界问题的快速修复
  • 非常感谢!我已经编辑了您的示例,还包括:50px 最小尺寸! jsfiddle.net/y0cep2g9/9(似乎我们也从来不需要.prev()...):D
【解决方案2】:

CSS3 flexbox 没有得到很好的支持,可能不太适合这个任务。在元素上设置 resize: vertical 并使用 javascript 侦听器在调整大小时调整所有 div 的大小。我不知道您想要实现调整大小的具体程度,而且我没有耐心免费从头开始编写涉及的内容,但是我可以为您提供的是一个小 javascript,它可以帮助您向所有人添加事件侦听器类的元素。

function resizeboxes() {
    //resize your boxes here.
}

sections = document.querySelectorAll(".resizable-boxes");
for(i = 0; i < sections.length; i++){
    sections[i].addEventListener("resize", resizeboxes);
}

【讨论】:

  • 我没有嫁给flex 只是想弄清楚是否有一些(即:CSS)resize:vertical;(最好是 CSS)或其他一些不错的简单技巧(JS/jQuery)完成工作。
  • 其实有一个叫做resize的css属性可以设置为垂直。不幸的是,我不相信有一种纯 CSS 方式可以在不使用 flexbox 的情况下做你想做的事。你为什么不继续尝试在你的#panel>div 规则中使用“resize:vertical”,看看有什么作用?
  • 不幸的是resize 打开了另一个潘多拉魔盒...感谢您的大力支持。 1 次。
猜你喜欢
  • 2018-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多