HTML-макет: добавление столбца боковой панели к существующему сайту - программирование

HTML-макет: добавление столбца боковой панели к существующему сайту

У меня есть сайт с телом, который выглядит так:

<body>
  <div id="header">...</div>
  <div id="content">...</div>
  <div id="footer">...</div>
</body>

В этих div s не используются абсолютные/относительные трюки позиционирования, но в стилях этих div есть много float s, clear s, margin и padding и их внутренние элементы. Все это дает сайт, который выглядит так:

┌───────────────┐
│     header    │
└───────────────┘
┌───────────────┐
│    content    │
└───────────────┘
┌───────────────┐
│     footer    │
└───────────────┘

Мой вопрос: как добавить один независимый левый столбец фиксированной ширины (боковая панель) с дополнительным контентом, который сократит весь сайт (header-content-footer) и сдвинет их вправо.

┌────┐┌─────────┐
│side││ header  │
│bar │└─────────┘
│    │┌─────────┐
│    ││ content │
│    │└─────────┘
│    │┌─────────┐
│    ││ footer  │
└────┘└─────────┘

Я знаю одно почти идеальное решение, но оно уродливое и требует повторного гнездования существующих div:

<body>
  <table>
    <tr>
      <td id="sidebar">...</td>
      <td>
        <div id="header">...</div>
        <div id="content">...</div>
        <div id="footer">...</div>
      </td>
    </tr>
  </table>
</body>

Можно ли сделать это элегантно, просто добавив один внешний элемент боковой панели где-нибудь в теле, т.е. как?

<body>
  <div id="sidebar">...</div>
  <div id="header">...</div>
  <div id="content">...</div>
  <div id="footer">...</div>
</body>

Я пробовал наивные подходы - например, стиль:

#sidebar { float: left; width: 20em; }

или

#header { margin-left: 20em; }
#content { margin-left: 20em; }
#footer { margin-left: 20em; }

Этот вид работ, но он ломается, как только clear: both или clear: left встречается в заголовке/контенте/нижнем колонтитуле.

Итак, есть ли альтернативы решению таблицы?

4b9b3361

Ответ 1

Мне нравится использовать абсолютно расположенную боковую панель, а затем задавать прописку на обертке по ширине этого элемента. Затем я либо устанавливаю пометку полей для других элементов, либо добавляю их в дополнение к обертке.

http://jsfiddle.net/jAVQv/

<div class="container">
    <div id="sidebar"></div>
    <div id="header"></div>
    <div id="content"></div>
    <div id="footer"></div>
</div>
.container { position:relative; padding:0 0 0 55px; }
#sidebar {
    position:absolute;
    top:0; bottom:0; left:0;
    width:50px;
    background:#000;
}

#header { border:1px solid #000; width:100px; height:20px; 
    margin:0 0 5px 0;
}
#content { border:1px solid #000; width:100px; height:50px;
    margin:5px 0 5px 0;
}
#footer { border:1px solid #000; width:100px; height:20px;
    margin:5px 0 0 0;
}

Ответ 2

Я бы использовал элементы HTML5, чтобы дать смысловое значение разметки.

<body>
  <aside><!-- Nav bar --></aside>
  <article>
    <header>...</header>
    <section>...</section>
    <footer>...</footer>
  </article>
</body>

Затем стиль aside и article с float: left.

Ответ 3

Я сделал немного jsfiddle, чтобы помочь вам начать работу. Также вы можете проверить, не содержит ли ваше содержимое div содержимое всего CSS. Надеюсь, это поможет.

Изменить: все цвета и размеры являются фиктивными, используемыми для примера. Он shookk работает с любым размером.

html:

<body>
  <div id="sidebar">...</div>
  <div id="header">
      <div id="testLeft"></div>
      <div id="testRight"></div>
      <div class="clearFix"></div>
  </div>
  <div id="content">...</div>
  <div id="footer">...</div>
</body>

css:

.clearFix {
    clear: both;
}

#sidebar {
    width: 50px;
    height: 30px;
    background-color: green;
    float: left;
}

#header {
    width: 250px;
    background-color: red;
    margin-left: 55px;
}

#testLeft {
    width: 50px;
    height: 50px;
    float: left;
    background-color: pink;
}

#testRight {
    width: 50px;
    height: 50px;
    margin-left: 55px;
    background-color: purple;
}

#content {
    width: 250px;
    height: 20px;
    background-color: blue;
    margin-left: 55px;
}

#footer {
    width: 250px;
    height: 20px;
    background-color: orange;
    margin-left: 55px;
}