根据高度保持div纵横比

Fij*_*jit 26 css aspect-ratio css3 responsive-design

我需要将元素的宽度保持为其高度的百分比.因此,随着高度的变化,宽度会更新.

相反的情况可以通过使用填充顶部的%值来实现,但填充左边的百分比将是对象宽度的百分比,而不是其高度.

所以使用这样的标记:

<div class="box">
  <div class="inner"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

我想用这样的东西:

.box {
    position: absolute;
    margin-top: 50%;
    bottom: 0;
}
.inner {
    padding-left: 200%;
}
Run Code Online (Sandbox Code Playgroud)

确保根据箱子的高度保持箱子的纵横比.高度是流动的,因为它的边距百分比 - 随着窗户高度的变化,盒子的高度也会变高.

我知道如何用JavaScript实现这一点,只是想知道是否有一个干净的CSS解决方案?

Sal*_*n A 26

您可以使用具有所需比例的图像来帮助进行比例尺寸调整(可以通过将一个尺寸设置为某个值而将其他尺寸设置为自动来按比例缩放图像).图像不一定是可见的,但它必须占据空间.

.box {
  position: absolute;
  bottom: 0;
  left: 0;
  height: 50%;
}
.size-helper {
  display: block;
  width: auto;
  height: 100%;
}
.inner {
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  background: rgba(255, 255, 153, .8);
}
Run Code Online (Sandbox Code Playgroud)
<div class="box">
  <img class="size-helper" src="//dummyimage.com/200x100/999/000" width="200" height="100">
  <div class="inner">
    1. box has fluid height<br>
    2. img has 2:1 aspect ratio, 100% height, auto width, static position<br>
    2.1 it thus maintains width = 200% of height<br>
    2.2 it defines the dimensions of the box<br>
    3. inner expands as much as box
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,box,inner和helper都是相同的大小.

  • 一个可以用`<canvas width ="1"height ="1"> </ canvas>`或任何尺寸替换img元素 (2认同)

web*_*iki 17

您可以将vh单位用于元素的高度和宽度,以便它们都根据视口高度进行更改.

vh 视口高度的1/100.(MDN)

DEMO

.box {
    position: absolute;
    height:50vh;
    width:100vh;
    bottom: 0;
    background:teal;
}
Run Code Online (Sandbox Code Playgroud)
<div class="box"></div>
Run Code Online (Sandbox Code Playgroud)

  • 我不确定这是否能回答问题。OP明确声明“保持元素的宽度占其高度的百分比”,而不是视口的高度。 (2认同)

Dan*_*iel 10

还有另一种更有效的方法可以根据高度实现恒定的纵横比。

您可以放置​​一个空的 svg,这样就不必加载外部图像。

HTML 代码:

    <svg xmlns="http://www.w3.org/2000/svg"
      height="100"
      width="200"
      class='placeholder-svg'
    />
Run Code Online (Sandbox Code Playgroud)

CSS代码:

.placeholder-svg {
  width: auto;
  height: 100%;
}
Run Code Online (Sandbox Code Playgroud)

更改宽度/高度以获得所需的纵横比。

请记住,svg 可能会溢出。

http://www.w3.org/2000/svg只是一个命名空间。它不加载任何东西。

如果您将placeholder-svg班级更改为:

.placeholder-svg {
  width: 100%;
  height: auto;
}
Run Code Online (Sandbox Code Playgroud)

然后根据宽度调整高度。

演示 1根据高度和 2:1 宽高比调整宽度。

演示 2与上面相同,但您可以轻松调整大小(使用 React)


tzi*_*tzi 5

你写的CSS技巧很好地保持了比例width/ height元素.它基于padding属性,当其值以百分比表示时,与父宽度成比例,即使对于padding-toppadding-bottom.

没有CSS属性可以设置与父高度成比例的水平大小.所以我认为没有干净的CSS解决方案.


Man*_*era 5

截至 2021 年,有一个名为 的属性aspect-ratio大多数浏览器都支持

div {
    border: 1px solid;
    margin: 8px;
}

.box {
    width: 100px;
    min-height: 100px;
    resize: horizontal;
    overflow: auto;
}

.inner1 {
    aspect-ratio: 1/1;
}

.inner2 {
    aspect-ratio: 3/1;
}
Run Code Online (Sandbox Code Playgroud)
<div class="box">
  <div class="inner1"></div>
  <div class="inner2"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

运行此代码片段并手动调整外部 div 的大小以查看内部 div 的行为