Схема расположения двух столбцов: правая колонка с фиксированной шириной, левая жидкость


158

Мое требование простое: 2 столбца, где правильный столбец имеет фиксированный размер . К сожалению, я не смог найти работающее решение, ни на stackoverflow, ни в Google. Каждое решение, описанное там, терпит неудачу, если я реализую в своем собственном контексте Текущее решение:

div.container {
    position: fixed;
    float: left;
    top: 100px;
    width: 100%;
    clear: both;
}

#content {
    margin-right: 265px;
}

#right {
    float: right;
    width: 225px;
    margin-left: -225px;
}

#right, #content {
    height: 1%; /* fixed for IE, although doesn't seem to work */
    padding: 20px;
}
<div class="container">
    <div id="content">
        fooburg content
    </div>
    <div id="right">
        test right
    </div>
</div>

Я получаю следующее с кодом выше:

|----------------------- -------|
| fooburg content  |            |
|-------------------------------|
|                  | test right | 
|----------------------- -------|

Пожалуйста, порекомендуйте. Большое спасибо!

Ответы:


268

Уберите поплавок в левой колонке.

В HTML-коде правый столбец должен предшествовать левому.

Если у правого есть float (и ширина), и если левый столбец не имеет ширины и не имеет float, он будет гибким :)

Также примените к overflow: hiddenнекоторому внешнему элементу div некоторую высоту (может быть автоматической), чтобы он окружал оба внутренних элемента.

Наконец, в левом столбце добавьте a width: autoи overflow: hidden, это сделает левый столбец независимым от правого (например, если вы изменили размер окна браузера, а правый столбец коснулся левого, без этих свойств левый столбец запустится правый, с этими свойствами он остается в своем пространстве).

Пример HTML:

<div class="container">
    <div class="right">
        right content fixed width
    </div>
    <div class="left">
        left content flexible width
    </div>
</div>

CSS:

.container {
   height: auto;
   overflow: hidden;
}

.right {
    width: 180px;
    float: right;
    background: #aafed6;
}

.left {
    float: none; /* not needed, just for clarification */
    background: #e8f6fe;
    /* the next props are meant to keep this block independent from the other floated one */
    width: auto;
    overflow: hidden;
}​​

Пример здесь: http://jsfiddle.net/jackJoe/fxWg7/


2
@Mir A clear: both внутри любого из столбцов не повлияет на внешние поплавки. Это не «хрупкий», если вы не разместите клир на одном уровне столбцов между столбцами, если вы поместите его в конце, никакого вреда не будет.
ДжекДжо

6
Я хотел бы рассмотреть пример Адама. Я не думаю, что это хорошая идея, чтобы поставить правый столбец перед левым столбцом в HTML-разметке.
Danny_Joris

1
@Danny_Joris Я согласен. Кроме того, если вы используете медиазапросы, теперь трудно нажать правую колонку ниже левой колонки
andrewtweber

2
Для тех, кому интересно, как это работает, объяснение можно найти здесь: stackoverflow.com/questions/25475822/…
Hashem Qolami

1
Интересно, есть ли способ иметь правую колонку ПОСЛЕ левой, чтобы она правильно складывалась (без использования flexbox)
Доминик

71

См. Http://www.alistapart.com/articles/negativemargins/ , это именно то, что вам нужно ( пример 4 там).

<div id="container">
    <div id="content">
        <h1>content</h1>
        <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.  Phasellus varius eleifend tellus. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Nulla facilisi. Sed wisi lectus, placerat nec, mollis quis, posuere eget, arcu.</p>
        <p class="last">Donec euismod. Praesent mauris mi, adipiscing non, mollis eget, adipiscing ac, erat. Integer nonummy mauris sit amet metus. In adipiscing, ligula ultrices dictum vehicula, eros turpis lacinia libero, sed aliquet urna diam sed tellus. Etiam semper sapien eget metus.</p>
    </div>
</div>

<div id="sidebar">
    <h1>sidebar</h1>
    <ul>
        <li>link one</li>
        <li>link two</li>
    </ul>
</div>

#container {
    width: 100%;
    background: #f1f2ea url(background.gif) repeat-y right;
    float: left;
    margin-right: -200px;
}
#content {
    background: #f1f2ea;
    margin-right: 200px;
}
#sidebar {
    width: 200px;
    float: right;

1
Фантастическое, простое решение и правильный HTML-порядок тоже!
user1794295

