Ширина div 100% минус фиксированное количество пикселей

Как я могу получить следующую структуру без использования таблиц или JavaScript? Белые границы представляют собой края div и не имеют отношения к вопросу.

Структура 1

Размер области посередине будет изменяться, но у нее будут точные значения пикселей, и вся структура должна масштабироваться в соответствии с этими значениями. Чтобы упростить это, мне нужен способ установить ширину «100% - n пикселей» для верхнего-среднего и нижнего-среднего div.

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

Вот бонус. Еще одна структура, с которой я боролся и в конечном итоге использую таблицы или JavaScript. Он немного отличается, но создает новые проблемы. Я в основном использую его в оконной системе на основе jQuery, но я бы хотел убрать макет из скрипта и контролировать только размер одного элемента (среднего).

Структура 2


person Removed_account    schedule 16.03.2009    source источник
comment
Для второго элемента вы говорите, что хотите, чтобы высота самого среднего элемента была фиксированной, но другие элементы поблизости были динамическими.   -  person Casebash    schedule 20.05.2011


Ответы (10)


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

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

HTML:

<div class="Header">
   <div>
      <div>This is the dynamic center area</div>
   </div>
</div>

CSS:

.Header {
   background: url(left.gif) no-repeat;
   padding-left: 30px;
}
.Header div {
   background: url(right.gif) top right no-repeat;
   padding-right: 30px;
}
.Header div div {
   background: url(center.gif) repeat-x;
   padding: 0;
   height: 30px;
}
person Guffa    schedule 16.03.2009
comment
Спасибо за это. Мне пришлось немного подправить его для моей ситуации. Первому вложенному div требовалось поле margin-right вместо заполнения, а центральному div также требовалось такое же правое поле. - person Max; 12.07.2011
comment
Отличное решение. просто мелочь - ›это работает, потому что .Header div div переопределяет .Header div. Вместо этого должно быть .Header ›div и .Header› div ›div. Действительно, .Header div означает любой дочерний элемент div или дочерний элемент div, тогда как .Header ›div означает только прямые дочерние элементы .Header - person Charles HETIER; 22.05.2013
comment
@CharlesHETIER: Да, это тоже работает, и его проще использовать, поскольку вам не нужно отменять все настройки менее конкретного правила. Ответ был написан, когда поддержка оператора > еще не была достаточно надежной. - person Guffa; 22.05.2013
comment
Это устарело, см. Ответ ниже о функции calc в css. - person María Arias de Reyna Domínguez; 27.05.2013
comment
@delawen: Вам нужно немного подождать, пока он не устареет. Нет поддержки calc в IE 8, а также в текущих версиях браузера Anroid или Opera. caniuse.com/#search=calc - person Guffa; 27.05.2013
comment
Почему голос против? Если вы не объясните, что вы считаете неправильным, это не улучшит ответ. - person Guffa; 13.09.2013
comment
Почему голос против? Если вы не объясните, что вы считаете неправильным, это не улучшит ответ. - person Guffa; 17.11.2014
comment
Почему dwonvote? Если вы не объясните, что вы считаете неправильным, это не улучшит ответ. - person Guffa; 21.12.2014
comment
Вы говорите The default width of a div element is auto, which means that it uses the available width., что в моем случае кажется ложным. Мои блоки имеют ширину ровно настолько, насколько они должны быть, чтобы удерживать все, что я помещаю в них. - person birgersp; 15.06.2016
comment
@BirgerSkogengPedersen: Есть еще одна настройка, которая меняет поведение. Если вы, например, разместили div, он ведет себя так, как вы описываете. - person Guffa; 15.06.2016
comment
О да. Вы правы, display: table; был установлен. Прости за это. - person birgersp; 16.06.2016

Я только что наткнулся на новый способ: css calc():

.calculated-width {
    width: -webkit-calc(100% - 100px);
    width:    -moz-calc(100% - 100px);
    width:         calc(100% - 100px);
}​

Источник: ширина CSS 100% минус 100 пикселей

