Как сделать так, чтобы div заполнял оставшееся горизонтальное пространство?

У меня 2 div: один слева и один справа на моей странице. Тот, что слева, имеет фиксированную ширину, и я хочу, чтобы один с правой стороны заполнил оставшееся пространство.

#search {
  width: 160px;
  height: 25px;
  float: left;
  background-color: #ffffff;
}

#navigation {
  width: 780px;
  float: left;
  background-color: #A53030;
}
<div id="search">Text</div>
<div id="navigation">Navigation</div>


person alexchenco    schedule 23.06.2009    source источник
comment
Удалите свойства width и float в #navigation, и все заработает.   -  person Johan Leino    schedule 23.06.2009
comment
связанный stackoverflow.com / questions / 4873832 /   -  person Adrien Be    schedule 10.02.2014
comment
@alexchenco: вы можете обновить выбранный вами ответ на тот, который предоставил Хэнк   -  person Adrien Be    schedule 10.02.2014
comment
@AdrienBe на самом деле, если вы посмотрите на ответ mystrdat, я думаю, что он даже лучше. Это только одна строка css, и она единственная, которая у меня сработала (я делаю три столбца с float: left; на первых двух с фиксированной шириной и переполнением: auto на последнем, и он отлично работает)   -  person edwardtyl    schedule 21.07.2015
comment
@edwardtyl достаточно честно. На самом деле, похоже, используется та же техника, что и в ответе, который я предоставил для stackoverflow.com/questions/4873832/   -  person Adrien Be    schedule 22.07.2015
comment
Посмотрите мой ответ несколькими строками ниже. Ответ - объединить float: left и overflow hidden. Это даст вам истинное поведение заполнения оставшегося места для правого столбца.   -  person Dariusz Sikorski    schedule 13.08.2016
comment
В 2018 году flex часто оказывается лучшим выходом. См. Ответ @ Jordan ниже - stackoverflow.com/a/25117686/846727   -  person Kunal    schedule 23.05.2018


Ответы (25)


Кажется, это достигнет того, что вы собираетесь делать.

#left {
  float:left;
  width:180px;
  background-color:#ff0000;
}
#right {
  width: 100%;
  background-color:#00FF00;
}
<div>
  <div id="left">
    left
  </div>
  <div id="right">
    right
  </div>
</div>

person Boushley    schedule 23.06.2009
comment
Вам нужно удалить width: 100% в правом div, чтобы он работал. - person Johan Leino; 23.06.2009
comment
Я просто скопировал и вставил этот код со страницы, на которой я его тестировал ... 100% работает. - person Boushley; 23.06.2009
comment
У этого решения действительно есть проблема. Попробуйте удалить цвет с ЛЕВОГО элемента. Вы заметите, что цвет из ПРАВОГО элемента на самом деле скрывается под ним. Кажется, что контент попадает в нужное место, но сам RIGHT div - нет. - person Vyrotek; 13.04.2011
comment
Какой браузер вы используете и видите такое поведение? - person Boushley; 15.04.2011
comment
+1 Решил и мою проблему. Я узнал, что мне нужно удалить float: left в заполняющем div. Я думал, что страница взорвется - person keyser; 01.08.2012
comment
Возможно, стоит заметить, что замечание Выротекса верно, но его можно решить с помощью overflow: hidden в правом столбце. Дензел упоминает об этом, но его ответ не является общепринятым, так что вы можете его пропустить ... - person Ruudt; 23.04.2013
comment
Это явно неправильно, правый элемент имеет полный размер, просто его содержимое плавает вокруг левого элемента. Это не решение, просто еще одна путаница. - person mystrdat; 27.06.2014
comment
Это не работает, если # right выше #left. См. jsfiddle.net/MHeqG/2044. - person Peter V. Mørch; 04.05.2015
comment
overflow: hidden мне НЕ помогает в Chrome. - person Yevgeniy Afanasyev; 28.08.2015
comment
Чтобы решить проблему, которую описывает @Vyrotek, просто добавьте overflow: hidden в #left и удалите width: 100% из #right. - person elveti; 27.10.2015
comment
-1: добавьте границу: сплошной желтый 5 пикселей в #right, и вы увидите, что он не занимает оставшееся пространство, как требуется оператору, он занимает всю ширину и работает только потому, что #left плавает над ним и толкает #rights содержание в стороне. - person kbro; 05.12.2015
comment
Для людей, которые не читают следующие ответы: я описал лучшее решение, чем принятое - проверьте несколько ответов ниже. - person Dariusz Sikorski; 13.08.2016
comment
это обман ^^ - person Ini; 03.07.2018

Проблема, которую я обнаружил с ответом Бушли, заключается в том, что если правый столбец длиннее левого, он просто обернется вокруг левого и возобновит заполнение всего пространства. Это не то поведение, которого я искал. Перебрав множество «решений», я нашел руководство (теперь ссылка не работает) по созданию страниц с тремя столбцами.

