CSS два div рядом друг с другом

Я хочу поставить два <div> рядом друг с другом. Правый <div> имеет размер около 200 пикселей; а левый <div> должен заполнять остальную ширину экрана? Как я могу это сделать?

Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
241
0
585 189
13
Перейти к ответу Данный вопрос помечен как решенный

Ответы 13

К сожалению, в общем случае решить эту задачу нетривиально. Проще всего было бы добавить свойство в стиле css "float: right;" к вашему 200px-div, однако это также приведет к тому, что ваш "main" -div будет фактически иметь полную ширину, и любой текст в нем будет плавать по краю 200px-div, что часто выглядит странно, в зависимости от содержимого (в значительной степени во всех случаях, кроме плавающего изображения).

Обновлено: Как предположил Дом, проблема упаковки, конечно, может быть решена с запасом. Дурак я.

'float: left' будет более подходящим, lft div требуется для охвата всей левой области. Никаких обид, просто подумайте.

M.N 15.01.2009 12:03
Ответ принят как подходящий

Вы можете использовать Flexbox для размещения своих элементов:

#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. Flexbox может делать довольно удивительные вещи.


Для поддержки старых браузеров вы можете использовать свойства CSS плавать и ширина, чтобы решить эту проблему.

#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>

На самом деле это правильный ответ, он краток и - в отличие от двух приведенных выше - полностью самодостаточен. Лучшие ответы на SO должны быть такими, IMO. +1

Bobby Jack 02.06.2010 14:30

Уточните, почему слева должен быть float:left? В вашем комментарии к моему ответу говорится: «lft div требуется для охвата всей левой области», но float:left заставит его плотно обернуть содержимое.

falstro 14.02.2011 10:54

Этот ответ не совсем правильный, и очень неприятно видеть, что за него так много голосов. Это создает очень нестабильный макет. Я бы посоветовал поместить два div в контейнер и использовать свойство display: inline-block, чтобы выровнять div, как предлагали некоторые другие ответы. Я никого не критикую, так как мы все здесь, чтобы помогать друг другу, поэтому, помимо придирчивости, спасибо M.N. за ваш вклад в это сообщество.

Mussser 17.07.2014 20:37

НО следует отметить, что встроенный блок не будет работать в более старых версиях IE ...

Mussser 17.07.2014 20:41

@Mussser Я согласен с вашим комментарием, но имейте в виду, что этот ответ пришел из 2009 года ... времени, когда то, что вы называете "старыми версиями Ie" (то есть IE8 и ниже), было "текущими" версиями IE ...

Laurent S. 06.02.2015 17:14

@Bartdude truuuuu, должно быть, я не обращал такого пристального внимания на даты. Ты прав

Mussser 10.02.2015 22:07

Я что-то упустил? Добавление float: left; в div2 нарушает макет: jsfiddle.net/2fmwmrh3. Удалите его, и он отлично работает. Боковое примечание: div2 не может быть слева от себя, как предполагает этот ответ.

Nateowami 21.03.2015 11:13

Просто используйте 2 пролета. Простой.

sproketboy 24.02.2021 14:09

Перефразируя один из моих веб-сайтов, который делает нечто подобное:

<!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>

Не я, но я бы предположил, что хаки CSS, переходный тип документа или отсутствие объяснения?

annakata 21.01.2009 13:47

По крайней мере, у него был doctype :) Я предполагаю, что людям не нравятся хаки браузера для полей в IE. По крайней мере, я это тестировал ...

Rowland Shaw 26.01.2009 16:04

Это слишком взломано. Есть много решений, которые гораздо более лаконичны.

John Bell 06.06.2017 17:48

@JohnBell, возможно, это проблема времени - это было разумное решение в то время (более 8 лет назад), но с тех пор браузерные технологии пошли дальше. Как ни странно, некоторые из других ответов, современников моего, которые предлагают ту же идею, набрали больше очков (например, Дэвид, через две минуты после моего)

Rowland Shaw 07.06.2017 17:01

Метод, предложенный @roe и @MohitNanda, работает, но если правильный div установлен как float:right;, тогда он должен быть первым в исходном HTML. Это нарушает порядок чтения слева направо, что может сбивать с толку, если страница отображается с отключенными стилями. В этом случае лучше использовать div-обертку и абсолютное позиционирование:

<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>

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

left right

Редактировать: Хм, интересно. В окне предварительного просмотра отображаются правильно отформатированные блоки div, а в обработанном элементе сообщения - нет. Извините, вам придется попробовать это на себе.

Как все уже отмечали, вы сделаете это, установив float:right; для содержимого RHS и отрицательный запас на LHS.

Однако ... если вы не используете float: left; на LHS (как это делает Mohit), то вы получите эффект пошагового выполнения, потому что div LHS по-прежнему будет занимать пространство полей в макете.

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

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

Однако .. эта проблема может быть решено с поплавками с некоторой дополнительной разметкой

(предостережение: я не одобряю div .clearing в этом примере, подробности см. в здесь)

Учитывая все обстоятельства, я думаю, что большинство из нас хотели бы иметь нежадную ширину: оставаясь в CSS3 ...

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

Это будет работать нормально, если вы установите clear: both для элемента, который разделяет эти два блока столбцов.

