Вопрос прост и короток: почему overflow: hidden; очищает плавающие? Я заглянул в стандартную документацию w3, и это ничего не значило.
overflow: hidden;
Поскольку вы устанавливаете новый контекст форматирования блока при использовании overflow с чем-либо, кроме visible ( ссылка на спецификации w3.org ).
overflow
visible