Модераторы: Illuminaty
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Непонятное поведение margin 
:(
    Опции темы
fell
Дата 12.6.2011, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.12.2008
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Столкнулся недавно с таким странным поведением блоков (div). Чисто теоретически я представлял себе такую картину.
Есть 2  вложенных блока,  блок контейнер в 2 раза больше вложенного блока. Ставим margin-top вложенного блока и блок должен сместится относительно верхней границы блока контейнера на величину margin. Что происходит на самом деле. Сдвигаются 2 блока и блок контейнер и вложенный на величину margin от верхней границы окна. 
Дальше фокус, ставим свойство border:1px solid; для обоих блоков и вуаля, вложенный смещается относительно верхней границы блока контейнера как и должно быть по логике вещей. 
Пример:
Код

<body>
<div id="a">
  <div id="b">
    <p>
      Block
   </p>
  </div>
</div>
</body>

Код

#a{
 background-color:gray;
 height:100px;
}
#b{
  background-color:orange;
  height:100px;
  margin-top:30px;
}


Вопрос, мои представления о блоках неправильные ? и я чего то не понимаю, почему такое поведение блоков без border и почему блоки ведут себя логично, когда есть border ?

Это сообщение отредактировал(а) fell - 12.6.2011, 16:39
PM MAIL WWW   Вверх
olldman
Дата 12.6.2011, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дед
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 9.1.2009
Где: Омск

Репутация: 6
Всего: 6



Я тебе один умный вещь скажу, только ты не обижайся  smile  - может стоит правильно писать цвет? "gray" и ... вуаля, элемент div ведет себя, как это тебе не странно, вполне предсказуемо.
PM MAIL WWW ICQ Skype   Вверх
fell
Дата 12.6.2011, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.12.2008
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Цитата(olldman @ 12.6.2011,  14:59)
Я тебе один умный вещь скажу, только ты не обижайся  smile  - может стоит правильно писать цвет? "gray" и ... вуаля, элемент div ведет себя, как это тебе не странно, вполне предсказуемо.

ага поправил, но положение вещей не изменилось, как и следовало ожидать ...

Приведу тут пример полностью

Код

<!DOCTYPE html>
<html>
<head>
<style type="text/css">
*{
    padding:0;
    margin:0;
}
#a{
    height:100px;
    background-color:orange;

}
#b{
    height:50px;
    background-color:gray;
    margin-top:30px;

}
</style>
</head>
<body>
<div id="a">
    <div id="b">
        <p>Block2</p>
    </div>
</div>
</body>
</html>


Это сообщение отредактировал(а) fell - 12.6.2011, 16:41
PM MAIL WWW   Вверх
olldman
Дата 12.6.2011, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дед
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 9.1.2009
Где: Омск

Репутация: 6
Всего: 6



А, вот ты о чем, ну дык для #a ставим overflow:hidden; и сказка кончается  smile 
PM MAIL WWW ICQ Skype   Вверх
fell
Дата 12.6.2011, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.12.2008
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Цитата(olldman @ 12.6.2011,  16:49)
А, вот ты о чем, ну дык для #a ставим overflow:hidden; и сказка кончается  smile

ага
а можно пояснить механику так сказать, в чем дело то ?
PM MAIL WWW   Вверх
blah
Дата 12.6.2011, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 205
Регистрация: 25.9.2008
Где: моя тачка, чувак?

Репутация: 15
Всего: 17



http://www.w3.org/TR/CSS2/box.html#collapsing-margins На эту тему очень много статей.
PM MAIL ICQ   Вверх
SelenIT
Дата 12.6.2011, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 97
Всего: 401



На русском, например, здесь и здесь. На первый взгляд нелогично, но это следствие изначальной нацеленности CSS на оформление текста, а не раскладку блоков...


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
fell
Дата 12.6.2011, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.12.2008
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Мда, а ведь оно весьма основательно портит нормальную модель поведения блоков. То есть из за эффекта схлопывания, можем поиметь такую вещь, когда внутренний элемент имеет самый большой margin и принимается в расчет только он. Имхо маразм. Чтобы пофиксить это надо ставить 1 пиксельный бордюр или оверфлоу, то есть вставлять фактически хаки, там где они не нужны и не имеют смысла. 

Это сообщение отредактировал(а) fell - 12.6.2011, 19:12
PM MAIL WWW   Вверх
olldman
Дата 12.6.2011, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дед
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 9.1.2009
Где: Омск

Репутация: 6
Всего: 6



Ну, на самом деле не все так плохо, да и я бы не стал называть это "хак", зная о поведении отступов, это просто назначение определенного свойства элементу, не более.
Кстати, не знаю, возможно у тебя не совсем верный подход, может не стоит в твоем случае применять маргин, зависит конечно от дизайна, но я бы для #a назначил -  padding:30px 0px; и соответственно высоту 40рх.
PM MAIL WWW ICQ Skype   Вверх
fell
Дата 12.6.2011, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 17.12.2008
Где: Санкт-Петербург

Репутация: нет
Всего: нет



сделал пока 1px падинг у контейнера, а вот кстати объяснение почему это работает в одном из комментариев к этому посту 

"Этим способам есть простое объяснение: поля (margin) схлопываются при соприкосании. При добавлении padding и border соприкосания не происходит, hidden отсекает поля друг от друга."

update: 
Что в общем то не верно, ибо в примере у нас есть только один margin и margin это отступ от границы (border), а не поля. Можно себе представлять это как будто у контейнера нет границ,  то есть происходит то самое overflow за границы контейнера. Padding и border эти границы обозначают. В этом смысле, вероятно padding, будет лучшей заменой margin.

Это сообщение отредактировал(а) fell - 13.6.2011, 10:41
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Вёрстка веб-сайтов | Следующая тема »


 




[ Время генерации скрипта: 0.0668 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.