CSS два діви поруч


230

Я хочу поставити два <div>s один біля одного. Справа <div>- близько 200 пікселів; а ліва <div>повинна заповнити решту ширини екрана? Як я можу це зробити?

Відповіді:


421

Ви можете використовувати флексбокс для викладки своїх елементів:

#parent {
  display: flex;
}
#narrow {
  width: 200px;
  background: lightblue;
  /* Just so it's visible */
}
#wide {
  flex: 1;
  /* Grow to rest of container */
  background: lightgreen;
  /* Just so it's visible */
}
<div id="parent">
  <div id="wide">Wide (rest of width)</div>
  <div id="narrow">Narrow (200px)</div>
</div>

Це в основному просто вискоблювання поверхні флексбоксу. Flexbox може робити дуже дивовижні речі.


Для старшої підтримки браузера ви можете використовувати властивості CSS float та ширини для її вирішення.

#narrow {
  float: right;
  width: 200px;
  background: lightblue;
}
#wide {
  float: left;
  width: calc(100% - 200px);
  background: lightgreen;
}
<div id="parent">
  <div id="wide">Wide (rest of width)</div>
  <div id="narrow">Narrow (200px)</div>
</div>


14
Це насправді правильна відповідь, лаконічна і - на відміну від двох, що перебувають над нею, - повністю самодостатня. Найкращі відповіді на SO повинні бути саме такими, IMO. +1
Боббі Джек

Потрібно розібратися, навіщо ліворуч float:left? Ваш коментар до моєї відповіді говорить про те, що "lft div потрібен проміжок всієї лівої області", але це float:leftпризведе до того, щоб він змістив вміст щільно.
falstro

14
Ця відповідь не зовсім коректна, і це досить засмучує те, що настільки її схвалили. Це створює макет, який є дуже нестабільним. Я б радив помістити два діви в контейнер і використовувати display: властивість inline-block для того, щоб діви вирівнювались, як підказують деякі інші відповіді. Я нікого не критикую, оскільки ми всі тут, щоб допомогти один одному, тому, крім мого збирання ніт, дякую МН за ваш внесок у цю громаду.
Мюссер

1
Але варто зазначити одне, що вбудований блок не працюватиме в старих версіях IE ...
Mussser

3
@Mussser Я згоден з вашим коментарем, але майте на увазі, що ця відповідь приходить з 2009 року ... час, коли ви називали "старіші версії Ie" (тобто: IE8 і нижче) були "поточними" версіями IE ...
Лоран С.

139

Я не знаю, чи це все ще актуальна проблема чи ні, але я просто зіткнувся з тією ж проблемою і використав display: inline-block;тег CSS . Загортання їх у діви, щоб їх можна було розмістити належним чином.

<div>
    <div style="display: inline-block;">Content1</div>
    <div style="display: inline-block;">Content2</div>
</div>

Зауважте, що використання атрибуту стилю вбудованого типу використовувалося лише для стислість цього прикладу, звичайно, що вони використовуються для переміщення у зовнішній файл CSS.


1
Це було рішенням для мене. Мені хотілося, щоб дві діви були поруч, як [] [] (людина минув такий час, як я це зробив ..) =) kudos.
Партак

Цей працював і для мене. У мене виникли деякі проблеми з іншим float: right'd div штовхав мій правий колон DIV нижче лівого, тому я також зробив дисплей використання контейнера: inline-block, і це 'вирішило це.
Мартін Карні

5
Це не працює, коли вміст великий у Content1 DIV. Результат полягає в тому, що DIV розташовані на двох окремих лініях замість бічних.
Річард Холліс

@RichardHollis Мені вдалося встановити widthвластивість усіх моїх 2 дивів поруч один з одним, щоб запобігти перетворенню другого на новий рядок.
Тріндаз

1
додайте css вертикально-вирівняти: зверху; і те й інше, інакше вони будуть штовхати один одного вниз, якщо довжина вмісту відрізняється
проспектор

27

На жаль, це не тривіальна річ для загальної справи. Найпростіше було б додати властивість у стилі css "float: right;" до вашого розпізнавача 200px, однак, це також призведе до того, що ваш "головний" -div насправді буде на повну ширину, і будь-який текст там буде плавати навколо краю 200px-div, який часто виглядає дивним, залежно від вмісту (досить багато у всіх випадках, за винятком випадків, коли це плаваюче зображення).