Автор предлагает три различных способа: один с фиксированной шириной, один с тремя переменными столбцами и один с фиксированными внешними столбцами и средней шириной переменной. Намного более элегантно и эффективно, чем другие примеры, которые я нашел. Значительно улучшил мое понимание верстки CSS.

По сути, в простом случае, приведенном выше, поместите первый столбец влево и задайте ему фиксированную ширину. Затем задайте для столбца справа левое поле, которое немного шире, чем у первого столбца. Вот и все. Выполнено. Код Алы Бушли:

Вот демонстрация в фрагментах стека и jsFiddle.

#left {
  float: left;
  width: 180px;
}

#right {
  margin-left: 180px;
}

/* just to highlight divs for example*/
#left { background-color: pink; }
#right { background-color: lightgreen;}
<div id="left">  left  </div>
<div id="right"> right </div>

В примере Boushley левый столбец содержит другой столбец справа. Как только заканчивается левый столбец, правый снова начинает заполнять все пространство. Здесь правый столбец просто выравнивается дальше по странице, а левый столбец занимает большую жирную границу. Никакого взаимодействия потоков не требуется.

person Hank    schedule 10.05.2011
comment
Когда вы закрываете тег div, содержимое после этого div должно отображаться в новой строке, но этого не происходит. Не могли бы вы объяснить почему? - person ; 10.07.2011
comment
должно быть: margin-left: 190px; ты забыл ';'. Также левое поле должно быть 180 пикселей. - person ; 10.07.2011
comment
@JAP Спасибо, исправили точку с запятой. Я обнаружил, что предпочитаю или нуждаюсь в некотором дополнительном поле между столбцами, чтобы страница выглядела так, как я хотел. Но я уверен, что это дело вкуса и дизайна. Что касается вашего вопроса: возможно, рассматриваемому элементу нужно что-то вроде clear:both; в его CSS. Поскольку левый столбец является плавающим, новые элементы будут появляться рядом с ним, а не под ним, если вы не предоставите им свойство clear. - person Hank; 11.07.2011
comment
Вдобавок я обнаружил, что если вы хотите добавить, скажем, 16 пикселей padding-left справа div, вам действительно нужно увеличить margin-left правого div на 16 пикселей, и также оставить padding-left! (Это не сработает, если у вас нет обоих!) - person slackwing; 03.10.2012
comment
margin-left является ключом к решению этой проблемы - спасибо, Хэнк, я JsFiddling свое собственное воплощение этой головоломки! - person El Ronnoco; 27.11.2012
comment
Примечание: если вы хотите, чтобы элемент фиксированной ширины был справа, обязательно поместите его первым в коде, иначе он все равно будет перенесен на следующую строку. - person Trevor; 02.04.2014
comment
Если вы попытаетесь изменить порядок (я имею в виду фиксированную ширину справа, а левую использовать остальные), то здесь возникнет проблема: jsfiddle.net/CSbbM/127 - person Roni Tovi; 01.05.2014
comment
@RoniTovi, плавающие элементы должны располагаться перед неплавающими в вашем html. jsfiddle.net/CSbbM/127 - person Hank; 04.09.2014
comment
Итак, как это сделать, если вы хотите избежать фиксированной ширины? Другими словами, разрешить левому столбцу быть ровно настолько широким, насколько это необходимо, а правому столбцу занять все остальное? - person Patrick Szalapski; 16.09.2016
comment
@PatrickSzalapski Установите overflow: auto вправо. См. Пример jsfiddle.net/DmitryMyadzelets/18copenm. - person Dmitry; 12.04.2021

В наши дни вы должны использовать метод flexbox (может быть адаптирован для всех браузеров с префиксом браузера).

.container {
    display: flex;
}

.left {
    width: 180px;
}

.right {
    flex-grow: 1;
}

Дополнительная информация: https://css-tricks.com/snippets/css/a-guide-to-flexbox/

person Jordan    schedule 04.08.2014
comment
См. Www.w3schools.com/cssref/css3_pr_flex-grow.asp для хорошего объяснения атрибута CSS. Простое современное решение, но может не работать в старых браузерах. - person Edward; 30.06.2016
comment
Flexbox FTW ... Я пробовал все другие решения в этом потоке, ничего не работает, я пробую это решение flexbox, оно работает сразу ... классический CSS (т.е. до появления flexbox и css grid) полностью отстой при макете ... гибкое и сеточное правило :-) - person leo; 13.07.2018
comment
Это следует принять как выбранное решение для текущего времени. Кроме того, это единственное нехакерское решение. - person Greg; 20.11.2018
comment
flex-grow на победу! - person Rohmer; 10.02.2021
comment
это решение работает, даже если у вас есть расширяемый div между другими гибкими div. :пальцы вверх: - person nologin; 02.05.2021

