2 стовпчаста компонування: правий стовпчик із фіксованою шириною, ліва рідина


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 потрібний правий стовпець перед лівим.

Якщо праворуч має поплавок (і ширину), а якщо лівий стовпець не має ширини і не поплавця, він буде гнучким :)

Застосуйте також overflow: hiddenі деяку висоту (може бути автоматичною) до зовнішнього діва, щоб він оточував обидва внутрішні знаки.

Нарешті, у лівому стовпчику додайте а, 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 всередині будь-якого стовпця не впливатиме на зовнішні поплавці. Це не є "тендітним", якщо ви не розмістите поле на одному рівні стовпців між стовпцями, якщо розмістити його в кінці, шкоди не буде зроблено.
jackJoe

6
Я б розглядав приклад Адама. Я не думаю, що це гарна ідея ставити правий стовпець перед лівим стовпцем у розмітці html.
Danny_Joris

1
@Danny_Joris Я згоден. Крім того, якщо ви використовуєте медіа-запити, зараз важко натиснути правий стовпець під лівим стовпцем
andrewtweber

2
Для тих , хто цікавиться , як це працює, пояснення можна знайти тут: stackoverflow.com/questions/25475822 / ...
Хаш Qolami

1
Цікаво, чи є спосіб мати правий стовпчик ПІСЛЯ лівого, щоб він належним чином укладався (не використовуючи флексбокс)
Домінік

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-порядок!
користувач1794295

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 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
Мені подобається, що це "чисте" рішення. Однак, єдиною проблемою з розміщенням ваших divs в режимі стільникової таблиці є те, що ви також можете використовувати Tables & Tds. І ви
втратите

Це несправедливо, тому що це рішення є принаймні семантично правильним та доброзичливим щодо просто технологій RWD, тоді як використовувати a tableз tds, звичайно, це не так!
ianp

Цей метод легко дозволяє медіа-запиту скинути таблицю для звичайних дівок, якщо стовпці звузяться. Приємно і чисто. Мені подобається.
АнтонійВО

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>

Альтернативним рішенням є використання дисплея: стільникова комірка ; що призводить до рівних висот стовпців.


другий стовпець праворуч не працюватиме. якщо лівий стовпець містить повний текст, правий стовпець відображатиметься як новий рядок.
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;

}

помістіть прозорий роздільник під лівий і правий контейнер.


-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, consectetuer adipiscing elit. Phasellus varius eleifend. Lorem ipsum dolor sit amet, consectetuer 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.