我有网格,每个元素都有一个图像和下面的其他div.因为它是一个网格,所以每个元素都有响应的宽度,因此它会随着屏幕的缩小而自动zoom .我希望元素的图像(可以有不同的大小,不是同质的)有相同的高度,同时保持这种响应性的功能.如果我设置了一个特定的高度,当屏幕缩小时,纵横比不会保持.基本上,我需要一种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;以将其定位在包装中.使用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;
}

.element-img中的padding-top是保持纵横比的因素.当您设置padding-top时,您实际上是在创建一个具有指定纵横比的不可见长方体.padding-top是以元素宽度的百分比计算的,因此它保持纵横比,而不考虑元素的实际宽度,这是使其具有响应性的原因.


纵横比

  • 宽屏:16:9=56.25%
  • 默认:4:3=75%
  • 正方形:1:1=100%
  • 摄影:3:2=66.66%
  • 超大:21:9=42.85%

You can calculate the aspect ratio using the following formula:

填充百分比=(高度/宽度)*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相关问答推荐

Blazor中有1像素高行的表格

CSS动画积分计数器

R中的动态Webscraping

如何在Vim中删除Html标签?

在 Select 前后更改选项卡的背景

如何收集<;p&>元素下的<;p>;子元素

窗口视图之外的下拉菜单位置

背景可点击,而不是文本

使用Cypress循环遍历不一致的父对象

穿过整个屏幕的旋转线

Css网格:两列,除非小于150px

Html视频标签:圆角像素化

水平行中按钮的垂直偏移

如何将多个类名组合到CSS中的一个关键帧

如何使用jQuery将我制作的通用头部和底部加载到多个HTML文件中?

防止HTML输入中出现负数但接受小数

如何消除线性渐变线的模糊?

单击按钮时更改字体真棒图标

如何使用 :before 在 CSS 中为列表增加计数器

如何突出显示 .qmd html 文件中的特定代码行