2009-08-21 2 views
1

Итак, я уже давно занимаюсь html .. но я постоянно сталкиваюсь с проблемами, когда использую поля. Это заставляет меня обычно просто использовать отступы.Верхняя маржа не действует, как я ожидаю .. почему?

В любом случае, позвольте мне привести пример того, над чем я сейчас работаю.

http://vasoshield.xcsit.com/index.html

Основная структура:

<div id="main"> 
    <div id="header"> 
     <div id="mainNav"> 
      main navigation... 
     </div> 
    </div> 
    <div id="content"> 
     page content... 
    </div> 
</div> 



#main { 
    margin: 0 auto; 
    width: 745px; 
    padding-left: 175px; 
    padding-right: 50px; 
    background: url(../images/white_bg.jpg) no-repeat top left; 
    position: relative; 
} 

#header { 
    height: 210px; 
} 
#mainNav { margin-top: 175px; } 

проблемы есть .. я ставлю маржинальный-топ: 150px на "Mainnav" DIV .. и вместо того, чтобы толкать вниз 150px от "заголовка" DIV .. вся страница перемещается вниз. Таким образом, «главный» div acty получает толчок вниз 150 пикселей. Я не понимаю, почему! Если я использую padding-top: 150px для div «mainNav», на самом деле он использует «заголовок» div для отказа.

Имеет ли смысл мой вопрос?

Я уверен, что существует какое-то правило, о котором я просто не знаю. Спасибо заранее!

ответ

6

Вы имеете дело с сворачивающимися полях.

См: http://www.w3.org/TR/CSS21/box.html#collapsing-margins

Короче говоря, верхний край #main и #header находятся рядом (примыкающей) запас #mainNav. Такие вертикально прилегающие поля обычно сворачиваются; они образуют один комбинированный запас. Сравните это с границами td с border-collapse: collapsed - они тоже становятся только одной границей, ширина которой равна самой толстой границе.

Только вертикальные поля разрушаются, и они только рушится, если они прилегают, и они не являются специальными. См. Спецификацию для получения полной информации, но такие вещи, как абсолютное позиционирование, плавание и некоторые другие вещи, предотвратят крах полей.

Например, вы можете установить #header { padding-top:1px; } или применить один из описанных в спецификации случаев, которые препятствуют смещению границ (например, плавающий элемент). Обратите внимание, что плавающие и другие случаи не позволяют краям сворачиваться, чтобы упростить спецификацию: вы входите в сложную территорию, для небольшого выигрыша.

Ваш резервный вариант использования прокладки вместо поля (или применение любого промежуточного интервала, например, 1px padding, описанное выше) - лучший выбор; они влияют на остальную часть вашего макета практически минимально, тогда как введение поплавков и/или абсолютное позиционирование могут вызвать странные взаимодействия после того, как страницы станут сложными (в частности, как только вы начнете рассматривать сценарии печати).

+1

прохладный. это объясняет логику этого. в принципе, если я смогу предотвратить сведение краев, моя проблема решена. добавляя «переполнение: скрытый», я предполагаю, что div будет «особенным», в свою очередь, предотвращая крах (так же, как и граница или дополнение и т. д.). я прав? – Roeland

+0

Да, добавление '#header {overflow: hidden; } 'будет работать отлично, и это немного проще, чем моя идея настройки крошечной верхней части. Хорошая идея! –

-1

попытайтесь установить основную позицию на позиции: абсолютное; Думаю, это сработает. Я не знаю причину

+0

Это работает по той же причине, что и мой комментарий выше относительно «переполнения: скрытый».Использование «position: absolute» также устанавливает элемент как новый «корень потока», но «position: absolute» не так хорош для решения этой конкретной проблемы, так как это может иметь более непредсказуемые последствия для макета. – Wick

0

Поскольку в разделе header нет содержимого div до mainNav div, то маржа - это первое, что должен учитывать браузер, поэтому выглядит так, как если бы вся страница сместилась вниз , Я предлагаю добавить 1px solid red границ для всех div, чтобы вы могли видеть, куда идти.

+1

На самом деле, добавление 'border: 1px solid red 'предотвратит сбой краев ;-). Это сделает комплекс отладки ... То, что вам нужно, - это «контур: 1px пунктирный красный», который просто накладывает контур без изменения макета (работает во всех распространенных браузерах, кроме IE7 или старше) –

+0

, что является REALY nice to знать. граница обычно беспорядочна, потому что я, как правило, плавающий материал пиксель совершенный .. так что 1 пиксель слишком сильно отбрасывает макет. – Roeland

+0

@Roeland: есть много способов отладки макетов CSS. Вы также можете использовать разные цвета фона или изображения или что угодно. Только иметь отношение не поможет :) –

1

Хорошо .. просто добавление переполнения: скрыто в «основном» контейнере. Не спрашивайте меня, почему!

+0

«переполнение: скрыто» работает, потому что это часть предполагаемого поведения спецификации модели коробки. См. Набор правил, показанный ниже «Пример X» на http://www.w3.org/TR/css3-box/#collapsing-margins ... Установка свойства переполнения на что-либо, кроме «видимого», устанавливает элемент как «корень потока», который по существу означает, что он устанавливает свой собственный формат форматирования. Этот трюк (а не взлом!) Очень удобен для хранения поплавков и предотвращения краха полей. – Wick

Смежные вопросы