Как сделать "float: left" без упаковки?
У меня есть контейнер box1
, который имеет определенную ширину (которая может меняться в зависимости от ее содержимого). В этом поле содержится box2
, который имеет фиксированную ширину (это может быть значок). Рядом с box2
у меня есть box3
с некоторым текстом. Я хочу, чтобы текст использовал все пространство, имеющееся справа от box2
. С помощью HTML, вставленного ниже, вы получите:
![Short text]()
Пока все хорошо. Если текст становится длиннее, он не обтекает box2
(это то, что я хочу), однако он не увеличивает box1
, что является моей проблемой. Вы скажете мне "эй, если вы сделали box3
a position: absolute
, как вы могли ожидать, что он сделает box1
расти?". Ну, тогда я не знаю, как я могу получить box3
, чтобы показать рядом с box2
, использовать все доступные горизонтальные пространства и при необходимости увеличить box1
? (Должен ли я сказать, что мне бы хотелось, чтобы эта работа над IE6 продолжалась и чтобы не использовать таблицу?)
![Long text]()
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<style type="text/css">
#box1 { position: relative }
#box3 { position: absolute; left: 2.5em; right: .5em; top: .5em }
/* Styling */
#box1 { background: #ddd; padding: 1em 0.5em; width: 20em }
#box2 { background: #999; padding: .5em; }
#box3 { background: #bbb; padding: .5em; }
body { font-family: sans-serif }
</style>
<script type="text/javascript">
</script>
</head>
<body>
<div id="box1">
<span id="box2">2</span>
<span id="box3">3</span>
</div>
</body>
</html>
Ответы
Ответ 1
Вам нужно поле 3, чтобы быть элементом уровня блока, поэтому используйте display:block
, а затем введите в overflow:hidden
вместе с float
-box box 2:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<style type="text/css">
#box1 { }
#box2 { float:left; }
#box3 { display:block;overflow:hidden; }
/* Styling */
#box1 { background: #ddd; padding: 1em 0.5em; width: 20em }
#box2 { background: #999; padding: .5em; }
#box3 { background: #bbb; padding: .5em; }
body { font-family: sans-serif }
</style>
<script type="text/javascript">
</script>
<title>How to do a `float: left` with no wrapping?</title>
</head>
<body>
<div id="box1">
<span id="box2">2</span>
<span id="box3">3<br />3<br />3<br />3<br />3<br />3<br />3<br />3<br />3<br />3<br />3<br />3<br /></span>
</div>
</body>
</html>
Удивительные вещи overflow:hidden
могут делать: D
Ответ 2
Есть несколько способов добиться этого. Два общих - либо иметь пустой элемент сразу после clear: both
, как это (inline css только для демонстрации):
<span class="box1">...</span>
<br style="clear:both"/>
Другой способ - использовать overflow: hidden
так:
<span class="box1" style="overflow: hidden">...</span>
Однако существуют проблемы с обоими из этих решений. С первым вы добавляете ненужную и уродливую разметку. И со вторым, если вы хотите, чтобы что-то было помещено вне вашего поля (например, position: absolute
), оно не будет видно.
Более распространенным, современным решением является использование псевдоэлемента ::after
и ясно, что так:
.box1::after {
content: '';
display: table;
clear: both;
}
Ответ 3
Я бы рекомендовал следующее:
#box1
{
position: relative; /* or some other positioned value */
}
#box2
{
width: 10px;
height: 10px;
position: absolute;
top: 0;
left: 0;
}
#box3
{
margin-left: 10px;
}
Если #box2
имеет фиксированный размер, вы можете просто использовать margin для #box3
, чтобы предотвратить его перекрытие #box2
, и поскольку он не позиционирован, #box1
будет расти по мере роста #box3
.