EDIT: Як запропонував Дом, проблему обгортання, звичайно, можна було б вирішити з запасом. Дурний мене.


1
"float: left" буде більш підходящим, для лівого ділянки потрібен лівий розділовий проміжок. Жодних правопорушень не означало, просто врахуйте.
MN

19

Метод, запропонований @roe та @MohitNanda, працює, але якщо правильний div встановлений як float:right;, то він повинен бути першим у джерелі HTML. Це порушує порядок читання зліва направо, що може бути заплутаним, якщо сторінка відображатиметься із вимкненими стилями. Якщо це так, можливо, краще використовувати обгортковий розділ і абсолютне позиціонування:

<div id="wrap" style="position:relative;">
    <div id="left" style="margin-right:201px;border:1px solid red;">left</div>
    <div id="right" style="position:absolute;width:200px;right:0;top:0;border:1px solid blue;">right</div>
</div>

Продемонстровано:

ліво право

Правка: Хм, цікаво. У вікні попереднього перегляду відображаються правильно відформатовані знаки, але викладений пост не відповідає. Вибачте, вам доведеться спробувати це на собі.


15

Я сьогодні зіткнувся з цією проблемою. Виходячи з вищезазначених рішень, для мене це спрацювало:

<div style="width:100%;"> 
    <div style="float:left;">Content left div</div> 
    <div style="float:right;">Content right div</div> 
</div> 

Просто змусіть батьківський діл перейти на повну ширину і промальовувати діви, що містяться всередині.


8

ОНОВЛЕННЯ

Якщо вам потрібно розмістити елементи в ряд, ви можете використовувати макет Flex . Тут у вас є ще один підручник з Flex . Це чудовий інструмент CSS, і хоча він не на 100% сумісний, його підтримка з кожним днем стає все кращою. Це працює так само просто, як:

HTML

<div class="container">
    <div class="contentA"></div>
    <div class="contentB"></div>
</div>

CSS

.container {
    display: flex;
    width: 100%;
    height: 200px;
}

.contentA {
    flex: 1;
}

.contentB {
    flex: 3;
}

І ось що ви отримуєте тут - це контейнер із загальним розміром 4 одиниці, який розділяє простір зі своїми дітьми у співвідношенні 1/4 та 3/4.

Я зробив приклад у CodePen, який вирішує вашу проблему. Я сподіваюся, що це допомагає.

http://codepen.io/timbergus/pen/aOoQLR?editors=110

ДУЖЕ СТАРИЙ

Можливо, це просто дурниця, але ви спробували зі столом? Він не використовує безпосередньо CSS для позиціонування дівок, але працює чудово.

Ви можете створити таблицю 1x2 і помістити свою divsвнутрішню частину, а потім відформатувати таблицю за допомогою CSS, щоб розмістити їх так, як вам потрібно:

<table>
  <tr>
    <td>
      <div></div>
    </td>
    <td>
      <div></div>
    </td>
  </tr>
</table>

Примітка

Якщо ви хочете , щоб уникнути з допомогою таблиці, як було сказано раніше, ви можете використовувати float: left;і float: right;і в наступний елемент, не забудьте додати clear: left;, clear: right;або clear: both;для того , щоб мати місце очищено.


Таблиці є набагато більш передбачуваним рішенням, ніж постійно змінюється "поплавок", який завжди, здається, щось зіпсує, коли ви додаєте або видаляєте елементи.
Кокодоко

Це прекрасне рішення, якщо ви працюєте з електронними листами.
Зак Клансі

6
div1 {
    float: right;
} 
div2 {
    float: left;
}

Це буде добре, поки ви встановите clear: bothдля елемента, який розділяє цей два колонки.


3
Використовуючи поплавці, ви повинні встановити властивість ширини. Тому я не думаю, що це вдале рішення ..
Martijn

4

Я зіткнувся з тією ж проблемою, і версія Mohits працює. Якщо ви хочете зберегти ліво-правий порядок у HTML, просто спробуйте це. У моєму випадку лівий розділ регулює розмір, правий - на ширині 260 пікселів.

HTML

<div class="box">
<div class="left">Hello</div>
<div class="right">World</div>
</div>

CSS

.box {
    height: 200px;
    padding-right: 260px;
}    

.box .left {
    float: left;
    height: 200px;
    width: 100%;
}

.box .right {
    height: 200px;
    width: 260px;
    margin-right: -260px;
}

