Каков наиболее распространенный способ работы с серией блочных элементов, которые должны находиться в строке (например, если javascript должен иметь возможность изменять их ширину)? Каковы плюсы и минусы применения float: left для каждого из них по сравнению с использованием позиционирования для их размещения?






Родительский контейнер не растягивается вместе с ними, если ему также не назначен тег с плавающей запятой или нет br с clear: both; внизу.
Я бы пошел с float: left вместо позиционирования. Браузер выполняет все выравнивание, когда один объект растягивается. Так что вам будет меньше забот.
Я думаю, что я бы не стал позиционировать элементы явно, а скорее проинструктировал бы браузер использовать встроенный макет для элементов с помощью display: inline и позволить браузеру обрабатывать позиционирование.
Что касается поплавка и позиционирования, я думаю, что единственный способ выровнять их с помощью позиционирования - использовать абсолютное позиционирование, а это означает, что вам нужно обрабатывать изменение размеров (порта просмотра браузера), чтобы элементы оставались на месте.
Я думаю, что с помощью свойства float браузер решает проблемы с изменением размера за вас и повторно отображает элемент в нужном месте.
Я бы выбрал плавание, но это действительно зависит от того, чего вы хотите достичь. Если вы можете привести более конкретный пример, я смогу дать вам четкую причину того, что и почему, я думаю, вам следует использовать. Однако вот краткий набор плюсов и минусов, с которыми я столкнулся (я предполагаю, что под позиционированием вы подразумеваете абсолютное позиционирование):
Плюсы позиционирования:
Минусы позиционирования:
Плюсы поплавка:
Минусы поплавков:
Что касается ясности: оба элемента, упомянутые Себастьяном, есть простой способ обойти это. Допустим, у вас есть контейнер div и 2 плавающих div внутри.
HTML:
<div id = "con">
<div class = "float"></div>
<div class = "float"></div>
</div>
CSS:
#con { background:#f0f; }
.float { float:left; width:100px; height:100px; background:#0ff; }
если бы вы запускали этот код, вы бы заметили, что контейнер div (пурпурный) имеет высоту всего в один пиксель, тогда как плавающие div были правильными - это проблема, о которой упоминал Себастьян. Теперь вы можете последовать его совету и добавить в контейнер br или float, что было бы не очень семантически - так что вот немного более элегантное решение. Просто добавьте overflow: hidden; в контейнер div так:
#con { background:#f0f; overflow:hidden; }
Теперь ваш контейнер должен правильно обернуть плавающие блоки.
Единственным недостатком плавания в подобных ситуациях для меня было то, что вам нужно было либо выровнять их по левому краю, либо по правому краю - центрирование не вариант. Однако вы упомянули, что используете абсолютные значения для ширины, поэтому вы можете просто вложить все плавающие элементы в элемент DIV и добавить либо margin-right, либо margin-left к родительскому DIV, чтобы имитировать выравнивание по центру.
Что ж, если вы не слишком озабочены старыми браузерами (я смотрю на вас, IE6), лучший способ здесь - пойти с
display:inline-block;
По сути, он создает элемент блочной модели без очистки до или после него, поэтому он остается в строке. Каждый современный браузер хорошо это интерпретирует.
попробуйте firefox .. у него также есть проблемы с этим свойством .. если я не ошибаюсь, есть -moz-inline-block или что-то для этого ..
Буквально сегодня я кое-что использовал с его помощью (FF3) и не имел никаких проблем, выглядел так же в FF, Opera, Chrome и IE 7.
Плохая идея, есть простые способы реализовать то, о чем он говорит, без использования схематичных элементов, которые не поддерживаются во многих браузерах (IE6 по-прежнему является основным браузером, несмотря на то, что мы все к нему относимся)
IE6 может поддерживать его правильно с небольшими изменениями (quirksmode.org/css/display.html), но, как и многие другие вещи в веб-дизайне, способ решения проблемы напрямую зависит от публики сайта. Вот почему я сказал, что он может использовать его, если его не интересуют старые браузеры.
Проблема с display: inline заключается в том, что он исключает множество параметров для сценариев, включая динамическое изменение ширины.