Решение исходит из свойства display.

По сути, вам нужно сделать так, чтобы два div действовали как ячейки таблицы. Поэтому вместо использования float:left вам придется использовать display:table-cell на обоих div, а для div с динамической шириной вам также необходимо установить width:auto;. Оба div должны быть помещены в контейнер шириной 100% со свойством display:table.

Вот css:

.container {display:table;width:100%}
#search {
  width: 160px;
  height: 25px;
  display:table-cell;
  background-color: #FFF;
}
#navigation {
  width: auto;
  display:table-cell;
  /*background-color: url('../images/transparent.png') ;*/
  background-color: #A53030;
}

*html #navigation {float:left;}

И HTML:

<div class="container">
   <div id="search"></div>
   <div id="navigation"></div>
</div>

ВАЖНО! Для Internet Explorer необходимо указать свойство float в div динамической ширины, иначе пространство не будет заполнено.

Надеюсь, это решит вашу проблему. Если хотите, вы можете прочитать полную статью, которую я написал об этом на мой блог.

person Mihai Frentiu    schedule 24.03.2011
comment
Не работает, когда содержимое внутри div с width: auto больше, чем остальное пространство, доступное в области просмотра. - person Nathan Loyer; 12.07.2012
comment
Как и в случае с предложением Дж. Петерсона, вы НЕ должны использовать таблицы в качестве дизайна, за исключением случаев, когда их содержимое фактически является табличными данными. У этого предложения должно быть намного больше минус-голосов. - person einord; 08.10.2013
comment
@einord, это решение не использует таблицы, и я знаю, что таблицы следует использовать только для табличных данных. Итак, это вырвано из контекста. Фактические таблицы и свойства display: table (+ другие варианты) - это совершенно разные вещи. - person Mihai Frentiu; 17.10.2013
comment
@Mihai Frentiu, чем display: table отличается от фактического элемента table? Очень хотелось бы это узнать, если это совсем разные вещи, спасибо. знак равно - person einord; 18.10.2013
comment
@einord, использование HTML-таблиц подразумевает определение всей структуры таблицы в HTML-коде. Модель таблицы CSS позволяет заставить практически любой элемент вести себя как элемент таблицы, не определяя все дерево таблицы. - person Mihai Frentiu; 23.10.2013
comment
@Mihai Frentiu, спасибо за ответ. Но разве поведение элемента таблицы не является половиной проблемы с использованием таблиц в качестве элементов дизайна? - person einord; 23.10.2013
comment
У меня возникла проблема, когда динамическая ширина div не принимала правильных размеров, пока я не объединил использование min-width & max-width с желаемым значением. См. Комментарий, который я добавил к коду ответа. Это разрешило это для меня в тестовом примере с двумя пустыми divs. В противном случае - отличный ответ! Спасибо. - person Engineer; 30.10.2013
comment
-1: НЕ используйте таблицы для макета. Я тоже в это не поверил, но вы НЕ МОЖЕТЕ установить высоту таблицы - если контент вырастает за пределы вашего макета, таблица тоже, полностью игнорируя любые попытки ограничить его с помощью overflow:hidden. - person kbro; 05.12.2015

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

.left {
  float: left;
  width: 100px;
}
.right {
  overflow: auto;
}

В этом случае overflow: auto запускает контекстное поведение и заставляет правый элемент расширяться только до доступной оставшейся ширины, и он естественным образом расширится до полной ширины, если .left исчезнет. Очень полезный и понятный трюк для многих макетов пользовательского интерфейса, но, возможно, сначала трудно понять, «почему он работает».

person mystrdat    schedule 27.06.2014
comment
Поддержка браузера для переполнения. IE4 !!! w3schools.com/cssref/pr_pos_overflow.asp - person Yevgeniy Afanasyev; 28.08.2015
comment
Иногда я получаю бесполезную горизонтальную полосу прокрутки на элементе .right. В чем проблема? - person Patrick Szalapski; 16.09.2016
comment
@PatrickSzalapski Можете ли вы сделать кодовый ключ или что-то подобное? Переполнение auto может вызвать это в зависимости от его содержимого. Вы также можете использовать любое другое значение переполнения, чтобы получить тот же эффект, hidden может работать лучше в вашем случае. - person mystrdat; 20.09.2016
comment
Что означает BFC, и есть ли в Интернете хорошее общее руководство, объясняющее BFC? - person lulalala; 28.12.2016
comment
@lulalala означает контекст форматирования блока. Вот более подробное объяснение. - person bobo; 03.01.2017
comment
Есть ли способ заставить эту работу работать, если это div с правой стороны имеет фиксированную ширину? Простое перемещение float: left в div RHS как float: right и overflow: auto в div LHS в примере Codepen не работает. - person manish; 02.06.2017
comment
@manish Простая замена float с left на right должна работать из коробки. Плавающий элемент должен быть первым в DOM. - person mystrdat; 13.06.2017
comment
@lolzerywowzery Спасибо, но этот метод довольно негибкий за пределами простых вариантов использования. Я бы подумал об использовании стека flexbox с flex-grow: 1 для дочернего элемента, который должен быть расширяемым, чтобы быть лучшим универсальным решением. - person mystrdat; 07.07.2017
comment
@PatrickSzalapski Добавьте box-sizing: border-box к элементам. - person Dmitry; 12.04.2021

