Почему элемент фиксированной ширины не занимает место рядом с плавающим элементом?
В этом CodePen, <aside>
элемент оборачивает <article>
элемент.
Но если вы примените ширину к <aside>
элемент (т.е. раскомментировать width: 50px;
), <aside>
переходит к новому ряду, хотя места достаточно, чтобы сидеть рядом с <article>
элемент.
Почему элемент не сидит рядом с плавающим <article>
когда место доступно?
section {
width: 800px;
}
article {
float: left;
width: 500px;
background: #ffffcc;
}
aside {
/* width: 50px; */
background: #ccffcc;
}
<body>
<section>
<article>[[Text]]</article>
<aside>[[Text]]</aside>
</section>
</body>
1 ответ
Делая <article>
полупрозрачный показывает, что на самом деле происходит, когда ширина <aside>
это авто:
section {
width: 800px;
}
article {
float: left;
width: 500px;
background: #ffffcc;
opacity: 0.5;
}
aside {
/* width: 50px; */
background: #ccffcc;
}
<body>
<section>
<article>[[Text]]</article>
<aside>[[Text]]</aside>
</section>
</body>
Это верно: <aside>
поле элемента растягивается горизонтально, чтобы заполнить <section>
, не обращая внимания на плавающие <article>
в целом. Это текст внутри <aside>
который оборачивает вокруг <article>
, а не коробка.
Так, давая <aside>
ширина, которая намного меньше ширины плавающей <article>
фактически нет места для текста рядом с <article>
! Это приводит к тому, что текст перемещается вниз, поскольку текст всегда будет предпочитать перетекание вниз, а не переполнение по горизонтали. Это на самом деле вызывает <aside>
окно элемента, чтобы увеличить высоту, что можно увидеть, когда вы снова делаете <article>
полупрозрачный:
section {
width: 800px;
}
article {
float: left;
width: 500px;
background: #ffffcc;
opacity: 0.5;
}
aside {
width: 50px;
background: #ccffcc;
}
<body>
<section>
<article>[[Text]]</article>
<aside>[[Text]]</aside>
</section>
</body>
Так почему же нет потока <aside>
Сама коробка станет уже или сместится вниз в ответ на поплавок? Это просто потому, что плавающий выводит элемент из потока. И именно поэтому первоначальный макет <aside>
игнорирует <article>
в целом.
Почему текст обтекать поплавок? Поскольку весь смысл операций с плавающей точкой заключается в том, чтобы текст был обернут вокруг плавающего объекта, очень похоже на то, как смысл иметь текст вообще для того, чтобы люди могли его прочитать.
Все, что я описал выше, описано в разделе 9.5 спецификации.
Обратите внимание, что это применимо только тогда, когда <aside>
является блоком блока в потоке, который не устанавливает контекст форматирования блока. Если вы плаваете <aside>
тоже, очевидно, будет сидеть рядом с <article>
, с тех пор у вас есть два поплавка, и два поплавка будут естественно совпадать друг с другом.
И если вы подаете заявление overflow: hidden
, вызывая <aside>
чтобы установить контекст форматирования блока, то он сидит рядом с <article>
даже если он не плавающий (на самом деле это предотвращает наложение текста вокруг плавающего в целом):
section {
width: 800px;
}
article {
float: left;
width: 500px;
background: #ffffcc;
}
aside {
width: 50px;
background: #ccffcc;
overflow: hidden;
}
<body>
<section>
<article>[[Text]]</article>
<aside>[[Text]]</aside>
</section>
</body>
Хотя плавающие объекты никогда не вмешиваются в другие контексты форматирования блоков по своей природе, тот факт, что overflow: hidden
вызывает это не интуитивный побочный эффект, который имеет немного истории за этим.