代码之家  ›  专栏  ›  技术社区  ›  to StackOverflow

带100%高度和滚动条的IE6“框架”布局

  •  6
  • to StackOverflow  · 技术社区  · 14 年前

    我想实现一个简单的“框架”布局,固定的标题,固定的左导航区域,以及一个主内容区域,如果需要的话,它将用滚动条填充整个视区的其余部分。我的最佳尝试是在下面-但是当我向主分区添加足够的内容以强制滚动时,我看到滚动条延伸到了视区底部以下。

    我做错什么了?或者IE6出了什么问题,我该如何解决?

    注意:请不要推荐使用较新的浏览器-我很乐意但不能。

    更新1 (对于马蒂和其他纯粹主义者!)-我必须生活在为一个集团的总部开发Web应用程序的现实约束下,这个集团需要100多个子公司的用户访问,而不是所有子公司都升级到了现代浏览器。一些子公司希望使用浏览器不兼容作为不使用总部强加的应用程序的借口!

    更新2

    我是一个应用程序开发人员,而不是一个网页设计师,这很明显。到目前为止,我一直在使用一个doctype HTML4.0过渡,我认为这在所有IE版本中都是强制的怪癖模式。不过,我最近尝试添加AjaxControlToolkit ModalPopupExtender,当弹出窗口显示时,这会破坏我的布局。谷歌建议我需要使用XHTML 1.0来解决这个问题(AjaxControlToolkit不支持Quirks模式),事实上,我很乐意使用更干净的基于CSS的布局,但我确实需要我的基本框架布局在IE6中工作。

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head>
        <title></title>
        <style type="text/css">
        html, body
        {
            height:100%;
            margin:0;
            padding:0;
            overflow:hidden;
        }
        div
        {
            border:0;
            margin:0;
            padding:0;
        }
        div#top
        {
            background-color:#dddddd;
            height:100px;
        }
        div#left
        {
            background-color:#dddddd;
            float:left;
            width:120px;
            height:100%;
            overflow:hidden;
        }
        div#main
        {
            height:100%;
            overflow:auto;
        }
        </style>    
    </head>
    <body>
        <div id="top">Title</div>
        <div id="left">LeftNav</div>
        <div id="main">
        Content
        <p>
        Lorem ipsum ...
        </p>
        ... repeated several times to force vertical scroll...
            <table><tr>
            <td>ColumnContent</td>
            ... td repeated several times to force horizontal scroll...
            <td>ColumnContent</td>
            </tr></table>
        </div>
    </body>
    </html>
    
    3 回复  |  直到 14 年前
        1
  •  1
  •   Marcel Korpel    14 年前

    在我之前的回答中,我是绝对错误的(没有双关语),因为你不能同时指出两者 top bottom 在IE6中,两者都不是 left right . 此外,您不知道ContentDiv的确切宽度和高度,也不知道它们在视区中的百分比。

    当我解决这个问题时,我把IE调到怪癖模式,以获得 border-box box model (也见) W3C spec )要对更符合标准的浏览器使用相同的CSS规则,可以使用 box-sizing 属性(和变量)。完成此操作后,边框进入内容,您可以通过指定边框(宽度)将内容向下和向右推 风格:

    <!-- put IE in quirks mode -->
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"   
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <title>IE6 'frames'</title>
      <style type="text/css">
        * {
          margin: 0;
          padding: 0;
          box-sizing: border-box;
          -moz-box-sizing: border-box;
          -khtml-box-sizing: border-box;
          -webkit-box-sizing: border-box;
        }
    
        html, body {
          height: 100%;
          overflow: hidden;
        }
    
        #top {
          position: absolute;
          top: 0;
          width: 100%;
          background-color: #ddd;
          height: 100px;
          z-index: 2;
        }
    
        #left {
          position: absolute;
          left: 0;
          border-top: 100px solid;  /* move everything below #top */
          background-color: #bbb;
          width: 120px;
          height: 100%;
          overflow: hidden;
          z-index: 1;
        }
    
        #main {
          position: absolute;
          border-top: 100px solid;
          border-left: 120px solid;
          width: 100%;
          height: 100%;
          overflow: auto;
        }
      </style>    
    </head>
    <body>
      <div id="top">Title</div>
      <div id="left">LeftNav</div>
      <div id="main">
        <p>
          Lorem ipsum ...<br />
          <!-- just copy above line many times -->
        </p>
      </div>
    </body>
    </html>
    

    更新: 在IE>=7及更多符合标准的浏览器中,您可以使用 position: fixed 和两者一起 顶部 底部 (等)规则。有一种方法可以在标准模式(或者更确切地说, Almost Standards Mode 使用 CSS expressions . 这样,可以让JScript引擎计算正确的宽度和高度值(在条件注释之间添加)。

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
      <title>'Frames' using &lt;div&gt;s</title>
      <style type="text/css">
        * {
          margin: 0;
          padding: 0;
        }
    
        html, body {
          height: 100%;
          overflow: hidden;
        }
    
        #top, #left, #main {
          position: fixed;
          overflow: hidden;
        }
    
        #top {
          top: 0;
          width: 100%;
          background-color: #ddd;
          height: 100px;
        }
    
        #left {
          left: 0;
          top: 100px;  /* move everything below #top */
          bottom: 0;
          background-color: #bbb;
          width: 120px;
        }
    
        #main {
          top: 100px;
          left: 120px;
          bottom: 0;
          right: 0;
          overflow: auto;
        }
      </style>
      <!--[if IE 6]>
      <style>
        #top, #left, #main {
          position: absolute;
        }
    
        #left {
          height: expression((m=document.documentElement.clientHeight-100)+'px');
        }
    
        #main {
          height: expression((m=document.documentElement.clientHeight-100)+'px');
          width: expression((m=document.documentElement.clientWidth-120)+'px');
        }
      </style>
      <![endif]-->
    </head>
    <body>
      <div id="top">Title<br /></div>
      <div id="left">LeftNav<br /></div>
      <div id="main">
        <p>
            Lorem ipsum ...<br />
            <!-- just copy above line many times -->
        </p>
      </div>
    </body>
    </html>
    

    也就是说,我不推荐这种方法。它会显著降低已经不是太快的IE6的浏览体验,如 these expressions are evaluated many times .

    还有一点需要注意:我想您最终会使用外部样式表(和脚本),但是如果您想将它们嵌入到XHTML文档中,请使用适合所用脚本或样式语言的CDATA标记和注释,如David Dorward所述。 recommends .

        2
  •  1
  •   Ben    14 年前

    这个HTML应该会给你一些帮助,但是你可能需要处理它才能使它在IE6中完美地工作(对不起,我现在不能在IE6中测试)。出现问题的原因是,HTML和正文上实际上出现了一个滚动条,其中指定了“overflow:hidden”。您可以去掉它,并将overflow设置为auto以实际看到它的发生。

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head>
        <style type="text/css">
            html
            {
                height:100%;
            }
            body
            {
                height:100%;
                margin:0px;
                padding:0px;
                border-left:0px;
                border-right:0px;
                overflow:hidden;
            }
            #header
            {
                top:0px;
                width:100%;
                height:100px;
                 background-color:#dddddd;
                position:absolute;
            }
            #content
            {
                top:100px;
                bottom:0px;
                width:100%;
                overflow:auto;
                position:absolute;
            }
    
            #wrapper
            {
            padding-left:125px;
            }
    
            div#left
        {
            background-color:#dddddd;
            float:left;
            width:120px;
            height:100%;
            overflow:hidden;
        }
        </style>
    </head>
    <body>
        <div id="header"></div>
        <div id="left"></div>
        <div id="content">
        <div id="wrapper"> 
        <p>content</p>
        <p>content</p>
        </div>
    </div>
    </body>
    </html>