【问题标题】:CSS layout, middle column is fixed-width AND positioned, two outer columns fluid width, no spacingCSS 布局,中间列是固定宽度和定位,两个外列流体宽度,没有间距
【发布时间】:2014-04-24 18:27:55
【问题描述】:

我有一个容器元素,它必须包含 3 个 div(或表格单元格或弹性框,或其他)。容器是固定大小的。假设宽度为 500 像素,高度为 100 像素。

中间的 div 必须是固定宽度,比如 100px。它还必须能够通过设置 css 来移动。对于本例,假设它固定在距左侧 225 像素处。

剩下的两个 div 应该填满每一边的剩余空间(或者在没有空间时不占用空间,即使中间的 div 已移过容器的边界)。侧面 div 和中间 div 之间不能有空格,侧面 div 和中间 div 之间也不能有任何重叠。

所有内部 div 的高度均为 100%(即 100 像素)。

container 500x100
----------------------------------------------------------------------------|
| |-------------------------------| |---------------------| |-------------| |  
| |  left, fluid                  | | middle, positioned  | | right,fluid | |
| |                               | |at 225px, 100px width| |             | | 
| |-------------------------------| |---------------------| |-------------| | 
----------------------------------------------------------------------------|

【问题讨论】:

  • 我认为JS是必要的,不幸的是:(
  • 对于更多的上下文,中间元素将能够使用 javascript 移动,因此最好的解决方案不会重复更改十几个属性(此处为 225px)。
  • 您能解释一下even if the middle div is moved past the boundary of the container 部分吗?
  • 在这个问题上并没有真正关注你...你能解释得更详细一点吗?
  • 据我所知,布局是不可能通过CSS 实现的。如果对你有用的话,你可以用中心流体固定侧面。

标签: html css flexbox


【解决方案1】:

听说过CSS Tablescalc??

注意:此解决方案符合 CSS3,因此 IE8 及以下版本不支持此解决方案!! :)

Working Demo

HTML

<div class="container">
    <div class="left">left</div>
    <div class="cent">cent</div>
    <div class="right">right</div>
</div>

CSS

html, body {
    width:100%;
    height:100%;
    margin:0;
    padding:0;
}
div { /* just for demo */
    height:300px;
    border:1px solid red
}
.container {
    display:table;
    width:100%;
    height:100%;
    table-layout:fixed;
}
.left, .right, .cent {
    display:table-cell /*aabara-kaa-dabara*/
}
.cent {
    width:225px; /* fixed center */
}
.left, .right {
    width : calc(50% - 225px) /* make left and right divs fluid */
}

编辑

如果你想让 center 让 感觉 在 rezise 上四处移动,你必须使用 adjacent divs width...类似的东西:

.left {
    width : calc(30% - 225px);
}

.right{
    width : calc(70% - 225px);
}

Working Demo

【讨论】:

  • 嗯,当您使窗口变小时,中心宽度会变大。所以它不是一个固定的宽度?
  • center 是固定的,它看起来更小,因为你正在观看它旁边的流体大小的 div 的比例......看这个小提琴,它会帮助你理解 => jsfiddle.net/DzK26/2 (请注意,在调整大小时,没有一个 a 出现新行 )
  • 是的,但是盒子改变了宽度。 (我没有真正看代码,因为我在工作并且很累!如果我错了我会检查它xD)
  • 左右正在改变宽度......中心是固定宽度......也许有一只红牛后从家里检查......它会给你翅膀! ;)
  • 我是不是太高了?那个中间的 div 正在改变大小。 DEMO
【解决方案2】:

如果我们像这样使用标记:

<div class="container">
    <div class="box1">a</div>
    <div class="wpr">
        <div class="box2">b</div>
        <div class="box3">c</div>
    </div>
</div>

..我们可以使用带有溢出:隐藏或溢出:自动的块格式化上下文来实现这一点。

将鼠标悬停在小提琴中的容器上以查看效果

FIDDLE

CSS

.container{
    width:500px;
    height:100px;
}
.wpr {
    overflow:hidden;
    height: 100px;
    background:aqua;
}
.box1, .box2, .box3 {
    height: 100px;
}
.box1 {
    background:pink;
    float:left;
    min-width: 50px;
    -webkit-transition: min-width 1s;
    -moz-transition: min-width 1s;
    -o-transition: min-width 1s;
    transition: min-width 1s;
}
.box2 {
    background:purple;
    width:100px; /*fixed width */
    display:inline-block;
    float:left;
}
.box3 {
    background:orange;
    display:inline-block;
    overflow:hidden;
    width: calc(100% - 100px);  /*100px is same as box with fixed width */
}
.container:hover .box1 {
    min-width: 450px;
}

【讨论】:

  • 不幸的是,此解决方案依赖于设置某些元素的宽度。这不允许在任何解决方案中将中间元素定位到容器框的左边界之外(因为该属性不允许负宽度。当我说“即使中间 div 移动超过容器”,但我可能应该更明确。
  • @daniellewallace - 看看我更新的答案:它不依赖于设置元素的宽度。 (除了根据问题的中间框)
  • 你通过设置box1的宽度来移动box2。这不会使 box2 移过容器的左侧。
【解决方案3】:

这可以通过 Table 轻松实现。 像这样创建表

<table class="container">
    <tr>
        <td class="box1">
        </td>
        <td class="box2">
        </td>
        <td class="box3">
        </td>
    </tr>
</table>

像这样应用 CSS:

.container{
    background:#dadada;
    width:500px;
    height:100px;
    border:none;
    border-collapse:collapse;
}
.box1{
    background:red;
    width:100px; /* This will set the position of Middle Box as well as occupy the space in left */
}
.box2{
    background:blue;
    width:350px; /* This will set the width of Middle Box */
}
.box3{
    background:green;
    /*This will automatically occupy the space in the right */
}

您可以在这里找到演示:http://jsfiddle.net/s78A6/

【讨论】:

  • 你仍在将固定宽度设置为 2 列,伙计! :)
  • 他可以,但是如果您删除.box1 上的width:100px;,它应该可以工作。更新了他的JSFiddle。我现在注意到中间的框总是完全居中,这不是 OP 问题..
  • 我不知道这是什么,哈哈。这是错误的,所以我不赞成。
  • @NoobEditor :Ruddy 说过中间框有两个值。从左到右的位置和宽度。中间框的 position-left 值可以作为第一个框的宽度给出。这会将 box2 向右推并占据空间。
  • @Rubby:你读过我用 CSS 写的 cmets 吗?您要设置中间框的 LEFT-POSITION 和 FIXED-WIDTH。我已经设置了中间框的 FIXED-WIDTH。现在你想给它 LEFT-POSITION。我已将此值作为第一个框的宽度。这会将中间框推到 LEFT-POSITION 的值。现在尝试更改中间框的值 WIDTH 或 LEFT-POSITION(作为第一个框的宽度给出)。第一个和最后一个块将保持流体布局,而中间框将具有固定宽度。我认为你只需要这个,就像你的数字显示的那样!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2012-01-07
  • 1970-01-01
  • 2010-09-13
  • 2017-04-29
  • 2012-12-09
相关资源
最近更新 更多