【问题标题】:How to remove left and right margins from all wrapped rows in flexbox (without nth-child or js)如何从 flexbox 中的所有包装行中删除左右边距(没有 nth-child 或 js)
【发布时间】:2016-01-05 04:52:54
【问题描述】:

我正在寻找一种在不使用 ::nth-child 或 JavaScript 的情况下从每行中的每个第一项和最后一项中删除左右边距的好方法。如果这不可能,那么我想下一个最好的方法是在主 flexbox 元素上设置负左/右边距,但我不太确定使用width: 100% 的 flexbox 的最佳方法。基本上我想要的是这个 flexbox 的左右两边没有蓝色。

编辑:我必须在这里为我自己的问题提供一个解决方案。我使用带有overflow: hidden 的包装元素将something that works 放在一起,并将弹性框设置为width: calc(100% + 5px)。原来 Internet Explorer 不支持 flexbox 中的 box-sizing: border-box,但有一个解决方法是 I found here

jsFiddle

HTML:

<div id="main">
    <div><span>div 1</span></div>
    <div><span>div 2</span></div>
    <div><span>div 3</span></div>
    <div><span>div 4</span></div>
    <div><span>div 5</span></div>
    <div><span>div 6</span></div>
    <div><span>div 7</span></div>
    <div><span>div 8</span></div>
    <div><span>div 9</span></div>
    <div><span>div 10</span></div>
    <div><span>div 11</span></div>
</div>

CSS:

#main {
    margin-right: 40px;
    display: -ms-flexbox;
    display: flex;
    -ms-flex-pack: start;
    justify-content: flex-start;
    -ms-flex-wrap: wrap;
    flex-wrap: wrap;
    width: 100%;
    background-color: lightblue;
}
#main div {
    box-sizing: border-box;
    display: -ms-flexbox;
    display: flex;
    -ms-flex: 0 0 33.3%;
    flex: 0 0 33.3%;
    border: 5px solid transparent;
}
#main div > span {
    display: block;
    width: 100%;
    min-height: 50px;
    background-color: #eaeaea;
}

【问题讨论】:

  • 您知道您的代码中没有margin 吗?每个框周围的蓝色是由透明边框而不是边距创建的。上面代码中的margin-right 不在您的小提琴演示中。所以你想从每行的第一个 div 中删除左边框,从最后一个 div 中删除右边框?
  • 是的,我就是这个意思。
  • 我几乎已经使用 calc 和一个带有 overflow:hidden 的包装器来获得它,但 IE 一直将第三个 div 包装到下一行:jsFiddle
  • 看起来 Internet Explorer 有一个错误,它不支持弹性元素上的 box-sizing: border-box
  • 如果你想有点疯狂,放弃div 框样式,并专注于容器。添加border。应用内框阴影。洒一点blur-radiusspread-radius,瞧:jsfiddle.net/Ljmkxvgk/1;-)

标签: css flexbox


【解决方案1】:

我将 justify-content 更改为 space-between,并调整了 flex-basis 以配合此更改以及在顶部和底部提供元素填充,但在左右两侧填充 0。

相关 CSS:

#main {
    display: -ms-flexbox;
    display: flex;
    -ms-flex-pack: space-between;
    justify-content: space-between;
    -ms-flex-wrap: wrap;
    flex-wrap: wrap;
    width: 100%;
    background-color: lightblue;
}

#main div {
    box-sizing: border-box;
    display: -ms-flexbox;
    display: flex;
    -ms-flex: 0 0 32.3%;
    flex: 0 0 32.3%;

   padding-right:0px;
   padding-left:0px;
   padding-bottom:5px;
   padding-top:5px;
}

【讨论】:

  • 谢谢。它确实工作得很好,但是我需要控制项目之间的确切像素间距,以便它与网站的其余部分保持相同的网格。抱歉,之前应该提到过。
  • 另一个问题是如果最后一行有两个项目,一个放在最左边,另一个放在最右边。看起来有点奇怪:)
【解决方案2】:

我认为最好的解决方案是使用 calc 属性。

例如,如果您希望列之间有 10 像素,您可以这样做:

相关 CSS:

#main {
    display: -ms-flexbox;
    display: flex;
    -ms-flex-pack: start;
    justify-content: flex-start;
    -ms-flex-wrap: wrap;
    flex-wrap: wrap;
    width: 100%;
    background-color: lightblue;

    padding: 5px;  // gap-between-columns/2  
}

#main div {
    box-sizing: border-box;
    display: -ms-flexbox;
    display: flex;
    border: 1px solid transparent;

    margin: 5px; // gap-between-columns/2  
    flex: 0 0 calc(33.33% - 10px); // calc( (100/number-of-columns) - gap-between-columns )

}

【讨论】:

  • 我试过了,但是 div 停止了换行。 jsFiddle
  • 啊,没关系。 cmets 不是 CSS cmets,所以它破坏了 CSS。我在这里更新了 jsFiddle:jsfiddle.net/pqnhha5u/1。它没有达到我想要的效果......
  • 尝试删除 cmets。 :)
  • 你想要什么效果?我会帮你的。
  • 一开始我并不清楚你想要什么,但现在我认为你已经解决了这个问题。不错的工作! :)
猜你喜欢
  • 2017-12-06
  • 1970-01-01
  • 1970-01-01
  • 2019-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多