Вы забыли очистить float. Для этого используется прием под названием clearfix. Если вы обратите внимание, без этого приема высота контейнера с вашими блоками будет равна нулю, и из этого вытекают все проблемы.
Евгений Петров: display: table создает пустую строку и ячейку, что предотвращает margin-collapse. Если умные дяди достаточно умны, чтобы придумывать новые хаки и техники, то этому 100% есть веская причина.
Евгений Петров не будете же вы делать несколько типов clearfix для реального проекта? Сделаете один универсальный класс.
Насчет создаваемого - тут говорится, что "So display:table will automatically generate an anonymous table-row, and within that, an anonymous table-cell..."
Т.е. это утверждение неверно?..
Не думаю, что при вёрстке блока, стоящего за плавающим, рассчитывают на такое поведение контейнера с вложенными элементами. Так что, скорее всего, я для предотвращения выпадения плавающих потомков оставлю только :after.
элементарно можно так же за float'ить контейнер. Дело в том, что у вас оба блока как бы "поднялись" из-за "float" и следовательно блок "схлопывается", т.к. не видит там блоков.