Если вам не нужна совместимость со старыми версиями определенных браузеров (например, IE 10 8 или меньше), вы можете использовать функцию calc() CSS:

#left {
   float:left;
   width:180px;
   background-color:#ff0000;
}

#right {
   float: left;
   width: calc(100% - 180px);
   background-color:#00FF00;
}
person Marcos B.    schedule 28.09.2015
comment
IE 9 и выше поддерживают атрибут calc. Единственная проблема с этим решением заключается в том, что, возможно, мы не знаем ширину левого столбца или она изменяется. - person Arashsoft; 10.11.2015
comment
Что ж, это решение, возможно, ориентировано на гибкий случай и предполагает, что вы не знаете или не заботитесь о ширине родительского контейнера. В вопросе @alexchenco сказал, что хочет заполнить оставшееся место, поэтому ... я думаю, что это действительно так :) и да, IE 9 также поддерживается, спасибо за замечание;) - person Marcos B.; 10.11.2015

Ответ @Boushley был самым близким, однако есть одна проблема, которая не решена, на которую указывалось. правый div занимает всю ширину браузера; содержимое принимает ожидаемую ширину. Чтобы лучше понять эту проблему:

<html>
<head>
    <style type="text/css">
    * { margin: 0; padding: 0; }
    body {
        height: 100%;
    }
    #left {
        opacity: 0;
        height: inherit;
        float: left;
        width: 180px;
        background: green;
    }
    #right {
        height: inherit;
        background: orange;
    }
    table {
            width: 100%;
            background: red;
    }
    </style>
</head>
<body>
    <div id="left">
        <p>Left</p>
    </div>
    <div id="right">
        <table><tr><td>Hello, World!</td></tr></table>
    </div>
</body>
</html>

http://jsfiddle.net/79hpS/

Контент находится в правильном месте (в Firefox), однако ширина неверна. Когда дочерние элементы начинают наследовать ширину (например, таблица с width: 100%), им присваивается ширина, равная ширине браузера, в результате чего они выходят за пределы правого края страницы и создают горизонтальную полосу прокрутки (в Firefox) или не перемещаются и перемещаются вниз. (в хроме).

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

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

Если есть какие-либо проблемы или опасения, не стесняйтесь их поднимать.

person Denzel    schedule 18.04.2012
comment
overflow: hidden действительно исправляет это, спасибо. (Отмеченный ответ неверен, кстати, поскольку right фактически занимает все доступное пространство на родительском элементе, вы можете увидеть это во всех браузерах при проверке элементов) - person huysentruitw; 18.11.2012
comment
Может ли кто-нибудь объяснить, почему это работает? Я знаю, что где-то здесь видел хорошее объяснение, но не могу его найти. - person tomswift; 29.12.2012
comment
@tomswift Параметр overflow: hidden помещает правый столбец в свой собственный контекст форматирования блока. Блочные элементы занимают все доступное им горизонтальное пространство. См .: developer.mozilla.org/en-US/docs/ Интернет / Руководство / CSS / - person John Kurlak; 20.02.2015
comment
Атрибут overflow:xxx является ключевым. Как вы говорите, он не позволяет #right расширяться под #left. Это очень аккуратно решает проблему, с которой я столкнулся при использовании jQuery UI с изменяемым размером - с #right, установленным с атрибутом переполнения и #left, установленным как изменяемый размер, у вас есть простая подвижная граница. См. jsfiddle.net/kmbro/khr77h0t. - person kbro; 06.12.2015

Вот небольшое исправление для принятого решения, которое предотвращает попадание правого столбца под левый столбец. Заменил width: 100%; на overflow: hidden; - хитрое решение, если кто-то этого не знал.

<html>

<head>
    <title>This is My Page's Title</title>
    <style type="text/css">
        #left {
            float: left;
            width: 180px;
            background-color: #ff0000;
        }
        #right {
            overflow: hidden;
            background-color: #00FF00;
        }
    </style>
</head>

<body>
    <div>
        <div id="left">
            left
        </div>
        <div id="right">


right
    </div>
</div>

http://jsfiddle.net/MHeqG/2600/

[править] Также проверьте пример трехколоночного макета: http://jsfiddle.net/MHeqG/3148/

