Html CSS:使div宽度与高度成比例
这有点难解释,但是:我想要一个响应性的height div(Html CSS:使div宽度与高度成比例,html,css,scale,Html,Css,Scale,这有点难解释,但是:我想要一个响应性的height div(height:100%),它将缩放宽度,使其与高度成比例(反之亦然) 我知道使用填充顶部使高度与宽度成比例,但我需要它以另一种方式工作。话虽如此,我并不十分热衷于这种方法对内容绝对定位元素的额外要求,因此我意识到我可能在这里要求的是一根棍子上的月亮 为了帮助可视化,以下是一幅图像: …这里有一个例子,说明了几乎相同的事情 值得注意的是,我已经在使用:before和:after伪元素来垂直对齐要按比例缩放的框的内容 我真的,真的很喜欢不
height:100%
),它将缩放宽度,使其与高度成比例(反之亦然)
我知道使用填充顶部
使高度与宽度成比例,但我需要它以另一种方式工作。话虽如此,我并不十分热衷于这种方法对内容绝对定位元素的额外要求,因此我意识到我可能在这里要求的是一根棍子上的月亮
为了帮助可视化,以下是一幅图像:
…这里有一个例子,说明了几乎相同的事情
值得注意的是,我已经在使用:before
和:after
伪元素来垂直对齐要按比例缩放的框的内容
我真的,真的很喜欢不必回到jQuery,因为这将是一个调整大小处理程序的内在要求,通常需要进行更多的调试。。。但如果这是我唯一的选择,那么菲亚特。哦,你可能会使用“填充顶部”的技巧 或:
CSS中的垂直填充与元素的宽度有关,而与高度无关。我一直在想一个纯CSS解决方案来解决这个问题。我最终提出了一个使用ems的解决方案,该解决方案可以通过vws逐步增强: 有关完整的工作演示和说明,请参见代码笔链接: 简化版:
.parent {
font-size: 250px; // height of container
height: 1em;
}
.child {
height: 100%;
width: 1em; // 100% of height
}
根据@kunkalabs的答案(这真的很聪明),我想出了一个解决方案,让你保留继承下来的字体大小 HTML:
因此,基本上,
#content
的字体大小是矩形的(100/$rectFontSize)*100%。如果您需要矩形的确定像素大小,您可以设置#rect
的父级字体大小…否则只需调整字体大小,直到它达到您想要的位置(并在过程中激怒您的设计师) 使父DIV的行为类似于表格单元格,并垂直对齐子元素。不需要做任何填充技巧
HTML
字体解决方案要求已知高度。我找到了一个解决方案,可以使一个元素在一个宽度和高度未知的父div中成比例 我使用的技巧是将图像用作间隔。守则解释如下:
<div class="heightLimit">
<img width="2048" height="2048" class="spacer"
src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAA
P///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7">
<div class="filler">
<div class="proportional">
</div>
</div>
</div>
此元素用于限制高度,但可水平扩展(width:auto
),但不能超出父级(max width
)。溢出需要隐藏,因为一些子项会突出到div之外
.spacer {
width: auto;
max-height: 100%;
visibility: hidden;
}
此图像不可见,并与高度成比例缩放,同时调整宽度并强制调整父对象的宽度
.filler {
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
}
此元素需要用绝对定位的容器填充空间
.proportional {
position: relative;
width: 100%;
height: 0;
padding-bottom: 100%;
}
在这里,我们的比例元素得到了一个与宽度成比例的高度,这是我们熟悉的填充底部技巧
不幸的是,Chrome和IE中存在一个bug,因此如果您使用Javascript修改父元素(如在我的演示中),那么维度将不会更新。有一种方法可以解决这个问题,如我的演示所示。您可以使用视图高度(vh)作为宽度的单位
下面是一个您要求的20px保证金的示例
.parent {
margin : 20px;
}
.child {
width: calc(100vh - 40px);
height : calc(100vh - 40px);
margin:0 auto;
background: red;
box-sizing:border-box;
padding:10px;
}
看小提琴:
您可以通过使用SVG实现这一点 这取决于具体情况,但在某些情况下,它确实是有用的。例如,您可以在不设置固定高度的情况下设置
背景图像
,或者使用它以16:9
和位置:绝对
的比例嵌入
对于3:2
比率设置viewBox=“0 0 3 2”
等
例如:
div{宽度:35%;背景色:红色}
svg{宽度:100%;显示:块;可见性:隐藏}
恐怕您必须使用javascript来实现这一点……除了使用填充
或边距
之外,没有其他方法了。无论如何,我们必须找到宽度和高度之间的某种关系,以便我们可以相应地设置高度,但是通常宽度
仅与父级的宽度
相关,高度
仅与父级的高度
相关,关于边距
和边距
只有一点特别之处,即它们的百分比值(相对值)基于父级的宽度
,无论您设置边距顶部
、边距底部
或边距顶部
、边距底部
,我们都有一个解决方案(仅?)第一个是不适用的,因为div
可能包含一些内容,除非我们用绝对定位稍微调整一下…,当然,如果我们只需要一个空的正方形div就可以了。是的,我知道这个;不幸的是,这种设计的规格是宽度必须与高度成比例设置,而不是相反。看起来我很可能会求助于jQuery。在这里使用font size
似乎真的是一个丑陋且可能不方便的黑客行为。超晚接受!我完全忘了我问过这个问题,然后我在谷歌上搜索同样的东西,我的问题是第一个。事实证明,这正是我想要的(对内联比例进行了一点调整——根据图像大小比计算)。谢谢你的提示!我们不能有固定高度的箱子呢…:(您需要知道高度。它不需要在px中设置,但是,您可以使用任何尺寸单位(rem
,vh
,vw
,等等)。如果高度根据视口大小而变化,则还可以通过断点更改高度值。垂直居中的内容不是问题所在,而是使
.parent { width:300px; height:300px; display:table-cell; vertical-align:middle; }
<div class="heightLimit">
<img width="2048" height="2048" class="spacer"
src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAA
P///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7">
<div class="filler">
<div class="proportional">
</div>
</div>
</div>
.heightLimit {
position: absolute;
top: 0;
left: 0;
height: 100%;
width: auto;
max-width: 100%;
overflow: hidden;
}
.spacer {
width: auto;
max-height: 100%;
visibility: hidden;
}
.filler {
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
}
.proportional {
position: relative;
width: 100%;
height: 0;
padding-bottom: 100%;
}
.parent {
margin : 20px;
}
.child {
width: calc(100vh - 40px);
height : calc(100vh - 40px);
margin:0 auto;
background: red;
box-sizing:border-box;
padding:10px;
}