Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html CSS:使div宽度与高度成比例_Html_Css_Scale - Fatal编程技术网

Html CSS:使div宽度与高度成比例

Html CSS:使div宽度与高度成比例,html,css,scale,Html,Css,Scale,这有点难解释,但是:我想要一个响应性的height div(height:100%),它将缩放宽度,使其与高度成比例(反之亦然) 我知道使用填充顶部使高度与宽度成比例,但我需要它以另一种方式工作。话虽如此,我并不十分热衷于这种方法对内容绝对定位元素的额外要求,因此我意识到我可能在这里要求的是一根棍子上的月亮 为了帮助可视化,以下是一幅图像: …这里有一个例子,说明了几乎相同的事情 值得注意的是,我已经在使用:before和:after伪元素来垂直对齐要按比例缩放的框的内容 我真的,真的很喜欢不

这有点难解释,但是:我想要一个响应性的height div(
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;
}