【问题标题】:Aspect ratio 16/9 of child div always to fit parent div in CSS, not working on small height子 div 的纵横比 16/9 始终适合 CSS 中的父 div,不适用于小高度
【发布时间】:2021-09-20 07:12:24
【问题描述】:

我正在尝试向图像添加面部叠加层,我希望面部始终位于内部 div 中。

图像需要适合 16/9 比例的背景并始终适合外部容器,我在外部 div 的高度大于 16/9 比例的情况下工作,但是每当它低于 16/9 时砍掉头部的底部和顶部。

我需要这个才能与 IOS 一起使用,因此纵横比在 safari 上不起作用,因此我在 16/9 使用旧的 padding-top 技巧。

谁能帮帮我?

我想要的是这样的……

但我得到的是这个......

.outside {
  position: relative;
  width: 500px;
  height: 200px;
  background: red;
    overflow: hidden;
}

.inside {
  height: 0;
  overflow: hidden;
  position: relative;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  padding-top: 56.25%;
  background: blue;
}

.img {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  object-fit: contain;
}
<h1>Works when height is bigger</h1>

  <div class="outside" style="height:400px!important">
  <div class="inside" style="padding-top: 56.25%;">
    <img src="https://solvemoji-test.s3.eu-west-2.amazonaws.com/unnamed.jpg" class="img">
  </div>
</div>

<h1>Does not work when height is smaller</h1>

<div class="outside">
  <div class="inside" style="padding-top: 56.25%;">
    <img src="https://solvemoji-test.s3.eu-west-2.amazonaws.com/unnamed.jpg" class="img">
  </div>
</div>

【问题讨论】:

  • 请您在sn-p系统中添加图像以使您的sn-p工作谢谢(可能使用代理不起作用)?)
  • 我不太清楚你的意思,问题中有图片,你看不到吗?
  • 我看不到任何东西 - 可能与代理有关?
  • 啊,对不起,我现在看到了这个问题,我刚刚使用了一张来自谷歌的图片,我已经更新了,现在应该可以使用了。
  • 您能否描述一下当纵横比不“适合”时您想要发生的事情 - 显然您希望头部完全适合,但您是否总是想要一些红色和/还是蓝色显示?和/或您是否希望两个示例中的白色宽度相同,但要缩小头部以完全适合第二个示例?

标签: html css aspect-ratio


【解决方案1】:

假设您知道外部元素的高度(正如您在问题中所做的那样),您可以使用 CSS min 函数来决定内部元素的宽度和高度应该是多少,以确保它具有 16/9 的比例。

这个 sn-p 删除 img 元素并将其替换为内部元素的背景图像。 outer 的高度作为 CSS 变量而不是作为高度设置传递,以便可以对其进行计算。

结果是:

.outside {
  position: relative;
  width: 500px;
  height: calc(var(--h) * 1px);
  background: red;
  overflow: hidden;
}

.inside {
  height: 0;
  position: relative;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  padding-bottom: 56.25%;
  background-color: blue;
  --minw: calc(var(--h) * 16px / 9);
  width: min(100%, var(--minw));
  background-image: url(https://solvemoji-test.s3.eu-west-2.amazonaws.com/unnamed.jpg);
  background-size: auto min(100%, calc(var(--h) * 1px));
  background-position: center;
  background-repeat: no-repeat no-repeat;
}
<h1>Height is bigger</h1>

  <div class="outside" style="--h: 400">
  <div class="inside">
  </div>
</div>

<h1>Height is smaller</h1>

<div class="outside" style="--h: 200;">
  <div class="inside">
  </div>
</div>

请注意,如果事先不知道外部的高度,那么我认为您将不得不求助于 JS 在运行时设置 --h。

【讨论】:

  • 非常感谢,这似乎正是我所追求的,传奇!
【解决方案2】:

例如,您可能不需要绝对定位的 div 内的绝对定位图像

.outside {
  position: relative;
  width: 500px;
  height: 200px;
  background: red;
}

.inside {
  position: absolute;
  top: 0;
  right: 72px;
  bottom: 0;
  left: 72px;
  display: flex;
  justify-content: center;
  background: blue;
}

.img {
  max-height: 100%;
  object-fit: contain;
}
<div class="outside">
  <div class="inside">
    <img class="img" src="https://solvemoji-test.s3.eu-west-2.amazonaws.com/unnamed.jpg" />
  </div>
</div>

【讨论】:

  • 这适用于当父级宽于 16/9 比率但如果您查看我原来的 sn-p 我需要蓝色内部始终为 16/9 比率。因此,如果您将其更改为外部的 4/3,内部仍然不是 16/9,实际上在这种情况下您根本看不到任何蓝色
  • 我有点迷路了。如果外部的纵横比较小,蓝色的内部怎么能有 16/9 的纵横比? (与它的编码方式无关,而与情况的基本几何形状有关)。
猜你喜欢
  • 1970-01-01
  • 2018-10-21
  • 2016-01-22
  • 2010-11-09
  • 1970-01-01
  • 2017-03-19
  • 2019-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多