person Dariusz Sikorski    schedule 04.10.2015
comment
Идеальное решение для гибкой навигационной панели с фиксированным логотипом. - person Trunk; 08.06.2018

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

.fill {
  // This fills the remaining space, by using flexbox. 
  flex: 1 1 auto;
}
person Post Impatica    schedule 17.11.2016

Используйте 1_

<div style="width:500px; display:flex">
   <div style="width:150px; height:30px; background:red">fixed width</div>

   <div style="width:100%; height:30px; background:green">remaining</div>
</div>
person Ildar Zaripov    schedule 21.12.2016
comment
Этот ответ дублирует ответ Джордана от 2014 года. - person TylerH; 26.12.2017

Ответ Бушли кажется лучшим способом организовать это с помощью поплавков. Однако здесь не обошлось без проблем. Вложенный плавающий элемент в развернутом элементе будет вам недоступен; это сломает страницу.

Показанный метод в основном "подделывает его", когда дело доходит до расширяющегося элемента - на самом деле он не является плавающим, он просто играет вместе с плавающими элементами фиксированной ширины, используя свои поля.

Проблема в том, что расширяющийся элемент не плавает. Если вы попытаетесь иметь какие-либо вложенные плавающие элементы внутри расширяющегося элемента, эти «вложенные» плавающие элементы на самом деле вообще не будут вложенными; когда вы пытаетесь вставить clear: both; под свои «вложенные» плавающие элементы, вы в конечном итоге очистите и плавающие элементы верхнего уровня.

Затем, чтобы использовать решение Boushley, я хотел бы добавить, что вы должны разместить div, например, следующий: .fakeFloat {height: 100%; ширина: 100%; плыть налево; } и поместите это прямо в расширенный div; все расширенное содержимое div должно быть помещено в этот элемент fakeFloat.

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

person chinchi11a    schedule 30.08.2011
comment
Не используйте таблицы для разметки. Вы не можете установить их высоту. Они расширяются, чтобы удерживать свой контент, и они не уважают переполнение. - person kbro; 06.12.2015
comment
@kbro: не используйте таблицы для макета, потому что содержимое и отображение должны быть разделены. Но если контент структурирован в виде таблицы, его, безусловно, можно вырезать с помощью overflow: hidden. jsfiddle.net/dave2/a5jbpc85 - person Dave; 02.12.2017

Я пробовал приведенные выше решения для жидкого левого и фиксированного правого, но ни одно из них не сработало (я знаю, что вопрос касается обратного, но я думаю, что это актуально). Вот что сработало:

.wrapper {margin-right:150px;}
.wrapper .left {float:left; width:100%; margin-right:-150px;}

.right {float:right; width:150px;}

<div class="wrapper"><div class="left"></div></div>
<div class="right"></div>
person Dominic    schedule 23.11.2012

У меня была аналогичная проблема, и я нашел решение здесь: https://stackoverflow.com/a/16909141/3934886

Решение для неподвижного центрального блока и колонн со стороны жидкости.

.center{
    background:#ddd;
    width: 500px;
    float:left;
}

.left{
    background:#999;
    width: calc(50% - 250px);
    float:left;
}

.right{
    background:#999;
    width: calc(50% - 250px);
    float:right;
}

Если вам нужен фиксированный левый столбец, просто измените формулу соответствующим образом.

person alex351    schedule 07.11.2014
comment
Недоступно в некоторых старых браузерах, таких как IE8, и только частично в IE9 (caniuse.com/#feat=calc) - person landi; 21.01.2015

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

#container{
    display: grid;
    grid-template-columns: 100px auto;
    color:white;
}
#fixed{
  background: red;
  grid-column: 1;
}
#remaining{
  background: green;
  grid-column: 2;
}
<div id="container">
  <div id="fixed">Fixed</div>
  <div id="remaining">Remaining</div>
</div>

person colxi    schedule 10.10.2018

Интересно, что никто не использовал position: absolute с position: relative

Итак, другое решение:

HTML

<header>
  <div id="left"><input type="text"></div>
  <div id="right">Menu1 Menu2 Menu3</div>
</header>

CSS

header { position: relative;  }
#left {
    width: 160px;
    height: 25px;
}
#right {
    position: absolute;
    top: 0px;
    left: 160px;
    right: 0px;
    height: 25px;
}

Пример Jsfiddle

person Buksy    schedule 16.02.2016

/ * * css * /

#search {
 position: absolute;
 width: 100px;
}
.right-wrapper {
  display: table;
  width: 100%;
  padding-left:100px;
}
.right-wrapper #navigation {
 display: table-cell;
 background-color: #A53030;
}

/ * * HTML * /

<div id="search"></div>
<div class="right-wrapper">
   <div id="navigation"></div>
</div>
person user1700099    schedule 08.11.2013

У меня есть очень простое решение! // HTML

