CSS-only: как я могу сосредоточить фиксированную ширину div между двумя div, которые заполняют оставшееся пространство?
JSFIDDLE
EDIT: попытка достичь противоположности this.
(вместо 2 фиксированных ширины divs по сторонам и один div ширины жидкости в середине,
Я пытаюсь получить 2 div ширины жидкости по бокам и один div, центрированный посередине)
У меня есть 3 divs: A, B и C.
B должен находиться в центре между A и C.
![What I need to do]()
То, что я сейчас делаю, в значительной степени соответствует тому, что происходит выше. Но если контейнер A, B и C имеет нечетную ширину, некоторые браузеры округляют A и C ширины вниз, а другие вверх (оставляя C 1px слишком длинным и 1px слишком коротким, соответственно).
обратите внимание на дополнительный пиксель справа от C
![]()
обратите внимание, что пространство справа от C является более тонким пикселем.
![]()
Мне все равно, сколько вложенных divs мне нужно, но я тратил слишком много времени на это! Если у кого-то уже есть надежное решение этой проблемы, пожалуйста, поделитесь!
Примечания:
- Родитель A, B и C не может скрывать переполнение.
- A, B и C не могут перекрываться (у них есть полупрозрачные png)
Это моя отправная точка: JSFIDDLE
Ответы
Ответ 1
Вот два способа работы: оба с предостережениями (предупреждение, оба требуют обертку):
HTML
<section class="wrapper">
<div class="column" id="a"></div>
<div class="column" id="b"></div>
<div class="column" id="c"></div>
</section>
Базовый CSS
.column {
height: 3em;
}
#a {
background-color: red;
}
#b {
background-color: green;
}
#c {
background-color: blue;
}
#b {
width: 50px;
}
Подход CSS3:
.wrapper {
display:box;
box-orient:horizontal;
box-align:stretch;
}
#a, #b {
box-flex:1.0;
}
Предостережение. Поддерживается (пока) в Firefox и Webkit (Chrome/Safari), и для них требуются префиксные правила. Выше было то, что будет когда-нибудь.
Вот демо с префиксами: http://jsfiddle.net/crazytonyi/cBVTE/
Подход с табличным дисплеем
.wrapper {
display: table;
width: 100%;
table-layout: fixed;
}
.column {
display: table-cell;
}
Предостережения: IE не начал поддерживать этот тип отображения до 7 или 8. С другой стороны, беспокоиться о пользователях более старых версий IE - это беспокоиться о людях, которые все еще отключили файлы cookie и javascript. Либо они догоняют, либо привыкают к разрыву страниц. Закончите потворство!
Здесь приведено демо: http://jsfiddle.net/crazytonyi/kM46h/
В обоих случаях не требуется никаких поплавков или позиционирования, просто готов предоставить средний палец старым браузерам. Сколько лет зависит от выбранного вами метода.
Ответ 2
EDIT: Пожалуйста, используйте решение Anthony! Он удовлетворяет всем требованиям без какого-либо ужасающего взлома CSS! Если вам нужно поддерживать более старые браузеры, не стесняйтесь использовать мое решение (но, srrsly, решение Anthony идеально подходит для большинства случаев).
Я не знаю, как я еще не пробовал это решение, но это работает даже лучше, чем этот принятый ответ! Без округления!
решено!
Если мы рассмотрим округленное 50% как значение (X) и постоянную ширину B как значение Y, нам нужно:
ширина A = X
ширина C = 100% - X
Я решил использовать это как свою структуру:
<container>
<a></a>
<b></b>
<c_holder>
<c>
</c>
</c_holder>
</container>
Q. Как мы можем получить C для ширины container_width - X?
A. Мы даем C контейнеру c_holder с шириной 100% и даем C левое смещение X (50%).
забыть B на данный момент...
теперь у нас есть 2 divs рядом с eachother... каждый примерно 50%, но с точностью до 100%.
Бросьте все это в контейнер и дайте этому контейнеру правое поле Y (ширина B div). теперь у нас есть А и С рядом друг с другом, но они занимают 100% - Y от ширины.
дайте c_holder левое смещение Y и оставьте B между A и c_holder. примените левый поплавок на A и B.
теперь Ширина X, ширина B Y, C полное смещение слева X + Y, а видимая ширина C 100% контейнера - X - Y.
kinda funky, но он отлично работал в IE7, Chrome и Safari. Я позже проведу FF.
Ответ 3
Я думаю, вам нужно использовать вот так.
HTML
<div class="a">a</div>
<div class="b">b</div>
<div class="c">c</div>
CSS
.a
{
width:50%;
height:25px;
background-color:#0F0;
float:left
}
.b
{
width:13px;
height:25px;
background-color:#FFF;
margin-left:-6px;
float:left;
position:relative;
z-index:99;
}
.c
{
width:50%;
height:25px;
background-color:#C33;
margin-left:-7px;
float:left;
}
</style>
Ответ 4
<style>
.a{ width:50%; height:25px; background-color:#0F0; float:left }
.b{ width:13px; height:25px; background-color:#FFF; float:left;
position:relative; left:51%;}
.c{ width:50%; height:25px; background-color:#C33; float:right; }
</style>
Ответ 5
демо на dabblet.com:
http://img838.imageshack.us/img838/6116/cff430b799254087b6ec991.png
HTML:
<div id="main">
<div class="half left">
<div>
<div id="a" class="col"> </div>
</div>
</div>
<div class="half right">
<div>
<div id="c" class="col"> </div>
</div>
</div>
<div id="b" class="col"> </div>
</div>
CSS
#main {
height: 40px;
width: auto;
border: 1px solid #cfcfcf;
position: relative;
}
.half {
width: 50%;
height: 100%;
position: absolute;
top: 0;
}
.half.left { left: 0; }
.half.right { right: 0; }
.half > div {
height: 100%;
padding:0 8px;
}
.half.left > div { padding-left: 7px; }
.half.right > div { padding-right: 7px; }
.col {
height: 100%;
margin-top: 3px;
}
#a,
#c {
background-color: green;
}
#b {
background-color: red;
margin-left: auto;
margin-right: auto;
width: 14px;
}
обновление: обновлено без перекрытия