При использовании поплавков необходимо установить свойство ширины. Так что я не думаю, что это хорошее решение ..

Martijn 04.12.2009 16:59

Я не знаю, актуальна ли эта проблема или нет, но я столкнулся с той же проблемой и использовал тег CSS display: inline-block;. Оберните их в div, чтобы их можно было расположить соответствующим образом.

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

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

Это было для меня решением. Я хотел два смежных блока типа [] [] (чувак, я давно не делал этого ..) =) Престижность.

Partack 29.07.2011 07:17

Этот тоже у меня сработал. У меня были проблемы с другим float: right'd div, подталкивающим мой div в правом столбце вниз под левым, поэтому я также заставил контейнер использовать display: inline-block, и это «решило».

Martin 07.12.2011 02:04

Это не работает, если содержимое в Content1 DIV велико. В результате DIV находятся на двух отдельных строках, а не бок о бок.

Richard Hollis 17.04.2012 14:02

@RichardHollis Мне удалось установить свойство width всех моих двух div рядом друг с другом, чтобы предотвратить перенос второго на новую строку.

Trindaz 16.05.2012 22:10

Это лучше, чем float, если вы не хотите указывать ширину для внутренних div.

Paul Syfrett 25.10.2012 22:14

добавить css vertical-align: top; к обоим также, иначе они будут толкать друг друга, если длина содержимого отличается

prospector 10.09.2014 10:25

Это работает в простых случаях, но плохо работает в сложных случаях. Я пришел сюда, потому что если вы вложите div вместо текста «content1», тогда браузеры запутаются в том, где «начинается» строка, и все сломается. Если вы поместите хотя бы одну букву содержимого в самый внешний встроенный блок div ... он отлично работает. Встроенный блок AFAICS не заслуживает доверия (осень 2014 г.)

Adam 03.10.2014 19:10

@Adam: inline-block полностью заслуживает доверия, но есть некоторые проблемы, о которых вам нужно знать, чтобы исправить их прямо сейчас; Основная проблема - это символ «возврата каретки», который отображается как пробел между блоками, но есть несколько простых способов исправить это. Конечно, есть сложные случаи, но float далеко не прост в сложных случаях и легко может сломаться.

Laurent S. 06.02.2015 17:17

@Bartdude, как исправить проблему с "возвратом каретки"?

gaitat 24.06.2015 05:20

@gaitat cfr эта статья, содержащий все возможные исправления. Один "комментарий", безусловно, мой любимый, а остальные я использую только тогда, когда он не подходит (единственный пример, который я могу придумать, это CMS - Sharepoint, чтобы не называть его - удаление комментариев)

Laurent S. 24.06.2015 10:13

Это работает, но в случае более длинного текста мне пришлось установить максимальную ширину элементов.

kodu 23.06.2017 13:45

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

Я столкнулся с той же проблемой, и версия Mohits работает. Если вы хотите сохранить порядок левого и правого в html, просто попробуйте это. В моем случае левый div регулирует размер, правый div остается шириной 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;
}

Хитрость заключается в том, чтобы использовать правое заполнение в основном поле, но использовать это пространство снова, снова поместив правое поле с помощью margin-right.

У меня это не работает без поплавка: прямо в .right.

Jussi Palo 22.01.2015 13:10

Это не будет ответом для всех, поскольку он не поддерживается в IE7-, но вы можете использовать его, а затем использовать альтернативный ответ для IE7-. Это display: table, display: table-row и display: table-cell. Обратите внимание, что здесь используются не таблицы для макета, а стили div, чтобы все было хорошо выстроено без всех хлопот сверху. У меня приложение 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;
 }

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

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

Просто сделайте родительский div на всю ширину и поместите его внутри.

ОБНОВИТЬ

Если вам нужно разместить элементы в ряд, вы можете использовать Макет 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 для позиционирования div, но работает нормально.

Вы можете создать таблицу 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;, чтобы очистить позицию.

Таблицы - гораздо более предсказуемое решение, чем постоянно меняющийся «float», который, кажется, всегда что-то портит, когда вы добавляете или удаляете элементы.

Kokodoko 23.06.2014 17:22

Это прекрасное решение, если вы работаете с электронной почтой.

Zac Clancy 18.09.2014 20:46

Я использую смесь float и overflow-x: hidden. Минимальный код, всегда работает.

https://jsfiddle.net/9934sc4d/4/ - ПЛЮС вам не нужно очищать поплавок!

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

Полезно, когда вы знаете высоту div и знаете, что содержимое не длиннее этой высоты. Однако, когда содержимого больше, чем высота div, он скрывается из-за переполнения ...

Martijn 14.08.2015 10:12

Это действительно лучше :)

Martijn 14.08.2015 10:15

Хороший! Приятно видеть людей, поддерживающих полезные и положительные отзывы, а не неконструктивные отрицательные. Хороший человек @Martijn

Tony Ray Tansley 14.08.2015 10:18

Спасибо тебе за это. Большую часть работы с пользовательским интерфейсом я выполняю в React Native, и flex box там работает намного лучше, чем в HTML + CSS (на мой взгляд). Это сделало мою жизнь намного проще.

Eric Wiener 07.04.2020 19:21

Другие вопросы по теме