只使用CSS:如何将固定宽度的div居中放置在填充剩余空间的两个div之间?

10

JSFIDDLE

编辑:尝试实现与此内容相反的效果。
(不是两个固定宽度的侧边div和一个流体宽度的中间div,而是想要在两侧有两个流体宽度的div,中间有一个div居中)

我有三个div:A、B和C。

B需要居中放置在A和C之间。

我需要做什么

目前我的做法基本上与上面的示例相匹配。但是,如果A、B和C的容器宽度是奇数,一些浏览器会将A和C的宽度向下取整,而另一些浏览器则向上取整(导致C长度分别长1像素和短1像素)。

注意C右侧的额外像素

注意C右侧的间距比较窄。

我不在乎需要多少个嵌套的div,但是我已经花了太多时间在这上面了!如果有人已经找到了解决此问题的方法,请分享一下!

注:
- A、B和C的父元素不能设置overflow hidden。
- A、B和C不能重叠(它们具有半透明png)

这是我的起点:JSFIDDLE

5个回答

7

以下是两种可行的方法,但都需要注意(警告:两种方法都需要一个包装器):

HTML

<section class="wrapper">
    <div class="column" id="a"></div>
    <div class="column" id="b"></div>
    <div class="column" id="c"></div>
</section>​​​​​​​​​​​

基础CSS

.column {
    height: 3em;
}

#a {
 background-color: red;   
}
#b {
 background-color: green;
}
#c {
 background-color: blue;   
}

#b {
  width: 50px;   
}

CSS3方法:

.wrapper {
    display:box;
    box-orient:horizontal;
    box-align:stretch;    
}

#a, #b {
    box-flex:1.0;
}

注意:目前只有Firefox和Webkit(Chrome/Safari)支持,两者都需要前缀规则。以上是将来的情况。
这里是带有前缀的演示:http://jsfiddle.net/crazytonyi/cBVTE/ 表格显示方法:
.wrapper {
    display: table;
    width: 100%;
    table-layout: fixed;

}    
.column {
    display: table-cell;
}

注意事项:IE 直到 7 或 8 才开始支持这种显示类型。另一方面,担心在旧版本的 IE 上使用用户就像担心那些仍然关闭 cookie 和 JavaScript 的人一样。他们要么跟上潮流,要么习惯于页面崩溃。不再迎合他们!
以下是使用上述内容的演示:http://jsfiddle.net/crazytonyi/kM46h/ 在两种情况下,都不需要浮动或定位,只需要愿意对老式浏览器说“不”。使用哪种方法取决于您想要抛弃哪些旧版浏览器。

您,先生,是一位绅士和学者。感谢您的解决方案!比我发布的答案(我的JSFiddle)优雅得多。朋友,您有一个赞和一个被接受的答案。 :) - MicronXD
1
大家请点赞这个答案!其他的不支持浏览器整像素舍入。 - MicronXD
1
Box flex在caniuse.com/#feat=flexbox上有非常纯净的浏览器支持。它在ie9、opera、opera mobile上失败,在所有主要浏览器中,这个属性只有部分支持。为了支持检测,请使用modernizr。 - Vladimir Starkov
@matmuchrapna:赞一个现代化的 Modernizr 插件。 - Anthony

0

编辑:使用Anthony的解决方案!它满足所有要求,没有任何可怕的hacky CSS!如果您确实需要支持旧浏览器,请随意使用我的解决方案(但是,真的,Anthony的解决方案对于大多数情况都是完美的)。


我不知道为什么我还没有尝试过这个解决方案,但这似乎比this问题的被接受答案更好!没有四舍五入!

已解决!

如果我们将四舍五入的50%视为一个值(X),并将B的常数宽度视为值Y,那么我们需要:

A的宽度= X
C的宽度= 100% - X

我决定将其用作我的结构:

<container>
  <a></a>
  <b></b>
  <c_holder>
    <c>
    </c>
  </c_holder>
</container>

问:如何使C的宽度为container_width - X
答:我们给C一个容器,称为c_holder,宽度为100%,并给C一个左偏移量X(50%)。

现在暂时忘记B...

现在我们有两个相邻的div...每个大约50%,但总共正好是100%。

将所有这些放入一个容器中,并给该容器一个右边距Y(B div的宽度)。现在我们有A和C相邻,但占据100% - Y的宽度。

给c_holder一个左偏移量Y,并将B放在A和c_holder之间。在A和B上应用左浮动。

现在A的宽度是X,B的宽度是Y,C的总左偏移量是X+Y,而C的可见宽度为容器的100%-X-Y

有点奇怪,但在IE7、Chrome和Safari中完美运行。稍后我会测试FF。


我的答案不需要嵌套包装器。你的方法可能适用于更多的浏览器。告诉我一声。 - Anthony
直到现在我才看到你的回答...太棒了..非常感谢!我一直在支持尽可能多的浏览器(这是在企业世界工作的症状,人们有时仍然使用IE6 u_u)。真的...你让我的晚上 :P - MicronXD

0

我认为你需要像这样使用...

HTML

<div class="a">a</div>
<div class="b">b</div>
<div class="c">c</div>

CSS

.a
{
width:50%;
height:25px;
background-color:#0F0;
float:left  
}
.b
{
width:13px;
height:25px;
background-color:#FFF;
margin-left:-6px;
float:left; 
position:relative;
z-index:99;
}
.c
{
width:50%;
height:25px;
background-color:#C33;
margin-left:-7px;
float:left; 
}
</style>

违反了规则:A、B和C不能重叠。这个解决方案会让B与A和C重叠。不过还是谢谢你的尝试。 - MicronXD

0
<style>

.a{ width:50%; height:25px; background-color:#0F0; float:left }
.b{ width:13px; height:25px; background-color:#FFF; float:left;
    position:relative; left:51%;}
.c{ width:50%; height:25px; background-color:#C33; float:right; }

</style>

0

在dabblet.com上的演示

http://img838.imageshack.us/img838/6116/cff430b799254087b6ec991.png

HTML:

<div id="main">
    <div class="half left">
        <div>
            <div id="a" class="col"> </div>
         </div>
    </div>
    <div class="half right">
        <div>
            <div id="c" class="col"> </div>
         </div>
    </div>
    <div id="b" class="col"> </div>
</div>

CSS:

#main {
    height: 40px;
    width: auto;
    border: 1px solid #cfcfcf;
    position: relative;
}

.half {
    width: 50%;
    height: 100%;
    position: absolute;
    top: 0;
}

.half.left { left: 0; }
.half.right { right: 0; }

.half > div {
    height: 100%;
    padding:0 8px;
}

.half.left > div { padding-left: 7px; }
.half.right > div { padding-right: 7px; }

.col {
    height: 100%;
    margin-top: 3px;
}

#a,
#c {
    background-color: green;
}

#b {
    background-color: red;
    margin-left: auto;
    margin-right: auto;
    width: 14px;
}

更新:已更新,无重叠


很遗憾,您的解决方案无法处理舍入问题。在容器A和B的宽度之外,没有任何变化。当浏览器将总宽度的50%四舍五入到最近的像素时,A和B以及B和C之间的间距会抖动。 - MicronXD
你能否让 #b 的宽度等于14像素? - Vladimir Starkov
当然,即使如此,仍然存在重叠问题。如果父容器具有奇数(非偶数)宽度,则仍会遇到整像素舍入问题。感谢您发布解决方案。 - MicronXD
谷歌浏览器和火狐浏览器都可以,只有欧朋浏览器在奇怪的容器宽度上出现问题 =( - Vladimir Starkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接