处理百分比大小框的循环依赖性 css(具体如何获得 max-height)

Dealing with cyclic dependencies of percentage sized boxes css (specifically how to get a max-height)

首先,这是 的后续问题,我误解了我的问题,我不得不完全重写它,所以我开始一个新的问题,希望没问题。

我一句话的目标是,在一个盒子里放一个 overflow: auto,它的高度由它的内容决定,但它的 max-height 由它的 parent 决定。静态表示为:

#ctlsmall {
  height: 50px;
}

#ctlbig {
  height: 210px;
}

#contentsmall {
  height: 50px;
}

#contentbig {
  height: 350px;
}

.content {
  background-image: linear-gradient(30deg, #005500 0%, #9922ee 100%);
  width: 120px;
}

.overflowctl {
  overflow-y: auto;
  overflow-x: hidden;
}

.frame {
  height: auto;
  max-height: calc( 100% - 40px );
  width: 120px;
  border-radius: 15px;
  padding: 20px;
  background: #221100;
}

.canvas {
  display: inline-block;
  height: 250px;
  width: 200px;
  margin-right: 50px;
  background: #ddccaa;
  vertical-align: top;
}
<div class='canvas'>
  <div class='frame'>
    <div id='ctlbig' class='overflowctl'>
      <div id='contentbig' class='content'>
      </div>
    </div>
  </div>
</div>

<div class='canvas'>
  <div class='frame'>
    <div id='ctlsmall' class='overflowctl'>
      <div id='contentsmall' class='content'>
      </div>
    </div>
  </div>
</div>

当我不想为我的 .overflowctl 使用固定高度时,问题就开始了,因为 .content.canvas 都有未知的尺寸。 (.content 实际上是一个 iframe,而 .canvas 取决于 window 大小)。我天真的方法是只对 .overflowctl.frame 使用 height: auto,因为通常高度应该由它们的内容决定,同时基于百分比 max-height,因为他们的 max-height 是由 parent 设置的。这在对那些属性的自然理解中是合乎逻辑的,但似乎它不起作用,因为在 css 之间的组合 parent-child 组合,其中 parent 大小依赖于 child 反之亦然是有问题的,在解决这个问题时,max-properties 似乎发生了变化......描述了 here and @onkar-ruikar who showed this to me as an answer to gave some explanation for it. I prepared a jsfiddle 以说明问题,并使用上面的改编示例:

.overflowctl {
  height: auto;
  max-height: 100%;
}

#contentsmall {
  height: 50px;
}

#contentbig {
  height: 350px;
}

.content {
  background-image: linear-gradient(30deg, #005500 0%, #9922ee 100%);
  width: 120px;
}

.overflowctl {
  overflow-y: auto;
  overflow-x: hidden;
}

.frame {
  height: auto;
  max-height: calc( 100% - 40px );
  width: 120px;
  border-radius: 15px;
  padding: 20px;
  background: #221100;
}

.canvas {
  display: inline-block;
  height: 250px;
  width: 200px;
  margin-right: 50px;
  background: #ddccaa;
  vertical-align: top;
}
<div class='canvas'>
  <div class='frame'>
    <div id='ctlbig' class='overflowctl'>
      <div id='contentbig' class='content'>
      </div>
    </div>
  </div>
</div>

<div class='canvas'>
  <div class='frame'>
    <div id='ctlsmall' class='overflowctl'>
      <div id='contentsmall' class='content'>
      </div>
    </div>
  </div>
</div>

中,我以某种方式得到了一个示例,其中 height 和 max-height 的工作方式不同,但我认为以上内容更好地说明了我真正想要的,问题归结为同一件事。丑陋的解决方案是摆脱 .overflowctl,但是我的 .frame(实际上颜色更好......^^)不再适用于填充和滚动条和 border-radius 的组合。无论如何,我会在最后添加它,只是为了展示它。如果有任何提示可以实现我的目标,我会很高兴! :)

#contentsmall {
  height: 50px;
}

#contentbig {
  height: 350px;
}

.content {
  background-image: linear-gradient(30deg, #005500 0%, #9922ee 100%);
  width: 120px;
}

.frame {
  overflow-y: auto;
  overflow-x: hidden;
}

.frame {
  height: auto;
  max-height: calc( 100% - 40px );
  width: 120px;
  border-radius: 15px;
  padding: 20px;
  background: #221100;
}

.canvas {
  display: inline-block;
  height: 250px;
  width: 200px;
  margin-right: 50px;
  background: #ddccaa;
  vertical-align: top;
}
<div class='canvas'>
  <div class='frame'>
    <div id='contentbig' class='content'>
    </div>
  </div>
</div>

<div class='canvas'>
  <div class='frame'>
    <div id='contentsmall' class='content'>
    </div>
  </div>
</div>

只需添加这个

.frame {
  display:grid;
  grid-template-rows:1fr;
}

这将为您的百分比身高提供参考。

完整代码

.overflowctl {
  height: auto;
  max-height: 100%;
}

#contentsmall {
  height: 50px;
}

#contentbig {
  height: 350px;
}

.content {
  background-image: linear-gradient(30deg, #005500 0%, #9922ee 100%);
  width: 120px;
}

.overflowctl {
  overflow-y: auto;
  overflow-x: hidden;
}

.frame {
  height: auto;
  max-height: calc( 100% - 40px );
  width: 120px;
  border-radius: 15px;
  padding: 20px;
  background: #221100;
  display:grid;
  grid-template-rows:1fr;
}

.canvas {
  display: inline-block;
  height: 250px;
  width: 200px;
  margin-right: 50px;
  background: #ddccaa;
  vertical-align: top;
}
<div class='canvas'>
  <div class='frame'>
    <div id='ctlbig' class='overflowctl'>
      <div id='contentbig' class='content'>
      </div>
    </div>
  </div>
</div>

<div class='canvas'>
  <div class='frame'>
    <div id='ctlsmall' class='overflowctl'>
      <div id='contentsmall' class='content'>
      </div>
    </div>
  </div>
</div>

CSS grid 和 Flexbox 有一些与百分比高度相关的特殊行为。

相关问题获取更多详情: