代码之家  ›  专栏  ›  技术社区  ›  user128300

全高和全宽CSS布局

  •  12
  • user128300  · 技术社区  · 16 年前

    我正在寻找一种方法来创建一个只有CSS(没有JavaScript)的布局,它有5个区域,如下所示:

       ┌────────────────────┐
       │          H         │
       ├────┬────────┬──────┤
       │    │        │      │
       │    │        │      │
       │    │        │      │
       │  A │    B   │  C   │
       │    │        │      │
       │    │        │      │
       │    │        │      │
       ├────┴────────┴──────┤
       │          F         │
       └────────────────────┘
    

    (仅当字体具有Unicode方框线条绘制字符时,上图才会正确显示。)

    A、 B,C必须具有相同的高度;H和F必须具有相同的宽度。也就是说,除了一个固定的边界之外,区域之间不能有间隙。

       <textarea style="width:100%;height:100%">Just a test</textarea>
    

    浏览器窗口右侧不应有滚动条(因为H、C和F的高度正好等于浏览器客户端区域的高度)。

    如果您使用的是 <table>

    我知道有一些W3C工作组致力于通过一些特性来扩展CSS标准,这些特性将使上述布局非常容易实现。然而,这些标准扩展目前并没有被大多数浏览器实现;我需要一个能与当前浏览器一起工作的解决方案。

    因此,我的问题是:是否可以只使用CSS创建上面的布局( 没有JavaScript,没有虚假的列,没有 <表> )? 当然,这个解决方案应该适用于当前的web浏览器。

    基于Gilsham提供的解决方案,我成功地编写了一个示例页面,生成了所需的仅CSS布局(使用Firefox 3.5.5和IE8进行了测试):

    <!DOCTYPE html>
    <html>
    <head>
    <style type="text/css">
    html,body{
        height:100%;    
        margin:0;
        padding:0;
        border:0;
    }
    
    div{
        margin:0;
        border:0;
    }
    
    textarea {
        margin:0;
        border:0;
        padding:0;
        height:100%;
        width:100%;
    }
    
    .content{
        display:table;
        width:100%;
        border-collapse:separate;
        height:80%;
    }
    
    .Col{
        display:table-cell;
        width:30%;
        height:100%;
    }
    
    #header,#footer{
        height:10%;
        position:relative;
        z-index:1;
    }
    
    </style>
    </head>
    <body>
    <div id="header"><textarea style="background-color:orange;">H Just a test</textarea></div>
    <div class="content">
        <div id="left" class="Col"><textarea style="background-color:lightskyblue;">A Just a test</textarea></div>
        <div id="center" class="Col"><textarea style="background-color:green;">B Just a test</textarea></div>
        <div id="right" class="Col"><textarea style="background-color:lime;">C Just a test</textarea></div>
    </div>
    <div id="footer"><textarea style="background-color:yellow;">F Just a test</textarea></div>
    </body>
    </html>
    

    一个缺点是div必须按特定顺序指定,这对搜索引擎优化和屏幕阅读器都不利;然而,这对于预期的web应用程序并不重要。

    4 回复  |  直到 16 年前
        1
  •  8
  •   Gilsham    16 年前

    http://jsfiddle.net/aGG3V/

    要设置页眉和页脚高度,您必须在样式中设置它,还必须设置.content padding和margin(这是负片版本)

        2
  •  6
  •   Gan    16 年前

    嗨,fmunkert(这里还有其他人:),

    我只是好奇,想试试看,于是我打开记事本,想出了这样的办法:

    <html>
        <head></head>
    <body style="margin: 0px; padding: 0px; height: 100%; width: 100%; text-align: center;">
    <div style="height: 100%; width: 100%;">
    
    <div style="height:20%; width: 100%; text-align: center; background-color: orange;">H</div>
    
    <div style="height:60%; width: 100%; display: table;">
    <div style="float:left; height:100%; width: 20%; background-color: yellow;">A</div>
    <div style="float:left; height:100%; width: 60%; background-color: grey;">B</div>
    <div style="float:left; height:100%; width: 20%; background-color: yellow;">C</div>
    </div>
    
    <div style="height:20%; width: 100%; text-align: center; background-color: orange;">F</div>
    
    </div>
    </body>
    </html>
    

    以下是Firefox的输出:

    Firefox Screenshot

    IE8 screenshot

    我用firefox3和IE8测试了这个。我觉得还可以。这是你想要的吗?:)

    注1:正如其他人提到的,这可能不实际,但仍然取决于您/您的客户想要什么。

        3
  •  2
  •   hollsk    16 年前

    找不到任何CSS来执行此操作的原因是CSS规范不允许您在不使用至少一个不想使用的选项的情况下满足所有这些条件。

    Holy Grail liquid布局是100%CSS,但它本身并不符合您的身高标准: http://www.alistapart.com/articles/holygrail/

    您可以使用以下方法使用页脚伪造高度标准: http://www.themaninblue.com/writing/perspective/2005/08/29/

    这篇24Ways文章有一个使用绝对定位的全高列方法,它解决了您的一些问题,但是创建了一个新的列,因为如果内容扩展,您的一个列总是会溢出: http://24ways.org/2008/absolute-columns

    你可能需要结合许多方法来获得符合你的规范的可行的东西。我个人只会使用jquery,因为生命太短暂了,不能像这样乱搞CSS,但是如果你执意要避免它,那就准备好大量的黑客攻击吧。

        4
  •  0
  •   Dave Everitt    16 年前

    当使用百分比测量时,没有简单的方法可以让元素精确地填充给定的深度。

    anchoring the footer 在窗口底部,如果列A和C都有一个背景色,但列B的背景色不同,则设置body(或container div,如果存在)背景色以匹配列A+C,以便无缝地填充这些列下面的间隙(如果它们比列B短)。