【问题标题】:Dynamic number of columns in CSS grid, with different widthsCSS网格中的动态列数,具有不同的宽度
【发布时间】:2018-08-02 07:35:04
【问题描述】:

我正在尝试使用 css 网格创建一个简单的(我认为)布局,但我找不到如何去做。

基本上,我希望将图像和文本并排放置。当包含网格的宽度太小时,文本会低于图像,并且都占用 100% 的宽度。

grid-template-columns: repeat(autofit, minmax(300px, 1fr)) 很容易做到这一点:https://codepen.io/anon/pen/vajYZM

问题是当图像和文字并排时,我希望文字是两倍大。我可以用grid-template-columns: minmax(200px, 1fr) minmax(400px, 2fr) 做到这一点,但是文本永远不会低于图像,并且我有溢出。

如果我在文本元素上使用grid-template-columns: repeat(autofit, minmax(200px, 1fr)) 和grid-column: span 2,我想我可以做到这一点,但是一旦文本位于下方,我就必须在图像上应用相同的跨度 2。

是否可以在 CSS 中定位网格行的最后一个元素?

我知道我可以使用媒体查询来更改grid-template-columns,但我宁愿尽可能使用纯 CSS。基本上,是否可以在网格中明确定义列,如果它们没有合适的位置,它们会消失吗?

或者是否有可能以我错过的另一种方式?

【问题讨论】:

  • 媒体查询是纯 CSS,没有它或JavaScript,你无法实现你所描述的行为。

标签: css css-grid


【解决方案1】:

使用auto-fit 或auto-fill,网格的所有列将始终具有相同的大小,因为浏览器将平均分配可用空间。使用网格,你必须使用媒体查询来做你想做的事,但关于那个......

我知道我可以使用媒体查询来更改网格模板列,但我宁愿尽可能使用纯 CSS。

...媒体查询是纯 css,因此您无需担心。

有一个sn-p:

.container {
  display: grid;
  grid-template-columns: minmax(300px, 1fr) 2fr;
  grid-gap: 24px;
}

@media screen and (max-width: 768px) {
  .container {
    grid-template-columns: 1fr;
  }
}

.img {
  width: 100%;
}
<div class="container">
  <img class="img" src="http://via.placeholder.com/350x150">
   
  <div class="text">
    Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum 
  </div>
</div>

【讨论】:

    【解决方案2】:

    使用 Flexbox 代替 Grid 将解决您想要实现的目标。

    使用 flexbox,您可以通过定义 flex-grow 来指定每个元素应如何占用空间。

    参考:Flexbox Comprehensive guide

    我在这里创建了一个简单的示例:

    Working example

    .flex-me{ 
       display: flex; 
       flex-flow: wrap; 
    }
    
    .flex-me .thumb img{
       width: 100%;
    }
    
    .flex-me p{
      flex: 2;
    }
    

    这是做什么的:

    1. 保留原始图像大小,但只允许它与浏览器宽度一样大
    2. 确保文本始终占据图像空间的两倍flex: 2
    3. 如果图像大小超过了文本定义为增长的空间,则换行到下一行flex-flow: wrap

    【讨论】:

    • 感谢您的回答,但您的示例并没有达到我想要的效果。图片不会像我想要的那样改变大小。我将使用媒体查询。
    猜你喜欢
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 2017-09-16
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    相关资源
    最近更新 更多