【问题标题】:Maintain aspect ratio of a div with dynamic height保持具有动态高度的 div 的纵横比
【发布时间】:2018-05-24 17:01:49
【问题描述】:

我想通过纯 CSS 创建一个方形 div,height 是动态的,width 将基于 height 进行缩放。

正如我们在下面的片段中看到的,container 高度是基于其内容的动态。 红色square 占据container 的全高,宽度应等于height
我知道我们可以maintain aspect ratio of a div base on its width 但当height动态时我找不到方法。

任何帮助,将不胜感激!非常感谢!

请注意:高度是动态的,因此the solution with vh 不起作用,并且片段只是一个游乐场。

#container {
  width: 400px;
  padding: 20px;
  border: solid 1px black;
  position: relative; 
}

.square {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0; 
  background-color: red;
  
  width: 100px /*Hmm its just a dummy value*/
}
<div id="container">
  <div class="content">
    I'm a dynamic content
  </div>
  <div class="square"></div>
</div>

【问题讨论】:

  • 可以使用css的calc函数。 w3schools.com/cssref/func_calc.asp
  • @LucasRosenberger:我知道calc(),但我如何使用它来计算基于高度的宽度?
  • 抱歉误解了您的问题。我认为你需要为这个用例使用 js。
  • @LucasRosenberger:是的,谢谢!由于性能原因,我只是在寻找一个纯 css 解决方案。

标签: html css


【解决方案1】:

给你。

注意我在content div中添加了contenteditable,这样你就可以输入sn -p来添加几行文字看看效果。当然,这在您的版本中不是必需的。

#container {
  width: 400px;
  padding: 20px;
  border: solid 1px black;
  position: relative; 
}

.square {
  position: absolute; z-index:-1;
  left:0;
  top: 0;
  right: 0;
  bottom: 0; 
  background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsIAAA7CARUoSoAAAAANSURBVBhXY/jPwPAfAAUAAf+mXJtdAAAAAElFTkSuQmCC');
  background-size:contain; background-position:100% 0;
  background-repeat:no-repeat;
}
<div id="container">
  <div class="content" contenteditable="true">
    I'm a dynamic content
  </div>
  <div class="square"></div>
</div>

诀窍在于背景现在是一个红色正方形(它是一个 1×1 图像),其大小为 contain。恐怕background-color 不可能做到这一点。

【讨论】:

  • @VXp 是的,但从我收集到的问题中,我认为 OP 只需要一个红色方块,句号。如果 OP 有其他需求,他们应该提及;那我看看我能做什么。
  • 好吧,公平地说,OP 明确表示他 wanted to create a square div,不过是个不错的技巧
  • @MrLister:这是一个非常聪明的答案。但这不是我想要的。我的主要目的是保持 div 基于其高度的纵横比。不错的技巧,但它并没有解决主要问题。无论如何,谢谢!
【解决方案2】:

这是另一种解决方案:

我们可以在主 .square div 中创建一个内部 div 继承其父级高度。

然后,如果我们旋转那个内部 div,它的高度现在变成了它的宽度。所以此时我们要做的就是隐藏父 div 的溢出,并应用一些平移,使其在正确的位置结束。

#container {
  width: 400px;
  padding: 20px;
  border: solid 1px black;
  position: relative;
}

.square {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  overflow: hidden;
  pointer-events: none;
}

.square>div {
  background-color: red;
  transform: rotate(-90deg) translate(100%, 0%);
  width: 100vw;
  height: 100%;
  transform-origin: 100% 100%;
}
<div id="container">
  <div class="content">
    <textarea> I'm a dynamic content</textarea>
  </div>
  <div class="square">
    <div></div>
  </div>
</div>

【讨论】:

  • 整洁。但在 Firefox 中,红色方块的右侧有一条白线。
  • @MrLister 啊?我在 FF (58.b) 上做到了,但没有注意到。您的缩放级别为 100%?
  • 是的,在不同版本上进行了测试。在 Chrome 中没问题。
  • @MrLister 太奇怪了,我也在稳定分支上进行了测试,并且在 Nightly 上以不同的缩放级别进行了测试,并且无法重现此问题...(在非视网膜 osX 上运行)那将是我猜是FF中的一个错误。你可以尝试不使用 textarea 吗?
  • 不错的解决方案。我在 Chrome 和 FF 中对其进行了测试。它工作正常。等几个小时,如果没有人有更好的解决方案,我会接受你的回答。谢谢!
猜你喜欢
  • 2014-12-13
  • 2012-06-02
  • 2014-07-10
  • 2015-06-13
  • 2015-12-02
  • 2013-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多