плыть налево; против дисплея: встроенный; vs display: встроенный блок; против отображения: ячейка таблицы;

<h2>мои вопросы)</h2><ol> <li> <p>любой из этих методов предпочитает профессиональный веб-дизайнер?</p> </li> <li> <p>любой из этих методов предпочтительнее веб-браузера при рисовании веб-сайта?</p> </li> <li> <p>это все только личные предпочтения?</p> </li> <li> <p>есть ли другие техники, которые мне не хватает?</p> </li> </ol><p><em> примечание. приведенные выше вопросы касаются разработки многостолбцовой компоновки </em></p><hr><h2>плыть налево;</h2><p> <a href="http://jsfiddle.net/cde6a/">http://jsfiddle.net/cde6a/</a> </p><p><img src="https://i.stack.imgur.com/oimvg.png" alt="float:left image"></p><p>это метод, который я всегда использую при создании макетов столбцов, и он, кажется, работает очень хорошо. родитель, однако, рушится сам по себе, поэтому вам просто нужно помнить <code>clear:both;</code> впоследствии. еще один <em> con </em>, который я только что обнаружил, - это невозможность выравнивания текста по вертикали.</p><h2>дисплей: встроенный;</h2><p>это, кажется, исправляет проблему коллапсирующего родителя, но добавляет пробел.</p><p> <a href="http://jsfiddle.net/cde6a/1/">http://jsfiddle.net/cde6a/1/</a> </p><p><img src="https://i.stack.imgur.com/adgsb.png" alt="display:inline image"></p><p>удаление пробелов из html, кажется, является самым простым решением этой проблемы, но нежелательно, если вы действительно разборчивы в своем html.</p><p> <a href="http://jsfiddle.net/cde6a/2/">http://jsfiddle.net/cde6a/2/</a> </p><p><img src="https://i.stack.imgur.com/qgnll.png" alt="no html whitespace image"></p><h2>дисплей: встроенный блок;</h2><p>кажется, ведет себя точно так же, как <code>display:inline;</code>.</p><p> <a href="http://jsfiddle.net/cde6a/3/">http://jsfiddle.net/cde6a/3/</a> </p><p><img src="https://i.stack.imgur.com/adgsb.png" alt="display:inline-block image"></p><h2>дисплей: таблица-клетки;</h2><p> <a href="http://jsfiddle.net/cde6a/4/">http://jsfiddle.net/cde6a/4/</a> </p><p><img src="https://i.stack.imgur.com/bptxn.png" alt="display:table-cell image"></p><p>работает отлично.</p><h2>мои мысли:</h2><p>я уверен, что мне не хватает тонны вещей, вроде определенных исключений, которые нарушают компоновку, но <code>display:table-cell;</code>, кажется, работает лучше всего, и я думаю, что я начну заменять <code>float:left;</code>, так как мне всегда кажется, что я испортил <code>clear:both;</code>. я прочитал много статей и блогов об этом в интернете, но ни одна из них не дает мне однозначного ответа о том, что я должен использовать при размещении своего сайта.</p>

<p><strong> из вариантов, о которых вы спрашивали: </strong></p><ul> <li><code>float:left;</code><br> мне не нравятся поплавки из-за необходимости иметь дополнительную разметку для очистки поплавка. насколько мне известно, вся концепция <code>float</code> была плохо разработана в спецификациях css. но сейчас мы ничего не можем с этим поделать. но важно то, что он работает и работает во всех браузерах (даже в ie6/7), поэтому используйте его, если вам это нравится.</li> </ul><p>дополнительная разметка для очистки может не потребоваться, если вы используете селектор <code>:after</code> для очистки поплавков, но это не вариант, если вы хотите поддерживать ie6 или ie7.</p><ul> <li> <p><code>display:inline;</code><br> это не должно использоваться для разметки, за исключением ie6/7, где <code>display:inline; zoom:1</code> - это запасной вариант взломанной поддержки <code>inline-block</code>.</p> </li> <li> <p><code>display:inline-block;</code><br> это мой любимый вариант. он работает хорошо и согласованно во всех браузерах, с оговоркой для ie6/7, которые поддерживают его для некоторых элементов. но смотрите выше для хакерского решения, чтобы обойти это.</p> </li> </ul><p>другой большой недостаток <code>inline-block</code> заключается в том, что из-за встроенного аспекта пробелы между элементами обрабатываются так же, как пробелы между словами текста, поэтому вы можете получить пробелы между элементами. для этого есть обходные пути, но ни один из них не идеален. (лучше всего просто не иметь пробелов между элементами)</p><ul> <li><code>display:table-cell;</code><br> еще один, где у вас будут проблемы с совместимостью браузера. старые ie не будут работать с этим вообще. но даже для других браузеров стоит отметить, что <code>table-cell</code> предназначен для использования внутри контекста элементов, стилизованных как <code>table</code> и <code>table-row</code>; использование <code>table-cell</code> изолированно не предназначенный для этого способ, поэтому вы можете столкнуться с тем, что разные браузеры воспринимают его по-разному.</li> </ul><p><strong> другие техники, которые вы, возможно, пропустили? да. </strong></p><ul> <li> <p>поскольку вы говорите, что это для многоколоночного макета, есть <a href="http://www.quirksmode.org/css/multicolumn.html">функция css columns</a> , о которой вы, возможно, захотите узнать. однако это не самая хорошо поддерживаемая функция (не поддерживается ie даже в ie9, а также префикс поставщика, необходимый для всех других браузеров), поэтому вы можете ее не использовать. но это еще один вариант, и вы спросили.</p> </li> <li> <p>также есть функция css flexbox, которая позволяет вам передавать текст из блока в блок. это захватывающая функция, которая позволяет создавать сложные макеты, но она все еще находится в стадии разработки - см. <a href="http://html5please.com/#flexbox">http://html5please.com/#flexbox</a> </p> </li> </ul><p>надеюсь, это поможет.</p>