person rom_j    schedule 04.02.2013
comment
Лучший ответ 2013 года ИМХО. Принятый ответ устарел. - person Danubian Sailor; 27.02.2013
comment
Пора кому-нибудь наткнуться на это. Теперь, когда я это знаю, я покончил с хаками. +1 @lechlukasz - person preahkumpii; 09.03.2013
comment
После 10 лет борьбы с CSS этот ответ заслуживает +20000! Все еще не могу поверить своим глазам ... - person skobaljic; 15.03.2013
comment
Все, что я могу сказать по этому поводу, это ... youtube.com/ - person Jazz; 02.05.2013
comment
Похоже, это не работает на мобильном Chrome (на моем Nexus) или мобильном сафари - person K2xL; 16.06.2013
comment
Не работает в Android или IE8, обе цели я все еще хочу поддерживать :( Даже когда я откажусь от поддержки IE8, я все равно буду поддерживать Android 4.x. - person thomasrutter; 17.09.2013
comment
Более совместимый? - ›$ ('# yourEl'). Css ('ширина', '100%'). Css ('ширина', '- = 100px'); (jQuery) - person sboy031; 18.09.2013
comment
Нашел: используйте display: inline. Это очень помогает. - person Pascut; 04.09.2014
comment
Для тех, кто ищет решение в IE 8 или более ранней версии, вы можете использовать выражение (), которое, как мне кажется, предназначено только для Microsoft. Не совсем то же самое, но близкое - person Gio; 26.09.2015
comment
В этом решении есть ошибка с использованием Less, но есть обходной путь: добавьте "~" и кавычки. вокруг каждой линии. Например, ~ height: calc (100% - 58px) ;. - person Josh Grinberg; 16.06.2016
comment
Так красиво / элегантно! Я использовал это для автоматической настройки ширины полосы предварительного просмотра миниатюр в галерее изображений (в которой ширина основного текста предварительно определена на уровне 640 пикселей). В таблице стилей CSS я добавил границу в 1 пиксель к изображениям миниатюр и установил ширину: calc (20% - 2 пикселя); - person Victoria Stuart; 22.04.2017

Хотя ответ Guffa работает во многих ситуациях, в некоторых случаях вы можете не захотеть, чтобы левая и / или правая части заполнения были родительскими для центрального div. В этих случаях вы можете использовать контекст форматирования блока по центру и перемещать блоки заполнения влево и вправо. Вот код

HTML:

<div class="container">
    <div class="left"></div>
    <div class="right"></div>
    <div class="center"></div>
</div>

CSS:

.container {
    width: 100px;
    height: 20px;
}

.left, .right {
    width: 20px;
    height: 100%;
    float: left;
    background: black;   
}

.right {
    float: right;
}

.center {
    overflow: auto;
    height: 100%;
    background: blue;
}

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

Обратите внимание, что это работает только с div и другими элементами, которые имеют свойство «заполнить 100% ширины по умолчанию». Входные данные, таблицы и, возможно, другие потребуют от вас обернуть их в контейнер div и добавить еще немного CSS для восстановления этого качества. Если вам не повезло оказаться в такой ситуации, свяжитесь со мной, и я откопаю css.

jsfiddle здесь: jsfiddle.net/RgdeQ

Наслаждаться!

person Unislash    schedule 26.08.2012

Вы можете использовать Flexbox макет. Вам необходимо установить flex: 1 для элемента, который должен иметь динамическую ширину или высота для flex-direction: row and column соответственно.

Динамическая ширина:

HTML

<div class="container">
  <div class="fixed-width">
    1
  </div>
  <div class="flexible-width">
    2
  </div>
  <div class="fixed-width">
    3
  </div>
</div>

CSS

.container {
  display: flex;
}
.fixed-width {
  width: 200px; /* Fixed width or flex-basis: 200px */
}
.flexible-width {
  flex: 1; /* Stretch to occupy remaining width i.e. flex-grow: 1 and flex-shrink: 1*/
}

Вывод:

.container {
  display: flex;
  width: 100%;
  color: #fff;
  font-family: Roboto;
}
.fixed-width {
  background: #9BCB3C;
  width: 200px; /* Fixed width */
  text-align: center;
}
.flexible-width {
  background: #88BEF5;
  flex: 1; /* Stretch to occupy remaining width */
  text-align: center;
}
<div class="container">
  <div class="fixed-width">
    1
  </div>
  <div class="flexible-width">
    2
  </div>
  <div class="fixed-width">
    3
  </div>

</div>


Динамическая высота:

HTML

<div class="container">
  <div class="fixed-height">
    1
  </div>
  <div class="flexible-height">
    2
  </div>
  <div class="fixed-height">
    3
  </div>
</div>

CSS

.container {
  display: flex;
}
.fixed-height {
  height: 200px; /* Fixed height or flex-basis: 200px */
}
.flexible-height {
  flex: 1; /* Stretch to occupy remaining height i.e. flex-grow: 1 and flex-shrink: 1*/
}

Вывод:

.container {
  display: flex;
  flex-direction: column;
  height: 100vh;
  color: #fff;
  font-family: Roboto;
}
.fixed-height {
  background: #9BCB3C;
  height: 50px; /* Fixed height or flex-basis: 100px */
  text-align: center;
  display: flex;
  flex-direction: column;
  justify-content: center;
}
.flexible-height {
  background: #88BEF5;
  flex: 1; /* Stretch to occupy remaining width */
  text-align: center;
  display: flex;
  flex-direction: column;
  justify-content: center;
}
<div class="container">
  <div class="fixed-height">
    1
  </div>
  <div class="flexible-height">
    2
  </div>
  <div class="fixed-height">
    3
  </div>

</div>

person m4n0    schedule 10.12.2015

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

Если вам необходимо сделать это без дополнительных элементов (например, когда у вас нет контроля над разметкой страницы), вы можете использовать box-sizing, который имеет довольно приличную, но не полную или простую поддержку браузера. Хотя, наверное, веселее, чем полагаться на сценарии.

person bobince    schedule 17.03.2009

Может, я веду себя глупо, но разве таблица не является очевидным решением?

<div class="parent">
    <div class="fixed">
    <div class="stretchToFit">
</div>

.parent{ display: table; width 100%; }
.fixed { display: table-cell; width: 150px; }
.stretchToFit{ display: table-cell; vertical-align: top}

Другой способ, который я придумал в хроме, еще проще, но, черт возьми, это хитрость!

.fixed{ 
   float: left
}
.stretchToFit{
   display: table-cell;
   width: 1%;
}

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

person Jack Franzen    schedule 19.07.2015

Этого очень легко добиться с помощью flex-box.

Если у нас есть три элемента, такие как Header, MiddleContainer и Footer. И мы хотим придать фиксированную высоту верхнему и нижнему колонтитулам. тогда мы можем написать так:

Для React / RN (по умолчанию это 'display' как flex и 'flexDirection' как столбец) в веб-CSS нам нужно будет указать контейнер тела или контейнер, содержащий их, как display: 'flex', flex-direction: 'column' как показано ниже:

    container-containing-these-elements: {
     display: flex,
     flex-direction: column
    }
    header: {
     height: 40,
    },
    middle-container: {
     flex: 1, // this will take the rest of the space available.
    },
    footer: {
     height: 100,
    }
person jayiitb    schedule 19.09.2017

что, если бы ваш обертывающий div был на 100% и вы использовали padding для количества пикселей, тогда, если padding # должен быть динамическим, вы можете легко использовать jQuery для изменения количества отступов при срабатывании ваших событий.

person dfasdljkhfaskldjhfasklhf    schedule 16.03.2009

У меня была аналогичная проблема, когда я хотел разместить баннер в верхней части экрана с одним изображением слева и повторяющимся изображением справа до края экрана. В итоге я решил это так:

CSS:

.banner_left {
position: absolute;
top: 0px;
left: 0px;
width: 131px;
height: 150px;
background-image: url("left_image.jpg");
background-repeat: no-repeat;
}

.banner_right {
position: absolute;
top: 0px;
left: 131px;
right: 0px;
height: 150px;
background-image: url("right_repeating_image.jpg");
background-repeat: repeat-x;
background-position: top left;
}

Ключом была правильная бирка. Я в основном указываю, что хочу, чтобы он повторялся от 131 пикселей слева до 0 пикселей справа.

person Mike Carey    schedule 08.02.2011

В некоторых случаях вы можете использовать настройки полей, чтобы эффективно указать «100% ширины минус N пикселей». См. Принятый ответ на этот вопрос.

person chaos    schedule 16.03.2009