3
Это лучше, чем принятое решение, потому что разметка находится в правильном порядке.
Петри Лехтинен

Я не знал об этом. Как я не знал об этом. Отлично! Я пытался сделать весь «текучий ввод, кнопка поиска с фиксированной шириной», и, очевидно, порядок источника здесь действительно важен. Это прибивает это. Спасибо!
Малабарский фронт

Мне нравится это решение, потому что при наступлении точки останова для мобильных устройств правые столбцы / боковая панель появятся ниже, а не над содержимым левого столбца.
dougtesting.net

я не мог получить правильный столбец, чтобы пойти к вершине с этим методом.
mulllhausen

29

Лучше всего избегать размещения правого столбца перед левым, просто используйте отрицательное правое поле.

И будьте «отзывчивыми», включив параметр @media, чтобы правый столбец падал под левым на узких экранах.

<div style="background: #f1f2ea;">
  <div id="container">
    <div id="content">
        <strong>Column 1 - content</strong>
    </div>
  </div>
  <div id="sidebar">
    <strong>Column 2 - sidebar</strong>
  </div>
<div style="clear:both"></div>

<style type="text/css">
#container {
    margin-right: -300px;
    float:left;
    width:100%;
}
#content {
    margin-right: 320px; /* 20px added for center margin */
}
#sidebar {
    width:300px;
    float:left
}
@media (max-width: 480px) {
    #container {
        margin-right:0px;
        margin-bottom:20px;
    }
    #content {
        margin-right:0px;
        width:100%;
    }
    #sidebar {
        clear:left;
    }
}
</style>

1
Отличное решение. Хранение справа внизу слева в HTML имеет решающее значение для макетов, таких как блоги, где левый имеет более важный контент.
Джейк

3
Отличный ответ! Вот рабочий пример на Codepen: codepen.io/martinkrulltott/pen/yNxezM
Мартин

11

Самое простое и гибкое решение на сегодняшний день table display:

HTML, левый div идет первым, правый div идет вторым ... мы читаем и пишем слева направо, поэтому нет смысла помещать div справа налево

<div class="container">
    <div class="left">
        left content flexible width
    </div>
    <div class="right">
        right content fixed width
    </div>
</div>

CSS:

.container {
  display: table;
  width: 100%;
}

.left {
  display: table-cell;
  width: (whatever you want: 100%, 150px, auto)
}​​

.right {
  display: table-cell;
  width: (whatever you want: 100%, 150px, auto)
}

Примеры случаев:

// One div is 150px fixed width ; the other takes the rest of the width
.left {width: 150px} .right {width: 100%}

// One div is auto to its inner width ; the other takes the rest of the width
.left {width: 100%} .right {width: auto}

Хорошо, хорошо сработало, спасибо. Иногда есть время и место для таблиц, когда flexbox не является жизнеспособной альтернативой. Вместо того, чтобы помещать правильный контент раньше в DOM, который не складывается должным образом ..
Доминик

1
Мне нравится, что это «чистое» решение. Тем не менее, единственная проблема с переводом ваших элементов div в режим ячейки таблицы состоит в том, что вы также можете использовать Tables & Tds. И в конечном итоге вы
потеряете

Это несправедливо, потому что это решение, по крайней мере, семантически правильно и дружественно по отношению к простым методам RWD, в то время как использование a tableс tds наверняка не так!
IanP

Этот метод легко позволяет медиазапросу отбрасывать таблицу для регулярных делений, если столбцы сужаются. Красиво и чисто. Мне нравиться.
AnthonyVO

6

Я хотел бы предложить еще не упомянутое решение: использовать CSS3 calc()для смешивания %и pxединиц измерения. calc()в настоящее время имеет отличную поддержку и позволяет быстро создавать довольно сложные макеты.

Вот ссылка JSFiddle для кода ниже.

HTML:

<div class="sidebar">
  sidebar fixed width
</div>
<div class="content">
  content flexible width
</div>

CSS:

.sidebar {
    width: 180px;
    float: right;
    background: green;
}

.content {
    width: calc(100% - 180px);
    background: orange;
}

А вот еще один JSFiddle, демонстрирующий эту концепцию, примененную к более сложной компоновке. Я использовал SCSS здесь, поскольку его переменные допускают гибкий и информативный код, но макет может быть легко воссоздан в чистом CSS, если наличие «жестко закодированных» значений не является проблемой.


2

