Вы имеете дело с сворачиванием полей .
См .: http://www.w3.org/TR/CSS21/box.html#collapsing-margins
Короче говоря, верхнее поле #main и #header находятся рядом с (примыкающим) полем #mainNav. Такие вертикально прилегающие края обычно сворачиваются; они образуют одну общую маржу. Сравните это с границами td с border-collapse: collapsed
- они тоже становятся одной границей, ширина которой равна самой толстой границе.
Коллапсируют только вертикальные поля, и они рушатся, только если они примыкают и не являются специальными . Смотрите подробности в спецификации, но такие вещи, как абсолютное позиционирование, плавающее и некоторые другие вещи, предотвратят падение полей.
Например, вы можете установить #header { padding-top:1px; }
или применить один из описанных в спецификации случаев, которые препятствуют соприкосновению границ (например, плавание элемента). Обратите внимание, что плавающие и другие случаи предотвращают сужение полей, чтобы упростить спецификацию: вы входите на сложную территорию за небольшую прибыль.
Ваш запасной вариант использования отступа вместо отступа (или применения любого промежуточного интервала, например, отступа в 1 пиксель, который я описал ранее) - лучший выбор; они влияют на остальную часть вашего макета довольно минимально, тогда как введение поплавков и / или абсолютного позиционирования может вызвать странные взаимодействия, когда страницы становятся сложными (в частности, когда вы начинаете рассматривать сценарии печати).