Intro

已经有很多问题和答案解释了max-widthmax-height的工作原理(例如this个).基本上,如果父母不受限制,子元素也不受限制.好吧,很好,但是.

问题

...但还有没有其他方法可以让我把子元素的restrict个尺寸变成如果子元素根本不在场的父母的尺寸呢?

...
   <div class="parent"> <!-- size determined by it's parent flexbox -->
      <div class="child">
         <!-- could have large content --> 
      </div>
   </div>
...
.child {
    max-height: 100%; /* not working as needed if parent is unrestricted */
    max-width: 100%; /* not working as needed parent is unrestricted */
    overflow: auto; /* handle oversized content */
}

背景/要求

  • 页面设计/布局是自上而下的切片,具有水平和垂直弹性框的嵌套层
  • 全身不应该有纵向或横向卷轴
  • 一般来说,某些子元素的大小是由其父母的大小决定的(100%或更小或填满剩余)
  • 在某种嵌套级别上,我有一个父分区,该分区具有由自上而下的嵌套确定的正确大小,并且我知道内部内容的大小可能会更大.
    • 应通过内部滚动来解决较大的尺寸,以防溢出
  • 我的父母和子元素相遇的点是不同布局策略相遇的过渡点
    • 一切"above"父级都是自上而下的布局,这意味着父级大小会影响子级大小(多姆中较高级别决定较低级别的大小)
    • "below" child的一切都是自下而上的布局,这意味着子元素的大小会影响父母的大小(多姆中的较低级别决定较高级别的大小)
    • 如果需要,通过滚动来解决这两个不同世界之间的交汇点

我当前的解决方案

由于我无法使用CSS获得所需的行为,因此我可以在隐藏子元素(display: none;)期间将子元素的max-widthmax-height更改为父母的widthheight(以像素为单位)来故障转移到JS.我首先隐藏子元素以查看父母的大小,然后限制子元素的大小,然后再显示子元素.

请参阅我实际正在做的事情中的JS函数refreshMaxWidthAndHeight(wrapper).

Cons of this approach:

  • 那里很乱
  • 每次事情发生变化(任何折叠/展开、内容变化、视区大小变化等)时都必须触发它
    • 很难详尽地涵盖所有情况,最安全的可能是使用定期setInterval并不断进行判断
  • 如果子内容很大/很重,hide->measure->show方法的性能不是很好,会导致可见flicker

JSFiddle演示示例

JSFiddle demo尽管这个演示是我的情况的简化版本,但我故意留下了一些额外的设计切片层来演示:

  • 为什么不可能有hardcoded个尺寸限制
  • 折叠/展开页面某些部分的动态

演示的NOTE个当前行为正是我试图实现的行为

编辑:

这里是Broken behaviour JSFiddle,它展示了不希望的行为,它基本上与上面的JSFiddle相同,但JS变通方法改变了max-widthmax-height被排除在外.

请注意,当显示大表格时,整个布局如何中断.

问题s

  • 除了使用max-width/max-height之外,还有其他方法吗?
  • 是否有可能避免在每个相关内容更改时使用JS调整CSS?
  • 有关于其他开发人员如何处理类似布局情况的指针或搜索词吗?
    • 我正在思考背景/要求部分中的最后一点,其中我描述了自上而下与自下而上的交汇点

推荐答案

归根结底,无论容器的内容如何,都要保持容器的尺寸吗? 毕竟,正如你所说,你的整体布局是自上而下确定的.因此,如果内部布局中的某些内容发生变化,您不应该重新计算任何内容,因此您也不应该限制内部内容的宽度或高度.让它溢出即可:

outer layout <-> layout boundary <-> inner layout

https://jsfiddle.net/conv1eau/会重现您的问题还是太简单了?

Javascript相关问答推荐

如何修复内容安全策略指令脚本-SRC自身错误?

在分区内迭代分区

如何在使用fast-xml-parser构建ML时包括属性值?

Chart.js V4切换图表中的每个条,同时每个条下有不同的标签.怎么做?

togglePopover()不打开但不关闭原生HTML popover'

JQuery. show()工作,但. hide()不工作

TypeScript索引签名模板限制

jQuery s data()[storage object]在vanilla JavaScript中?'

更改JSON中使用AJAX返回的图像的路径

基于props 类型的不同props ,根据来自接口的值扩展类型

根据一个条件,如何从处理过的数组中移除一项并将其移动到另一个数组?

将数组扩展到对象中

如何在和IF语句中使用||和&;&;?

在D3条形图中对具有相同X值的多条记录进行分组

在Java脚本中录制视频后看不到曲目

如何在脚本编译后直接将RxJ模块导入浏览器(无需Angel、webpack、LiteServer)

如果NetSuite中为空,则限制筛选

ReactJS在类组件中更新上下文

通过ng-绑定-html使用插入的HTML中的函数

JS/css:将数字输入的S函数和可调整大小的元素S函数绑定在一起