html - css网格每个元素的高度相等,保持响应能力

标签 html css css-grid responsive

我有网格,每个元素下面都有一个图像和其他 div。因为它是一个网格,所以每个元素都有响应宽度,因此它会随着屏幕缩小而自动缩放。我希望元素的图像(可以具有不同的尺寸并且不是同质的)具有相同的高度,同时保持这种响应功能。如果我设置特定高度,随着屏幕缩小,宽高比将不会保持。基本上我需要 YouTube 风格的响应能力,这是一个完美的例子。我该怎么做?

这是我的网格:

JSX:

<div className="home-container">
  {elements.map((el) => (
    <Element el={el}></Element >
  ))}
</div>

CSS:

.home-container {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 20px;
  margin-left: 250px;
  grid-auto-rows: 1fr;
  grid-row-gap: 30px;
}

这是我的元素卡:

JSX:

<div className="element-container">
   <div className="element-img">
      <img src={imageUrl} alt={title} />
   </div>
   <div>...</div>
   <div>...</div>
</div>

CSS:

.element-container {
  display: flex;
  flex-direction: column;
  box-sizing: border-box;
  height: fit-content;
  border-radius: 10px;
  overflow: hidden;
}

.element-img {
  display: flex;
  margin-bottom: 20px;
}

.element-img > img {
  width: 100%;
  height: 100%;
  border-radius: 20px;
  object-fit: cover;
}

问题: 正如您所看到的,当网格未缩小时,盘子问题是可以的,但随后它不会保持与其他元素相同的纵横比。

enter image description here

最佳答案

概念

  1. 在图像周围创建一个包装器以保持纵横比。使用position: relative;并设置 padding-top定义纵横比。

  2. 对于图像,设置 position:absolute;将其放置在 wrapper 内。使用object-fit: cover;在覆盖整个容器的同时保持纵横比。设置width:100%;height:100%;填充容器。


解决方案

.home-container {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 20px;
  margin-left: 250px;
  grid-auto-rows: 1fr;
  grid-row-gap: 30px;
}

.element-container {
  display: flex;
  flex-direction: column;
  box-sizing: border-box;
  min-height: 250px;
  border-radius: 10px;
  overflow: hidden;
}

.element-img {
  position: relative;
  width: 100%;
  padding-top: 56.25%; /* 16:9 */
  margin-bottom: 20px;
}

.element-img > img {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  border-radius: 20px;
}

padding-top.element-img是维持纵横比的因素。当您设置padding-top时您实际上是在创建一个具有指定纵横比的隐形框。 padding-top计算为元素宽度的百分比,因此无论元素的实际宽度如何,它都会保持纵横比,这就是它的响应能力。


纵横比

  • 宽屏:16:9 = 56.25%
  • 标准:4:3 = 75%
  • 平方:1:1 = 100%
  • 摄影:3:2 = 66.66%
  • 超宽:21:9 = 42.85%

您可以使用以下公式计算纵横比:

Padding Percentage = (Height / Width) * 100

16:9 示例:

56.25 = (9/16) * 100

或者您可以使用您认为最有效的任何百分比:)


示例

.grid-container {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 20px;
  padding: 20px;
}

.grid-item {
  background-color: #f0f0f0;
  border: 1px solid #ddd;
  padding: 10px;
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}

.aspect-ratio-16-9 {
  position: relative;
  width: 100%;
  padding-top: 56.25%;
}

.aspect-ratio-16-9 img {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
<div class="grid-container">
  <div class="grid-item">
    <div class="aspect-ratio-16-9">
      <img src="https://via.placeholder.com/300x169" alt="300x169 Image">
    </div>
  </div>
  <div class="grid-item">
    <div class="aspect-ratio-16-9">
      <img src="https://via.placeholder.com/400x225" alt="400x225 Image">
    </div>
  </div>
  <div class="grid-item">
    <div class="aspect-ratio-16-9">
      <img src="https://via.placeholder.com/500x281" alt="500x281 Image">
    </div>
  </div>
  <div class="grid-item">
    <div class="aspect-ratio-16-9">
      <img src="https://via.placeholder.com/600x338" alt="600x338 Image">
    </div>
  </div>
  <div class="grid-item">
    <div class="aspect-ratio-16-9">
      <img src="https://via.placeholder.com/700x394" alt="700x394 Image">
    </div>
  </div>
  <div class="grid-item">
    <div class="aspect-ratio-16-9">
      <img src="https://via.placeholder.com/800x450" alt="800x450 Image">
    </div>
  </div>
  <div class="grid-item">
    <div class="aspect-ratio-16-9">
      <img src="https://via.placeholder.com/900x506" alt="900x506 Image">
    </div>
  </div>
  <div class="grid-item">
    <div class="aspect-ratio-16-9">
      <img src="https://via.placeholder.com/1000x563" alt="1000x563 Image">
    </div>
  </div>
</div>


资源

下面我提供了一些相关资源,这些资源可能对 future 用户了解其工作原理和原理以及减少实现和调整方面的问题有用。

关于html - css网格每个元素的高度相等,保持响应能力,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77668155/

相关文章:

html - 使用 CSS 根据屏幕大小制作一个 HTML 表格的元素是方形的?

css - 显示 :none vs visibility:hidden vs text-indent:9999 How screen reader behave with each one?

jquery - 如何缩小包含文本的div?

java - 如何编辑文件中的一行?在Java上

javascript - 在 Bootstrap 中只滚动一列

javascript - 如何从 view1 访问对象/var,但在 Backbone js 的 view2 中实例化?

javascript - 如何停止用鼠标滚动时相对放置的元素的抖动?

css - 使用 css-grids 开发以及......奇怪的事情发生了

css - 固定的网格自动流列数 : column

html - 在不使用 css 背景图像的情况下,在保持宽高比的同时获取图像以覆盖 div