处理百分比大小框的循环依赖性 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 有一些与百分比高度相关的特殊行为。
相关问题获取更多详情:
首先,这是
我一句话的目标是,在一个盒子里放一个 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
.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>
在 .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 有一些与百分比高度相关的特殊行为。
相关问题获取更多详情: