Неожиданная маржа в браузерах Webkit

У меня проблема с 2-колоночным, плавным макетом. Оба столбца находятся внутри div (.dp_stage_sizer) с overflow: auto; .spl_aside смещается влево, spl_main — это просто старый добрый position: relative с margin-left.

Это работает нормально, пока я использую значения в пикселях для ширины и поля, но поскольку этот сайт должен быть плавным (в любом случае, ниже определенной ширины окна), все, кроме ширины .dp_stage_sizer, указывается в процентах. Это приводит к тому, что у spl_main появляется дополнительное поле с правой стороны, так что оно не совпадает с его родительским элементом, а только в браузерах Webkit (хотя поле НАМНОГО больше в Safari, чем в Chrome). .

Ниже приведен код в настолько очищенной версии, насколько мне удалось:

HTML:

<div class="dp_stage_sizer">
    <div class = "spl_aside">
        aside
    </div>
    <div class = "spl_main">
        main
    </div>
</div>

CSS:

div.dp_stage_sizer
{
    position: relative;
    max-width: 1080px;
    margin: 0px auto;
    overflow: auto;

    background-color: silver;
}

.spl_main
{
    position: relative;
    margin: 0% 0% 0% 30%;
    overflow: hidden;

    background-color: green;
    height: 400px;
}

.spl_aside
{
    position: relative;
    float: left;
    width: 20%;
    overflow: hidden;

    background-color: red;
    height: 300px;
}

И, наконец, JSFiddle для тех, кто хочет поэкспериментировать.


Ниже приведены изображения, сделанные с помощью веб-инспектора Chrome, на которых показаны поля каждого из трех элементов div:

dp_stage_sizer: поля для ‹code›dp_stage_sizer‹/code›

spl_aside: поля для ‹code›spl_aside‹/code›

spl_main: поля для ‹code›spl_main‹/code›


person Sandy Gifford    schedule 05.12.2012    source источник
comment
Я понятия не имею, что это значит, но я просто попытался переключить боковой столбец на правую сторону (переместил его вправо и отрегулировал поля на spl_main). В этом случае проблема не возникает (на spl_main нет необъяснимого левого поля)   -  person Sandy Gifford    schedule 05.12.2012
comment
Похоже, это может быть проблема с пробелами. Попробуйте установить для контейнера «размер шрифта:» значение «0» и сбросить его для его дочерних элементов.   -  person Henrik    schedule 05.12.2012
comment
Нет кости =( Кроме того, с помощью веб-инспекторов вы можете увидеть поле, выделенное как поле. Я опубликую изображение через секунду.   -  person Sandy Gifford    schedule 05.12.2012
comment
Также стоит отметить, что веб-инспектор сообщает 0 полей справа, и что ширина spl_aside, похоже, оказывает некоторое влияние на магическое поле.   -  person Sandy Gifford    schedule 05.12.2012
comment
Две вещи, которые работают для меня: 1. Если я установлю .spl_main на 76% ширины, он подходит. (хотя это не имеет смысла - 30% + 76% - это не 100%, откуда я родом) 2. Если я установлю .spl_aside для использования position:absolute вместо float, поля будут правильными.   -  person Henrik    schedule 05.12.2012
comment
Я заметил, что это компенсировалось примерно на 75%, но я не был полностью удовлетворен внесением такого рода изменений, не понимая сначала, почему. position: absolute работает, я думаю. Пока я держу этот overflow: auto на вершине div. Я проведу некоторые тесты на нем, прямо сейчас.   -  person Sandy Gifford    schedule 05.12.2012
comment
Кажется, работает как шарм. В любом случае, это, вероятно, более надежный способ структурировать вещи. Спасибо! Напишите это как ответ, чтобы я мог принять его за вас!   -  person Sandy Gifford    schedule 05.12.2012
comment
ГУХ! ВААААААИТ. Нет, не уходи. Использование position: absolute не приводит к изменению размера dp_stage_sizer, если spl_aside больше (на самом деле это возможно в моем макете). Любые другие идеи?   -  person Sandy Gifford    schedule 05.12.2012


Ответы (2)


Альтернативным решением может быть использование inline-blocks. Однако то, как вы это реализуете, зависит от того, какая поддержка браузера вам нужна. Оставляю свое предложение на скрипке.

person Henrik    schedule 05.12.2012
comment
Меня все еще немного беспокоит использование встроенного блока на крупном клиенте. Необходимость полагаться на взлом *IE заставляет меня чувствовать, что я недостаточно хорошо поработал. Тем не менее, это лучший ответ, пока. Я отправлю его на тестирование (этот проект просто приостановлен до понедельника). Думаешь, ты не имеешь ни малейшего представления о том, что вызывает все это? - person Sandy Gifford; 05.12.2012
comment
Боюсь, что нет, но кажется, что у него должен быть простой ответ. Надеюсь, коллективный разум Stack Overflow решит эту проблему! - person Henrik; 05.12.2012

Вы можете обойти эту проблему, установив position: absolute на .spl_aside вместо плавающего. Имейте в виду, что это означает, что вы потеряете возможность использовать clear:float, если в какой-то момент захотите разместить контент под ним.

person Henrik    schedule 05.12.2012
comment
Извините, я только что нашел недостаток с этим, он был так близок. В моем макете любой столбец может быть больше. Если сторона больше, размер dp_stage_sizer не изменится. - person Sandy Gifford; 05.12.2012
comment
Тем не менее +1 за почти ответ - person Sandy Gifford; 05.12.2012