<p>я обычно использую <code>float: left;</code> и добавляю <code>overflow: auto;</code> в <a href="http://jsfiddle.net/cde6a/8/">решить проблему с коллапсирующим родителем</a> (что касается того, почему это работает, <code>overflow: auto</code> будет расширять родительский элемент вместо добавления полос прокрутки, если вы не зададите ему явную высоту, <code>overflow: hidden</code> также работает) , большинство потребностей в вертикальном выравнивании, которые у меня были, - это <a href="http://jsfiddle.net/cde6a/9/">одна строка текста в строках меню</a> , которую можно решить с помощью свойства <code>line-height</code>. если мне действительно нужно выровнять элемент блока по вертикали, я бы установил явную высоту для родительского элемента и вертикально выровненного элемента, абсолютную позицию, верхние 50% и отрицательное поле.</p><p>причина, по которой я не использую <code>display: table-cell</code>, заключается в том, что он переполняется, когда у вас больше элементов, чем может обработать ширина сайта. table-cell заставит пользователя выполнять горизонтальную прокрутку, в то время как функции float обернут меню переполнения, делая его все еще пригодным для использования без необходимости горизонтальной прокрутки.</p><p>самое лучшее, что есть в float: left и overflow: auto, это то, что он работает до ie6 без взломов, возможно, даже дальше.</p><p><img src="https://i.stack.imgur.com/n49ls.png" alt="enter image description here"></p>

<p>я бы сказал, что это зависит от того, для чего это нужно:</p><ol> <li> <p>если вам нужно получить только 3 колонки, я бы предложил сделать это с <code>float</code>.</p> </li> <li> <p>если вам это нужно для меню, вы можете использовать <code>inline-block</code>. для решения проблемы пробелов вы можете использовать несколько приемов, описанных крисом койером здесь <a href="http://css-tricks.com/fighting-the-space-between-inline-block-elements/">http://css-tricks.com/fighting-the-space-between-inline-block-elements/</a> .</p> </li> <li> <p>если вам нужно выбрать вариант с несколькими вариантами, ширина которого должна равномерно распределяться внутри указанного поля, я бы предпочел <code>display: table</code>. это не будет работать правильно в некоторых браузерах, поэтому это зависит от поддержки вашего браузера.</p> </li> </ol><p>и наконец, что может быть лучшим методом - использование <code>flexbox</code>. спецификация для этого менялась несколько раз, поэтому она пока не стабильна. но как только он будет завершен, это будет лучший метод, который я считаю.</p>

<p>я предпочитаю inline-block, хотя float также полезен. ячейка таблицы неправильно отображается в старых ie (также как inline-block, но есть хак <code>zoom: 1; *display: inline</code>, который я часто использую). если у вас есть дети, которые имеют меньший рост, чем их родители, поплавки приведут их к вершине, в то время как inline-block иногда облажается.</p><p>большую часть времени браузер будет интерпретировать все правильно, если, конечно, это не ie. вы всегда должны проверять, что ie не сосет - например, концепция ячейки таблицы.</p><p>во всей реальности да, это сводится к личным предпочтениям.</p><p>один из методов, который вы могли бы использовать, чтобы избавиться от пробелов, состоял бы в том, чтобы установить <code>font-size</code> из 0 для родителя, а затем вернуть <code>font-size</code> детям, хотя это хлопотно и грубо.</p>

<p>только для записи, чтобы добавить к ответу спудли, есть также возможность использовать <code>position: absolute</code> и поля, если вы знаете ширину столбцов.</p><p>для меня главная проблема при выборе метода заключается в том, нужны ли вам столбцы для заполнения всей высоты (равных высот), где ячейка таблицы - самый простой метод (если вам не важны старые браузеры).</p>

<p>я предпочитаю <code>inline-block</code>, но <code>float</code> по-прежнему полезен для объединения элементов html, особенно когда у нас есть элементы, которые нужно придерживаться слева, а другой - справа, с плавающей запятой, работающей лучше с меньшим количеством строк, в то время как встроенный блок работает хорошо во многих другие случаи.</p><p> <a href="https://i.stack.imgur.com/d9ulc.jpg"><img src="https://i.stack.imgur.com/d9ulc.jpg" alt="enter image description here"></a> </p>