【问题标题】:Gallery based on grid - overflow of content and images ratio issue基于网格的图库 - 内容和图像比例溢出问题
【发布时间】:2021-04-05 08:40:41
【问题描述】:

我正在通过构建一个简单的图库应用来锻炼我的 Web 开发技能。不幸的是,CSS 成了最大的问题。

html, body {
  height: 100%;
  width: 100%;
  margin: 0;
  padding: 0;
}

* {
  box-sizing: border-box;
}

.main-container {
  height: 100%;
  width: 100%;
  margin: 0 10%;
  display: flex;
  flex-direction: column;
}

.searchbox {
  margin-bottom: 20px;
}

.gallery {
  height: 100%;
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-template-rows: repeat(5, 20%);
  gap: 20px;
  justify-items: center;
}

.image-container {
  display: flex;
  flex-direction: column;
  height: 100%;
}

img {
  display: block;
  flex: 9;
  min-height: 0;
}

.title {
  flex: 1;
}

.pagination {
  margin-top: 20px;
}
<div class="main-container">
  <div class="searchbox">SEARCHBOX</div>
  <div class="gallery">
    <div class="image-container">
      <img src="https://placekitten.com/200/300"/>
      <div class="title">TITLE</div>
    </div>
    <div class="image-container">
      <img src="https://placekitten.com/300/200"/>
      <div class="title">TITLE</div>
    </div>
    <div class="image-container">
      <img src="https://placekitten.com/200/200"/>
      <div class="title">TITLE</div>
    </div>
     <div class="image-container">
      <img src="https://placekitten.com/400/300"/>
      <div class="title">TITLE</div>
    </div>
      <div class="image-container">
      <img src="https://placekitten.com/200/300"/>
      <div class="title">TITLE</div>
    </div>
     <div class="image-container">
      <img src="https://placekitten.com/100/300"/>
      <div class="title">TITLE</div>
    </div>
    <div class="image-container">
      <img src="https://placekitten.com/100/100"/>
      <div class="title">TITLE</div>
    </div>
    <div class="image-container">
      <img src="https://placekitten.com/200/300"/>
      <div class="title">TITLE</div>
    </div>
    <div class="image-container">
      <img src="https://placekitten.com/200/200"/>
      <div class="title">TITLE</div>
    </div>
     <div class="image-container">
      <img src="https://placekitten.com/300/100"/>
      <div class="title">TITLE</div>
    </div>
    <div class="image-container">
      <img src="https://placekitten.com/200/300"/>
      <div class="title">TITLE</div>
    </div>
    <div class="image-container">
      <img src="https://placekitten.com/200/300"/>
      <div class="title">TITLE</div>
    </div>
    <div class="image-container">
      <img src="https://placekitten.com/200/300"/>
      <div class="title">TITLE</div>
    </div>
     <div class="image-container">
      <img src="https://placekitten.com/200/300"/>
      <div class="title">TITLE</div>
    </div>
      <div class="image-container">
      <img src="https://placekitten.com/200/300"/>
      <div class="title">TITLE</div>
    </div>
     <div class="image-container">
      <img src="https://placekitten.com/200/300"/>
      <div class="title">TITLE</div>
    </div>
    <div class="image-container">
      <img src="https://placekitten.com/200/300"/>
      <div class="title">TITLE</div>
    </div>
    <div class="image-container">
      <img src="https://placekitten.com/200/300"/>
      <div class="title">TITLE</div>
    </div>
    <div class="image-container">
      <img src="https://placekitten.com/200/300"/>
      <div class="title">TITLE</div>
    </div>
     <div class="image-container">
      <img src="https://placekitten.com/200/300"/>
      <div class="title">TITLE</div>
    </div>
  </div>
  <div class="pagination">PAGINATION</div>
</div>

我的画廊每页将有 20 张图片 (4x5)。图片可能有不同的尺寸 - 有些可能是水平的,有些可能是垂直的,有些可能是方形的。

我遇到的问题:

  1. 图像以不保持原始比例的方式缩放
  2. “应用程序”不只占用 100% 的高度 - 它需要更多,而且我需要滚动。理想情况下,应始终采取 100%
  3. “分页”DIV 落在网格内的某个位置。它应该放在网格下方。

我不得不承认我尝试了许多不同的方法来解决它,但是我得到了更奇怪的结果,或者根本没有解决问题。

我的 CSS 有什么问题?

【问题讨论】:

  • 最后我把grid扔了出去,用了flex。我不明白为什么grid 会像它那样溢出它的容器。 flex 实际上反应更快,所以我发现它更适合我的需要(我的行中可以有尽可能多的图像,只要我的水平尺寸允许)

标签: html css flexbox css-grid


【解决方案1】:

首先从你的 html、body 中取出高度和宽度——它直接影响你的图片尺寸

html, body {margin:0; padding:0;}

然后从主容器中删除边距,这会导致溢出。也许您打算使用填充?

.main-container {
  height: 100%;
  width: 100%;
  /*margin: 0 10%;*/ <--- Remove
  display: flex;
  flex-direction: column;
}

之后,您可以使用 object-fit 属性来对齐您的图像位置 :) 设置您的高度和宽度很重要!

img {
  display: block;
  flex: 9;
  min-height: 0;
  width:300px;
  max-height:300px;
  object-fit:cover;
}

我希望这会有所帮助! https://jsfiddle.net/1txLvoh6/

【讨论】:

  • 感谢您的意见。我在您的版本中发现了一些问题:该应用程序仍然需要滚动。理想情况下,所有图像都应缩放,以使整个页面适合视图;分页 DIV 仍在网格内。
  • 哦,我明白了,那么继续将height:100% 添加回 html、body css 并告诉我!
【解决方案2】:

我更喜欢这个变体:

html,
body {
    height: 100%;
    width: 100%;
    margin: 0;
    padding: 0;
}

* {
    box-sizing: border-box;
}

.main-container {
    width: 80%;
    margin: 0 10%;
    display: grid;
    grid-gap: 20px;
    grid-template-rows: 1em max-content 1em;
    grid-template-columns: 1fr;
}

.searchbox {
    /* your styles for searchbox */
}

.gallery {
    display: grid;
    /* columns can be equal too, using calc and without justification on center */
    grid-template-columns: repeat(4, 1fr);
    /* 4 gaps between rows + 2 gaps above and below of gallery + search and pager heights */
    grid-template-rows: repeat(5, calc(20vh - 2em));
    grid-gap: 20px;
    justify-items: center;
}

.image-container {
    display: flex;
    flex-direction: column;
    height: 100%;
}

img {
    display: block;
    flex: 9;
    min-height: 0;
    object-fit: cover;
}

.title {
    flex: 1;
}

.pagination {
    /* your styles for pagination */
}

【讨论】:

    猜你喜欢
    • 2021-05-20
    • 2018-06-26
    • 1970-01-01
    • 2021-05-21
    • 2012-11-30
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 2017-08-30
    相关资源
    最近更新 更多