html - 设置具有固定宽度单元格的网格样式

标签 html css flexbox

我有 7 个固定宽度 (256px) 和 margin: 20px 的组件,我希望它们在网格中对齐,但我试图获取最后一行中的最后一项始终保持右对齐,使其与最右边的列对齐。我还希望列网格在页面上居中。我尝试了一些方法,但我陷入了困境。

我尝试用 flex 盒来做这件事,虽然我完全有可能错过了一些关于 flex 盒的东西,可以让它工作,但我没有任何运气。我得到的最接近的是这样的:

.grid {
  display: flex;
  flex-flow: row wrap;
  justify-content: center;
}

.grid div {
   margin: 20px;
   width: 256px;
   height: 48px;
}

.grid div:last-child {
  margin-left: auto
}

但是 justify-content,虽然它使组件在页面上居中,但如果最后一行的组件少于其他行,则会将这些组件居中并破坏网格效果。

我也在没有 flex 盒的情况下尝试过这个,并且接近于:

.grid div {
   margin: 20px;
   width: 256px;
   height: 48px;
   float: left;
}

.grid div:last-child {
  float: right;
}

这非常接近,我只需要一种方法将网格的宽度设置为 256px 的倍数(好吧,由于边距为 296px),然后将网格在父级中居中。完全可以使用媒体查询,但我觉得应该有一个更简单的解决方案。

(图片以防我解释得不好)

我正在寻找的行为: /image/y5ySx.jpg

不正确的行为: /image/xakgw.jpg

引用 HTML:

<div class="grid">
     <div></div>
     <div></div>
     <div></div>
     <div></div>
     <div></div>
     <div></div>
     <div></div>
</div>

最佳答案

通过几个媒体查询,您应该能够做到这一点,您可以使用伪元素作为幽灵元素,并填充最后一个和倒数第二个元素之间的间隙。

这里我还给了 grid 一个最大宽度,所以不能连续有 5 个,我这样做是因为如果你需要它,你将需要一个额外的元素作为倒数第二个来充当 ghost,因为需要 3 个 ghost 元素(2 个伪 + 1)来解决这个问题。

如果您需要将 5 个元素排成一行,只需将其中一个伪元素的大小加倍,256px + 256px + 40px(边距为 40px),如果排成 6 个元素,则为宽度的 3 倍等。

html, body {
  margin: 0;
}
.grid {
  display: flex;
  flex-flow: row wrap;
  justify-content: center;
}

.grid div {
   margin: 20px;
   width: 256px;
   height: 48px;
   background: lightgray;
}
  .grid div:last-of-type {
    order: 2
  }

@media screen and (min-width: 592px) {
  .grid::after {
    content: '';
    margin: 20px;
    width: 256px;
    height: 0;
    order: 1;
  }
}

@media screen and (min-width: 888px) {
  .grid::before {
    content: '';
    margin: 20px;
    width: 256px;
    height: 0;
    order: 1;
  }
}

@media screen and (min-width: 1184px) {
  .grid::before {
    display: none;
  }
}

@media screen and (min-width: 1480px) {
  .grid::before {
    display: inline;
    width: 552px;
  }
}
<div class="grid">
     <div></div>
     <div></div>
     <div></div>
     <div></div>
     <div></div>
     <div></div>
     <div></div>
</div>

关于html - 设置具有固定宽度单元格的网格样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44245984/

相关文章:

html - css 页面布局 - 前景 "overlying"背景

html - 如何为某种元素的第一个 child 设计样式?

html - 如何在一个 block 中使用 css 制作两列?

jquery - 我的 jQuery "showcase"- 不透明度问题 :)

javascript - 如何使 HTML 元素在悬停时扩展并覆盖同一 flex 容器中的相似相邻元素而不移动它们?

css - 显示:box and display:flexbox in css3有什么区别

javascript - 防止键盘在 iOS 中弹出

javascript - 如何让Bootstrap 3轮播指标立即变化

html - 更改<div> block 大小时如何实现垂直对齐

iphone - 如何通过 CSS 关闭某些 HTML 元素的硬件加速?