<div>
<div id="left">
    left
</div>
<div id="right">
    right
</div>

//CSS

#left {
float:left;
width:50%;
position:relative;
background-color:red;
}
#right {
position:relative;
background-color:#00FF00;}

Ссылка: http://jsfiddle.net/MHeqG/

person iamatsundere181    schedule 22.05.2015

У меня была аналогичная проблема, и я придумал следующее, которое хорошо сработало

CSS:

.top {
width: auto;
height: 100px;
background-color: black;
border: solid 2px purple;
overflow: hidden;
}
.left {
float:left;
width:100px;
background-color:#ff0000;
padding: 10px;
border: solid 2px black;
}
.right {
width: auto;
background-color:#00FF00;
padding: 10px;
border: solid 2px orange;
overflow: hidden;
}
.content {
margin: auto;
width: 300px;
min-height: 300px;
padding: 10px;
border: dotted 2px gray;
}

HTML:

<div class=top>top </div>
<div>
    <div class="left">left </div>
    <div class="right">
        <div class="content">right </div>
    </div>
</div>

Этот метод не переносится при уменьшении окна, но автоматически расширяет область «содержимого». Он сохранит статическую ширину для меню сайта (слева).

А для демонстрации автоматического расширения окна содержимого и левого вертикального окна (меню сайта):

https://jsfiddle.net/tidan/332a6qte/

person Tidan    schedule 05.08.2015

Попробуйте добавить позицию relative, удалите свойства width и float правой стороны, затем добавьте свойство left и right со значением 0.

Кроме того, вы можете добавить margin left правило со значением, основанным на ширине левого элемента (+ несколько пикселей, если вам нужно пространство между ними), чтобы сохранить его положение.

Этот пример работает для меня:

   #search {
        width: 160px;
        height: 25px;
        float: left;
        background-color: #FFF;
    }

    #navigation {  
        display: block;  
        position: relative;
        left: 0;
        right: 0;
        margin: 0 0 0 166px;             
        background-color: #A53030;
    }
person Ari    schedule 04.10.2015

.container {
  width:100%;
  display:table;
  vertical-align:middle;
}

.left {
  width:100%;
  display:table-cell;
  text-align:center;
}

.right {
  width:40px;
  height:40px;
  display:table-cell;
  float:right;
}
<div class="container">
  <div class="left">Left</div>
  <div class="right">Right</div>
</div

Попробуй это. У меня это сработало.

person Spoorthi    schedule 09.10.2015

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

Вот код

// Fix the width of the right side to cover the screen when resized
$thePageRefreshed = true;
// The delay time below is needed to insure that the resize happens after the window resize event fires
// In addition the show() helps.  Without this delay the right div may go off screen when browser is refreshed 
setTimeout(function(){
    fixRightSideWidth();
    $('.right_content_container').show(600);
}, 50);

// Capture the window resize event (only fires when you resize the browser).
$( window ).resize(function() {
    fixRightSideWidth();
});

function fixRightSideWidth(){
    $blockWrap = 300; // Point at which you allow the right div to drop below the top div
    $normalRightResize = $( window ).width() - $('.left_navigator_items').width() - 20; // The -20 forces the right block to fall below the left
    if( ($normalRightResize >= $blockWrap) || $thePageRefreshed == true ){
        $('.right_content_container').width( $normalRightResize );
        $('.right_content_container').css("padding-left","0px");
        
        /* Begin test lines these can be deleted */
        $rightrightPosition = $('.right_content_container').css("right");
        $rightleftPosition = $('.right_content_container').css("left");
        $rightwidthPosition = $('.right_content_container').css("width");
        $(".top_title").html('window width: '+$( window ).width()+"&nbsp;"+'width: '+$rightwidthPosition+"&nbsp;"+'right: '+$rightrightPosition);
        /* End test lines these can be deleted */
    
    
    }
    else{
        if( $('.right_content_container').width() > 300 ){
            $('.right_content_container').width(300);
        }
        
        /* Begin test lines these can be deleted */
        $rightrightPosition = $('.right_content_container').css("right");
        $rightleftPosition = $('.right_content_container').css("left");
        $rightwidthPosition = $('.right_content_container').css("width");
        $(".top_title").html('window width: '+$( window ).width()+"&nbsp;"+'width: '+$rightwidthPosition+"&nbsp;"+'right: '+$rightrightPosition);
        /* End test lines these can be deleted */
    
    }
    if( $thePageRefreshed == true ){
        $thePageRefreshed = false;
    }
}
/* NOTE: The html and body settings are needed for full functionality
and they are ignored by jsfiddle so create this exapmle on your web site
*/
html {
    min-width: 310px;
    background: #333;
    min-height:100vh;
}

body{
	background: #333;
	background-color: #333;
	color: white;
    min-height:100vh;
}

