IE6 "рамка" макет со 100% высотой и полосами прокрутки - PullRequest
6 голосов
/ 18 мая 2010

Я хочу создать простой макет «рамка» с фиксированным заголовком, фиксированной левой навигационной областью и основной областью содержимого, которая при необходимости заполняет 100% оставшейся части области просмотра полосами прокрутки. Моя лучшая попытка ниже - но когда я добавляю достаточное количество контента в основной div для принудительной прокрутки, я вижу, что полоса прокрутки проходит ниже нижней части области просмотра.

Что я делаю не так? Или что IE6 делает не так и как я могу это исправить?

Обратите внимание: не рекомендуется использовать более новый браузер - я бы с удовольствием, но не смог.

Обновление 1 (для Матти и других пуристов!) - мне приходится жить в реальных условиях разработки веб-приложения для головного офиса группы, к которому должны обращаться пользователи в более чем 100 дочерних компаний, не все из которых были обновлены до современного браузера. А некоторые дочерние компании хотели бы использовать несовместимость браузеров в качестве предлога, чтобы не использовать приложение, навязанное головным офисом!

Обновление 2

Я разработчик приложений, а не веб-дизайнер, что, вероятно, очевидно. На сегодняшний день я использую DOCTYPE HTML 4.0 Transitional, который, как я считаю, форсирует режим причуд во всех версиях IE. Однако недавно я попытался добавить AjaxControlToolkit ModalPopupExtender, и это портит мой макет при отображении всплывающего окна. Google предложил мне использовать XHTML 1.0, чтобы исправить это (AjaxControlToolkit не поддерживает режим причуд), и на самом деле я очень рад перейти к более чистому макету на основе 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 ]

1 голос
/ 18 мая 2010

Этот html должен вам немного помочь, но вам, вероятно, придется возиться с ним, чтобы заставить его отлично работать в ie6 (извините, я не могу проверить в ie6 сейчас). Проблема возникает из-за того, что на html и теле отображается полоса прокрутки, в которой указано переполнение: скрыто. Вы можете снять это и установить переполнение на авто, чтобы фактически увидеть, что это происходит.

<!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>
1 голос
/ 18 мая 2010
1 голос
/ 18 мая 2010

В моем предыдущем ответе я был абсолютно неправ (не каламбур), так как вы не можете указать ни top и bottom в IE6, ни оба left и right. Кроме того, вы не знаете точную ширину и высоту содержимого div, а также не знаете их в процентах от области просмотра.

Когда я решил это, я перевел IE в режим причуд, чтобы получить рамочную модель (см. Также 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 вместе с правилами top и bottom (и др.). Есть способ получить этот похожий на фрейм внешний вид в IE6 в стандартном режиме (точнее, почти в стандартном режиме ), используя CSS-выражения . Таким образом, вы можете позволить движку 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, так как эти выражения оцениваются много раз .

Еще одна заметка: я полагаю, что в конце вы будете использовать внешние таблицы стилей (и скрипты), но если вы хотите встроить их в документ XHTML, используйте «маркеры и комментарии CDATA, подходящие для скрипта или языка стилей» используется », а Дэвид Дорвард рекомендует .

...