Это общее, упорядоченное исходное решение HTML, где:

  • Первый столбец в порядке источника - жидкость
  • Второй столбец в исходном порядке исправлен
    • Этот столбец можно перемещать влево или вправо с помощью CSS

Фиксированный / второй столбец справа

#wrapper {
  margin-right: 200px;
}
#content {
  float: left;
  width: 100%;
  background-color: powderblue;
}
#sidebar {
  float: right;
  width: 200px;
  margin-right: -200px;
  background-color: palevioletred;
}
#cleared {
  clear: both;
}
<div id="wrapper">
  <div id="content">Column 1 (fluid)</div>
  <div id="sidebar">Column 2 (fixed)</div>
  <div id="cleared"></div>
</div>

Фиксированный / второй столбец слева

#wrapper {
  margin-left: 200px;
}
#content {
  float: right;
  width: 100%;
  background-color: powderblue;
}
#sidebar {
  float: left;
  width: 200px;
  margin-left: -200px;
  background-color: palevioletred;
}
#cleared {
  clear: both;
}
<div id="wrapper">
  <div id="content">Column 1 (fluid)</div>
  <div id="sidebar">Column 2 (fixed)</div>
  <div id="cleared"></div>
</div>

Альтернативным решением является использование отображения: table-cell ; что приводит к столбцам одинаковой высоты.


Второй столбец справа не будет работать. если левый столбец заполнен текстом, ваш правый столбец будет отображаться в виде новой строки.
TomSawyer

Вы когда-нибудь пытались разместить больше контента и изменить его размер. просто проверил ваш код и не работал.
TomSawyer

@ TomSawyer Я не уверен, о чем ты говоришь. Вот я пытаюсь разместить больше контента: jsfiddle.net/salman/mva6cnxL и jsfiddle.net/salman/mva6cnxL/1 . Работает без нареканий.
Салман А

Как раз то, что я искал. Спасибо

0

Эй, что вы можете сделать, это применить фиксированную ширину к обоим контейнерам, а затем использовать другой класс div, где ясно: оба, как

div#left {

width: 600px;
float: left;
}

div#right {

width: 240px;
float: right;

}

div.clear {

clear:both;

}

Поместите прозрачный div под левый и правый контейнер.


-3

Я упростил это: я отредактировал ответ Джекджо. Высота авто и т.д не обязательна я думаю.

CSS:

#container {
position: relative;
margin:0 auto;
width: 1000px;
background: #C63;
padding: 10px;
}

#leftCol {
background: #e8f6fe;
width: auto;
}

#rightCol {
float:right;
width:30%;
background: #aafed6;
}

.box {
position:relative;
clear:both;
background:#F39;
 }
</style>

HTML:

<div id="container">

  <div id="rightCol"> 
   <p>Lorem ipsum dolor sit amet,consectetuer adipiscing elit. Phasellus varius eleifend. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Phasellus varius eleifend.</p>

  <p>Lorem ipsum dolor sit amet,consectetuer adipiscing elit. Phasellus varius eleifend. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Phasellus varius eleifend.</p>
 </div>

 <div id="leftCol">

   <p>Lorem ipsum dolor sit amet,consectetuer adipiscing elit. Phasellus varius eleifend. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Phasellus varius eleifend.</p>

  <p>Lorem ipsum dolor sit amet,consectetuer adipiscing elit. Phasellus varius eleifend. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Phasellus varius eleifend.</p>
  <p>Lorem ipsum dolor sit amet,consectetuer adipiscing elit. Phasellus varius eleifend. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Phasellus varius eleifend.</p>

Lorem Ipsum Dolor Sit Amet, посвященный Aditiscing Elit. Phasellus varius eleifend. Lorem ipsum dolor sit amet, concetetuer adipiscing elit.Phasellus varius eleifend.

</div>

</div>

<div class="box">
  <p>Lorem ipsum dolor sit amet,consectetuer adipiscing elit. Phasellus varius eleifend. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Phasellus varius eleifend.</p>

  <p>Lorem ipsum dolor sit amet,consectetuer adipiscing elit. Phasellus varius eleifend. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Phasellus varius eleifend.</p>
  <p>Lorem ipsum dolor sit amet,consectetuer adipiscing elit. Phasellus varius eleifend. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Phasellus varius eleifend.</p>
</div>

Исходный вопрос требует правой колонки с фиксированным размером.
Доктор Аарон Дишно
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.