【问题标题】:4 column CSS layout - Fluid4 列 CSS 布局 - 流畅
【发布时间】:2010-11-25 21:39:52
【问题描述】:

我正在兜圈子试图弄清楚这一点。

HTML/CSS:

<style type='text/css'>

#content {
    padding: 20px;
    background: #F3F6F7;
}

.inner-box {
    background: #fff;
}

.inner-box .col {
    background:#eee;
    display:block;
    float:left;
    margin:1%;
    padding:20px;
    width:23%;
}

</style>

<div id="content">      
    <div class="inner-box clearfix">
        <div class="col col-1">
            COl1
        </div>
        <div class="col col-2">
            COl2
        </div>
        <div class="col col-3">
            COl3
        </div>
        <div class="col col-4">
          COl4
        </div>

    </div>              
</div>    

我基本上想要一个流畅的 4 列布局,每列周围有相同的填充位,并且整个内容 100% 跨越屏幕。

上面的代码可以工作,但只要我缩放浏览器,右边的第 4 列就会向下移动到其余部分。

【问题讨论】:

    标签: html css xhtml


    【解决方案1】:

    我个人已经放弃了使用花车。我发现他们太喜怒无常,无法与之合作。

    我现在使用display: inline-block; 代替浮动。请注意,IE7 及以下版本不支持此功能,但有一个出色的 css hack 可以完美运行。对 IE7 及更低版本使用条件 cmets 和单独的 CSS 文件。

    Cross-browser Inline-Block hack 非常适合解决这个问题。

    对于我所有的项目,我定义了一个 inline-block 类。

    .inline-block
    {
        display: inline-block;
    }
    

    在 IE CSS 文件中,我有:

    .inline-block
    {
        zoom: 1;
        *display: inline;
    }
    

    然后,您可以轻松地布置任何流畅的布局,将 div 并排放置并为每个 div 设置百分比宽度。我通常定义一个表示固定百分比宽度的类

    .twenty-five-perc
    {
        width: 25%;
    }
    

    因此,您生成的 html 可能如下所示:

    <div>
        <div class="inline-block twenty-five-perc">
        </div><div class="inline-block twenty-five-perc">
        </div><div class="inline-block twenty-five-perc">
        </div><div class="inline-block twenty-five-perc">
        </div>
    </div>
    

    现在您可能想知道为什么我的开头div 标记与前一个结束标记位于同一行。这是因为inline-block 尊重空格,这会破坏布局。您可以在此处阅读有关此问题和缓解方法的更多信息:http://www.lifeathighroad.com/web-development/css-web-development/inline-block-whitespace-workaround/

    这里有点漫不经心,但结果是你可以做出非常好的流畅布局,而不必费力地使用浮动布局。

    【讨论】:

    • 请注意,如果您在任何元素上设置了overflow:hidden,则与baseline alignment 相关的浏览器之间也存在一些不兼容性。
    • 您的答案是完整的并且有效。我唯一的问题是class="inline-block twenty-five-perc" 不是很语义化。你不妨把它放在一个样式属性中:)
    • @jan:我同意twenty-five-perc,这是个人的矫揉造作,但需要定义inline-block 才能使IE hack 覆盖整个站点。
    • @Alstair:CSS 中需要它,但在 Html 中,您仍然可以给它一个更具描述性的类名,而不是 class="inline-block"。除此之外,我相信这个特殊的例子使用绝对定位会更好。
    【解决方案2】:

    一些想法。

    首先,您不需要 clearfix div。在#content 上使用overflow:hidden 是处理此问题的更好方法。所以你的 HTML 看起来像这样:

    <div id="content">      
        <div class="col col-1">
            COl1
        </div>
        <div class="col col-2">
            COl2
        </div>
        <div class="col col-3">
            COl3
        </div>
        <div class="col col-4">
          COl4
        </div>             
    </div>
    

    这样更干净。其次,divs 是块级元素,所以display:block; 是不必要的。

    另外,除非您为排水沟使用灵活的单位,否则当视口变得小于列百分比允许的值时,您会遇到问题。我建议对排水沟使用百分比。请记住,百分比是相对于父元素的百分比,因此.col 将是#content 的百分比。

    由于您使用浮点数并且每列都有自己的可用类,因此很容易将装订线添加为右边距,并在最后一个上将其设置为 0。

    因此,不仅您的标记更简单,CSS 也更简单:

    content {
      padding: 20px;
      background: #F3F6F7;
      overflow:hidden;
      }
    .col {
      background:#eee;
      float:left;
      width:22%;
      margin-right: 4%;
      }
    .col-4 {margin-right:0;}
    

    还要注意 (22% * 4) + (4% * 3) = 100%。

    希望这会有所帮助。有关工作示例,请参阅 http://jsfiddle.net/D759g/

    【讨论】:

    • 顺便说一句,正如 Alastair 指出的那样,内联块也是一种很好的方法。我给出了这个例子,假设你愿意或想要使用浮点数。在大多数浏览器中都可以使用。
    【解决方案3】:

    我会在这个布局中使用绝对定位。在我看来,最可靠的解决方案。另外,您可以在不破坏布局的情况下更改填充。另外你可以添加边框和边距,没问题。

    /* assuming your html is under the body tag */
    html, body, #content, .inner-box { margin: 0px; height: 100%; }
    
    .inner-box { position: relative; }
    
    .col {
      position: absolute;
      top: 0px; bottom: 0px;
      padding: 1%;
      border: 1px solid black;
    }
    
    .col-1 { left: 0%; right: 75%; }
    
    .col-2 { left: 25%; right: 50%; }
    
    .col-3 { left: 50%; right: 25%; }
    
    .col-4 { left: 75%; right: 0%; }
    

    请注意,一列的 left 值和前一列的 right 值总和为 100%

    注意:这在 ie6 中不起作用。

    【讨论】:

    • 只是在尝试这种布局。效果很好,但因为它是绝对定位的,你如何清除内盒流过列?
    • 我不明白你的问题。在这个布局中没有任何东西是浮动的。只需用我的替换示例中的 CSS。顺便说一句,清除浮动是一种不好的做法。在容器上使用overflow: auto; 将其包裹在浮动内容周围。
    • '清除带有空或不可见元素的浮动以使容器环绕内容'当然是我的意思。
    • 似乎绝对位置将列从 .inner-box 包装中取出,因此内盒不再跨越列(高度明智)。就像高度一样:100% 似乎什么也没做。
    • 试试这个示例,我将 .inner-box 的背景更改为红色 jsfiddle.net/FHN8F/2。它适用于我的 Chrome、Firefox 和 ie8。 (我发现 Chrome 中存在问题:code.google.com/p/chromium/issues/detail?id=65912
    【解决方案4】:

    我会尝试使用略低于 23% 的东西:DOM 元素边框、填充、边距等被添加到元素的宽度中,而不是成为宽度的一部分。我假设您正在缩小浏览器,它会缩放百分比,而不是固定像素填充等,这意味着相对于内部宽度有更多的填充,使得列对于 100% 宽度来说有点太大了。

    希望这会有所帮助,

    詹姆斯

    【讨论】:

      【解决方案5】:

      将某些值作为固定像素会给您带来麻烦。

      确保所有的内边距、边距和内容总计等于 99% - 我发现当所有值都等于 100% 时 Mozilla 会出现问题。

        <style type='text/css'>
      
          #content {
              padding: 1%;
              background: #F3F6F7;
          }
      
          .inner-box {
              background: #fff;
          }
      
          .inner-box .col {
              background:#eee;
              display:block;
              float:left;
              margin:1%;
              padding:1%;
              width:21%;
          }
      
          </style>
      

      【讨论】:

        【解决方案6】:

        这是创建 2、3 或 4 列列表的最简单方法。只需将百分比调整为页面的 99%(在本例中为 100)。

        <font size="4"><font color="maroon"><b>TITLE</b></font>  <font size="2"><div style="width: 25%; float: left;">
         <ul>
         <li>Left Item 1</li>
         <li>Left Item 2</li>
         <li>Left Item 3</li>
         <li>Left Item 4</li>
         <li>Left Item 5</li>
         </ul>
         </div>
         <div style="width: 25%; float: left;">
         <ul>
         <li>Left Item 1</li>
         <li>Left Item 2</li>
         <li>Left Item 3</li>
         <li>Left Item 4</li>
         <li>Left Item 5</li>
         </ul>
         </div>
         <div style="width: 25%; float: right;">
         <ul>
         <li>Right Item 1</li>
         <li>Right Item 2</li>
         <li>Right Item 3</li>
         <li>Right Item 4</li>
         <li>Right Item 5</li>
         </ul>
         </div> <div style="width: 25%; float: right;">
         <ul>
         <li>Right Item 1</li>
         <li>Right Item 2</li>
         <li>Right Item 3</li>
         <li>Right Item 4</li>
         <li>Right Item 5</li>
         </ul>
         </div></font></font>
        

        【讨论】:

        • OP 需要在每个部分周围进行填充。
        猜你喜欢
        • 2015-09-25
        • 2012-12-30
        • 1970-01-01
        • 2010-09-23
        • 1970-01-01
        • 2018-07-23
        • 1970-01-01
        • 2014-02-01
        相关资源
        最近更新 更多