.top_title{
  background-color: blue;
  text-align: center;
}

.bottom_content{
	border: 0px;
	height: 100%;
}

.left_right_container * {
    position: relative;
    margin: 0px;
    padding: 0px;
    background: #333 !important;
    background-color: #333 !important;
    display:inline-block;
    text-shadow: none;
    text-transform: none;
    letter-spacing: normal;
    font-size: 14px;
    font-weight: 400;
    font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;
    border-radius: 0;
    box-sizing: content-box;
    transition: none;
}

.left_navigator_item{
	display:inline-block;
	margin-right: 5px;
	margin-bottom: 0px !important;
	width: 100%;
	min-height: 20px !important;
	text-align:center !important;
	margin: 0px;
	padding-top: 3px;
	padding-bottom: 3px;
	vertical-align: top;
}

.left_navigator_items {
    float: left;
    width: 150px;
}

.right_content_container{
    float: right;
    overflow: visible!important;
    width:95%; /* width don't matter jqoery overwrites on refresh */
    display:none;
    right:0px;
}

.span_text{
	background: #eee !important;
	background-color: #eee !important;
	color: black !important;
	padding: 5px;
	margin: 0px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<div class="top_title">Test Title</div>
<div class="bottom_content">
    <div class="left_right_container">
        <div class="left_navigator_items">
            <div class="left_navigator_item">Dashboard</div>
            <div class="left_navigator_item">Calendar</div>
            <div class="left_navigator_item">Calendar Validator</div>
            <div class="left_navigator_item">Bulletin Board Slide Editor</div>
            <div class="left_navigator_item">Bulletin Board Slide Show (Live)</div>
            <div class="left_navigator_item">TV Guide</div>
        </div>
        <div class="right_content_container">
            <div class="span_text">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam ullamcorper maximus tellus a commodo. Fusce posuere at nisi in venenatis. Sed posuere dui sapien, sit amet facilisis purus maximus sit amet. Proin luctus lectus nec rutrum accumsan. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Ut fermentum lectus consectetur sapien tempus molestie. Donec bibendum pulvinar purus, ac aliquet est commodo sit amet. Duis vel euismod mauris, eu congue ex. In vel arcu vel sem lobortis posuere. Cras in nisi nec urna blandit porta at et nunc. Morbi laoreet consectetur odio ultricies ullamcorper. Suspendisse potenti. Nulla facilisi.

Quisque cursus lobortis molestie. Aliquam ut scelerisque leo. Integer sed sodales lectus, eget varius odio. Nullam nec dapibus lorem. Aenean a mattis velit, ut porta nunc. Phasellus aliquam volutpat molestie. Aliquam tristique purus neque, vitae interdum ante aliquam ut.

Pellentesque quis finibus velit. Fusce ac pulvinar est, in placerat sem. Suspendisse nec nunc id nunc vestibulum hendrerit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Mauris id lectus dapibus, tempor nunc non, bibendum nisl. Proin euismod, erat nec aliquet mollis, erat metus convallis nulla, eu tincidunt eros erat a lectus. Vivamus sed mattis neque. In vitae pellentesque mauris. Ut aliquet auctor vulputate. Duis eleifend tincidunt gravida. Sed tincidunt blandit tempor.

Duis pharetra, elit id aliquam placerat, nunc arcu interdum neque, ac luctus odio felis vitae magna. Curabitur commodo finibus suscipit. Maecenas ut risus eget nisl vehicula feugiat. Sed sed bibendum justo. Curabitur in laoreet dolor. Suspendisse eget ligula ac neque ullamcorper blandit. Phasellus sit amet ultricies tellus.

In fringilla, augue sed fringilla accumsan, orci eros laoreet urna, vel aliquam ex nulla in eros. Quisque aliquet nisl et scelerisque vehicula. Curabitur facilisis, nisi non maximus facilisis, augue erat gravida nunc, in tempus massa diam id dolor. Suspendisse dapibus leo vel pretium ultrices. Sed finibus dolor est, sit amet pharetra quam dapibus fermentum. Ut nec risus pharetra, convallis nisl nec, tempor nisl. Vivamus sit amet quam quis dolor dapibus maximus. Suspendisse accumsan sagittis ligula, ut ultricies nisi feugiat pretium. Cras aliquam velit eu venenatis accumsan. Integer imperdiet, eros sit amet dignissim volutpat, tortor enim varius turpis, vel viverra ante mauris at felis. Mauris sed accumsan sapien. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut vel magna commodo, facilisis turpis eu, semper mi. Nulla massa risus, bibendum a magna molestie, gravida maximus nunc.</div>
        </div>
    </div>
</div>

Вот моя скрипка, которая может сработать для вас так же, как и для меня. https://jsfiddle.net/Larry_Robertson/62LLjapm/

person Larry Robertson    schedule 10.01.2018

Правила для предметов и тары;

Container: {*** display: table; ***}
Items: {*** display: table-cell; width: 100%; ***}

Используйте white-space: nowrap; для текстов в последних элементах для их неструктурирования.

Пункт X% | Пункт Y% | Пункт Z%

Общая длина всегда = 100%!

if

Item X=50%
Item Y=10%
Item z=20%

тогда

Пункт X = 70%

Элемент X является доминирующим (первые элементы доминируют в макете таблицы)!

Попробуйте свойство max-content; для div внутри для распространения div в контейнере:

div[class="item"] {
...
  width: -webkit-max-content;
  width: -moz-max-content;
  width: max-content;
...

}

person Dmytro Yurchenko    schedule 24.02.2019

Самое простое решение - использовать маржу. Это тоже будет отзывчивым!

<div style="margin-right: auto">left</div>
<div style="margin-left: auto; margin-right:auto">center</div>
<div style="margin-left: auto">right</div>
person Hobey823    schedule 08.11.2019

Самое простое решение - просто сделать ширину левого div равной 100% - ширине правого div плюс любой отступ между ними.

<div class="cont">
  <div class="search">
    Big Logo Text
  </div>
  <nav>
    <ul class="navbar">
      <li><a href="#1">NavLink1</a></li>
      <li><a href="#2">NavLink2</a></li>
      <li><a href="#3">NavLink3</a></li>
      <li><a href="#4">NavLink4</a></li>
      <li><a href="#5">NavLink5</a></li>
    </ul>
  </nav>
</div>

.cont{
  display: inline-grid;
  grid-template-columns: 160px 10px calc(100% - 170px);
  grid-template-rows: auto;
  grid-template-areas: "search .  navigation";
  width: 100%;
  height: auto;
  text-align: center;
}

.search {
  grid-area: search;
  height: 90px;
  background-color: #00FF00;
  line-height: 80px;
  font-size: 1.4rem;
  font-weight: 600;
}
nav {
  grid-area: navigation;
  height: 90px;
  background-color: #A53030;
}

.navbar{
  display: flex;
  height: 30px;
  width: 100%;
  padding: 0%;
  list-style-type: none;
  flex-flow: row wrap;
  flex: 0 1 auto;
  justify-content: space-between;
  align-content: flex-start;
  align-items: flex-start;
}

.navbar a{
    outline: 0;
    text-decoration: none;
}

https://codepen.io/tamjk/pen/dybqKBN

person Trunk    schedule 17.09.2019

Я столкнулся с той же проблемой, пытаясь разметить некоторые элементы управления jqueryUI. Хотя общая философия сейчас - «использовать DIV вместо TABLE», я обнаружил, что в моем случае использование TABLE работает намного лучше. В частности, если вам нужно выполнить прямое выравнивание двух элементов (например, вертикальное центрирование, горизонтальное центрирование и т. Д.), Параметры, доступные в TABLE, предоставляют для этого простые, интуитивно понятные элементы управления.

Вот мое решение:

<html>
<head>
  <title>Sample solution for fixed left, variable right layout</title>
  <style type="text/css">
    #controls {
      width: 100%;
    }
    #RightSide {
      background-color:green;
    }
  </style>
