19

我希望两个元素占据父元素宽度的确切百分比,但我还需要它们的边距将它们分开。我有以下标记:

<div class='wrap'>
  <div class='element'>HELLO</div><div class='element'>WORLD</div>
</div>​
.wrap {
  background:red;
  white-space:nowrap;
  width:300px;
}
.element {
  background:#009; color:#cef; text-align:center;
  display:inline-block;
  width:50%;
  margin:4px;
}

正如您在http://jsfiddle.net/NTE2Q/中看到的那样,结果是孩子溢出了包装器:

这

我怎样才能让它们适应空间?可悲的是,box-sizing:margin-box这种情况下没有。

4

4 回答 4

40

技术 #1 - 现代 CSS3calc()

使用CSS3 的calc()length,您可以通过将宽度设置.element为:

.element {
  width: 49%;                     /* poor approximation for old browsers    */
  width: calc(50% - 8px);         /* standards-based answer for IE9+, FF16+ */
  width: -moz-calc(50% - 8px);    /* support for FF4 - FF15                 */
  width: -webkit-calc(50% - 8px); /* support for Chrome19+ and Safari6+     */
}

演示:http: //jsfiddle.net/NTE2Q/1/

Hello 和 World 周围有 4px 的边距

有关哪些浏览器和版本支持此功能的详细信息,请参阅http://caniuse.com/calc

 


技术 #2 - 老式包装

可以通过堆积多个元素来进行计算。对于这种情况,我们将每个“元素”包装在一个 50% 宽但具有 4px 填充的包装器中:

<div class='wrap'>
  <div class='ele1'>
    <div class='element'>HELLO</div>
  </div><div class="ele1">
    <div class='element'>WORLD</div>
  </div>
</div>​
.ele1 {
    display:inline-block;
    width:50%;
    padding:4px;
    box-sizing:border-box;          /* Make sure that 50% includes the padding */
    -moz-box-sizing:border-box;     /* For Firefox                             */
    -webkit-box-sizing:border-box;  /* For old mobile Safari                   */
}
.element {
    background:#009; color:#cef; text-align:center;
    display:block;
}

演示:http: //jsfiddle.net/NTE2Q/2/

​​​ Hello 和 World 周围有 4px 的边距

 


技巧 #3 - 使用 (CSS) 表格

通过将包装器视为“表格”并将每个元素视为同一行中的单元格,可以得到相同的结果。有了这个,元素之间的空白并不重要:

<div class='wrap'>
  <div class='element'>HELLO</div>
  <div class='element'>WORLD</div>
</div>​
.wrap {
    background:red;
    width:300px;
    display:table;
    border-spacing:4px
}
.element {
    background:#009; color:#cef; text-align:center;
    width:50%;
    display:table-cell;
}
​

演示:http: //jsfiddle.net/NTE2Q/4/

边缘始终为 4px 的蓝色单元格

请注意,最后一种技术会折叠两个元素之间的 4px 间距,而前两种技术会导致 8px 出现在两个项目之间,4px 出现在边缘。

于 2013-01-04T21:17:51.857 回答
2

你所描述的基本上是一个边界。那么为什么不将 CSS 边框属性与 background-clip 一起使用呢?只是不要忘记适当的供应商前缀。

http://jsfiddle.net/NTE2Q/8/

.wrap {
    background-color: red;
    white-space:nowrap;
    width:300px;
}
.element {
    background:#009; color:#cef; text-align:center;
    display:inline-block;
    width:50%;
    border:4px solid rgba(0,0,0,0);
    box-sizing: border-box;
    background-clip: padding-box;
}
于 2013-01-04T22:42:37.793 回答
0

对我来说,上述技术都没有足够一致的跨浏览器工作。我发现一种稍微不同的技术display:table-cell允许我将 2 个或更多元素彼此相邻放置。这是它的一个例子

CSS:

    display:table-cell;
    background:#009; color:#cef; text-align:center;
    width:22%; /*Set percentage based on # of elements*/
    border:4px solid rgb(255,0,0);/*no longer need background to be red, just make border red*/

您甚至不再需要包装器,因为 div 现在被视为<td>.

于 2014-03-11T21:39:27.957 回答
0

尽管我强烈建议尽可能使用 Phorgz 的技术,但我也想提出一种只使用一个包装器并实现效果calc() 的老式方法。position: relative

.two-blocks-by-side() LESS Mixin:

.two-blocks-by-side(@padding) {
  padding: @padding (@padding + @padding / 2);
  font-size: 0;

  & > div {
    position: relative;
    display: inline-block;
    font-size: initial;
    width: 50%;

    &:first-child { left: -1 * @padding / 2 };
    &:last-child { right: -1 * @padding / 2 };
  }
}

JS Bin 例子

于 2014-06-12T15:23:04.693 回答