Трюк полягає у використанні правої підкладки на основній коробці, але використовувати цей простір знову, розмістивши правий ящик знову з правою межею.


У мене не виходить, що це працює без поплавця: прямо, прямо.
Jussi Palo

3

Я використовую суміш float і overflow-x: hidden. Мінімальний код, завжди працює.

https://jsfiddle.net/9934sc4d/4/ - ПЛЮС не потрібно очищати свій поплавок!

.left-half{
    width:200px;
    float:left;
}
.right-half{
    overflow-x:hidden;
}

1
Корисно, коли ви знаєте висоту діва і знаєте, що вміст не довший цієї висоти. Однак, коли вмісту більше, ніж висота діва, це приховано, через перелив ...
Мартін

1
Це справді краще :)
Martijn

1
Приємно! приємно бачити людей, які годують підкладку корисними та позитивними відгуками, а не неконструктивними негативними відгуками. Good man @Martijn
Tony Ray Tansley

Дякую за це. Я роблю більшу частину своєї роботи інтерфейсу в React Native та flex box, що працює набагато краще, ніж у HTML + CSS (на мій погляд). Це значно полегшило моє життя.
Ерік Вінер

2

Як усі зазначали, ви зробите це, встановивши а float:right; на вміст RHS та від'ємну маржу на LHS.

Однак .. якщо ви не використовуєте float: left; LHS (як це робить Mohit), тоді ви отримаєте ступінчастий ефект, тому що LHS div все ще буде споживати маржинальний простір у макеті.

Однак .. LHS-поплавок зменшить вміст, тому вам потрібно буде вставити доменний код із заданою шириною, якщо це не прийнятно, і тоді ви, можливо, також визначили ширину на батьківському рівні.

Однак .. як зазначає Девід, ви можете змінити порядок читання розмітки, щоб уникнути вимоги LHS float, але це має читабельність та, можливо, проблеми з доступністю.

Однак .. цю проблему можна вирішити за допомогою поплавків, надавши додаткову розмітку

(застереження: Я не схвалюю .clearing div у цьому прикладі, дивіться тут деталі)

Зважаючи на все, я думаю, що більшість із нас бажає, щоб не було жадної ширини: залишаючись у CSS3 ...


2

Це не буде відповіддю для всіх, оскільки він не підтримується в IE7-, але ви можете використовувати його, а потім використовувати альтернативну відповідь для IE7-. Це відображення: таблиця, дисплей: рядок таблиці та дисплей: таблиця-комірка. Зауважте, що це не використання таблиць для компонування, а стилізація дівок, щоб все добре вирівнялося з усіма клопотами зверху. Mine - це додаток html5, тому він чудово працює.

У цій статті показаний приклад: http://www.sitepoint.com/table-based-layout-is-the-next-big-thing/

Ось як виглядатиме ваш таблиця стилів:

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

 .left-column {
    display: table-cell;
 }

 .right-column {
    display: table-cell;
    width: 200px;
 }

-1

Перефразовуючи один із моїх веб-сайтів, який робить щось подібне:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <style TYPE="text/css"><!--

.section {
    _float: right; 
    margin-right: 210px;
    _margin-right: 10px;
    _width: expression( (document.body.clientWidth - 250) + "px");
}

.navbar {
    margin: 10px 0;
    float: right;
    width: 200px;
    padding: 9pt 0;
}

  --></style>
 </head>
 <body>
  <div class="navbar">
  This will take up the right hand side
  </div>
  <div class="section">
  This will fill go to the left of the "navbar" div
  </div>
 </body>
</html>

4
Не я, але я б здогадався, що хаки CSS, перехідний вчення чи відсутність пояснень?
annakata

Принаймні, він мав доктіп :) Напевно, це можуть бути люди, які не люблять хакерства браузера за націнки на IE. Принаймні, я перевірив це ...
Роуленд Шоу,

Це занадто хакі. Є безліч рішень, які набагато більш стислі.
Джон Белл

@JohnBell, можливо, це проблема в часі - це було розумним рішенням у той час (більше 8 років тому), але з тих пір браузерна технологія почала працювати. Суворо деякі інші відповіді сучасного мого, які пропонують ту саму ідею набрали кращий результат (наприклад, у Девіда через дві хвилини після мого)
Роуланд Шоу

-7

просто використовуйте z-індекс і все буде сидіти добре. переконайтеся, що позиції позначені як фіксовані або абсолютні. тоді нічого не буде рухатися навколо, як з тегом float.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.