</head>

<body>
<div id="controls">
  <table border="0" cellspacing="2" cellpadding="0">
    <TR>
      <TD>
        <button>
FixedWidth
        </button>
      </TD>
      <TD width="99%" ALIGN="CENTER">
        <div id="RightSide">Right</div>
      </TD>
    </TR>
  </table>
</div>
</body>
</html>
person J. Peterson    schedule 04.04.2012
comment
Никогда и никогда не следует использовать таблицы для форматирования чего-либо, кроме табличных данных. КОГДА-ЛИБО. - person mmmeff; 21.03.2013
comment
Проблема с таблицами заключается в том, что разметка будет вводить в заблуждение, если то, что вы пытаетесь отобразить, не предназначено для табличных данных. Если вы решите пренебречь принципом разметки, несущей значение, вы также можете вернуться к <font>, <b> и т. Д. HTML эволюционировал, чтобы меньше фокусироваться на презентации. - person Vilinkameni; 07.05.2014
comment
Не знаю, почему все пугаются столов. Иногда они полезны. - person Jandieg; 07.07.2015
comment
Вы не можете исправить высоту стола. Если содержимое становится больше, увеличивается и таблица. И это не чтит overflow. - person kbro; 06.12.2015
comment
@Jandieg: см. Ответ Михая Френтиу для объяснения. Вся цель CSS - отделить контент от внешнего вида. Использование таких свойств, как display:table для достижения желаемого внешнего вида нетабличных данных, является чистым. Принуждение нетабличных данных, таких как столбцы страниц или элементы управления формы, в HTML-таблицы для управления макетом - это нечисто. - person Dave; 02.12.2017