Плавные макеты CSS с фиксированными отступами/полями

Мне было интересно, знает ли кто-нибудь способ включения отступов или полей ширины пикселя в дизайн плавных столбцов без необходимости дополнительной разметки html.

В качестве дополнительной иллюстрации рассмотрим простой макет html/css, подобный этому:

<style>
    .cont{width:500px;height:200px;border:1px solid black;}
    .col{float:left;}
    #foo{background-color:blue;width:10%;}
    #bar{background-color:yellow;width:30%;}
    #baz{background-color:red;width:60%;}
</style>
<div class="cont">
    <div class="col" id="foo">Foo</div>
    <div class="col" id="bar">Bar</div>
    <div class="col" id="baz">Baz</div>
</div>

Это отображается правильно (не учитывая различные ошибки отображения CSS, о которых можно позаботиться). Однако, как только вы добавите, скажем, 10-пиксельный отступ к классу col, плавающие элементы перестанут отображаться встроенными. То же самое происходит, если вы хотите поместить границу в 3 пикселя к классу col. Я видел методы css, в которых люди будут использовать отрицательное поле, чтобы обратить добавленные пиксели, созданные из блочной модели, но это все равно не уменьшит ширину <div>. В общем, то, что я хочу, — это метод, который позволит мне сохранить ширину 10%, но 10px из этих 10% будут отступами (или отступом или чем-то еще).


person Azmisov    schedule 13.07.2010    source источник


Ответы (4)


Не существует решения до CSS3 без «дополнительной HTML-разметки». width не включает отступы и границы, это характер спецификации. Если вы хотите избежать отрицательных полей, то подойдет просто одна дополнительная оболочка в каждом div. CSS:

.padder {border: 3px solid green; padding: 10px;}

HTML:

<div class="cont">
    <div class="col" id="foo"><div class="padder">Foo</div></div>
    <div class="col" id="bar"><div class="padder">Bar</div></div>
    <div class="col" id="baz"><div class="padder">Baz</div></div>
</div>

Для совместимости с CSS3 см. ответ bobince, в котором используется box-sizing.

person ScottS    schedule 13.07.2010
comment
Я боялся, что кто-то скажет, что это невозможно. Мне просто нужно было подтвердить, спасибо! - person Azmisov; 13.07.2010

Вы можете сделать это, используя box-sizing, чтобы изменить значение width, чтобы оно включало отступы (и границу — немного похоже на блочную модель в Quirks Mode, без других недостатков).

box-sizing — это предлагаемый стиль CSS3, что, к сожалению, означает, что он не будет работать на старых и скрывают браузеры, и в некоторых браузерах он по-прежнему нуждается в префиксе.

.col{
    float:left; padding: 10px;
    box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box;
}

Что еще более важно, он не работает в IE до IE8. Если вы не хотите компенсировать это, переводя эти браузеры в Quirks Mode — а вы действительно не хотите этого делать — вы можете попробовать один из сценариев/поведений исправления, который пытается реализовать box-sizing в IE6-7.

Если этого недостаточно, вам придется вернуться к методу оболочки, как цитирует Скотт. По крайней мере, это будет работать везде.

В любом случае, будьте осторожны с процентами, которые в сумме составляют 100%, и с ликвидным макетом. Если ширина пикселя не делится на проценты, которые вы используете, вы получите округление. WebKit обычно округляет в меньшую сторону, что может оставить вас на один или два пикселя меньше вашей полной ширины; IE6-7 будет округлять до ближайшего, что, если вам не повезет, может оставить вас на один или два пикселя больше, что приведет к неожиданному переносу ваших плавающих элементов.

person bobince    schedule 13.07.2010

другой вариант - вручную рассчитать ширину/маржу/отступ.

Это возможно, поскольку контейнер имеет фиксированную ширину.

person Davy Meers    schedule 13.07.2010
comment
Я предположил, что, поскольку конструкция столба жидкости была упомянута, фиксированный контейнер width был здесь больше для демонстрационных целей. Но если это не так, то я согласен с davyM. - person ScottS; 13.07.2010

Избавьте себя от массы проблем и посмотрите 960 grids (960.gs), Blueprint (http://www.blueprintcss.org/) или YUI (http://developer.yahoo.com/yui/grids/) Все решают эту проблему так, что вы просто определяете процентное соотношение (или количество ячеек в случае 960), а остальная работа выполняется за вас. У YUI и 960 даже есть генератор, поэтому вам не нужно выполнять работу. В качестве дополнительного бонуса некоторые из этих CSS-фреймворков имеют «сброс» css, который «отменяет» недостатки IE и стандартизирует шрифты, интервалы и т. д., которые сводят нас с ума, ребята, с пользовательским интерфейсом.

Недавно я провел обновление нескольких тысяч веб-страниц различного дизайна для соответствия нормативным требованиям для крупного международного банка. Вначале мы стандартизировали YUI, и мне действительно нравилась часть «сеток» из-за простоты развертывания. Он обрабатывает сайты с более чем 1 миллионом уникальных пользователей в день без сбоев или заметных задержек. Как только вы привыкнете к тому, как это работает, вы сможете создать сайт за считанные минуты, не беспокоясь о плавающих элементах, отступах и т. д. В своей личной работе я использую и Blueprint, и 960 по тем же причинам.

person bpeterson76    schedule 13.07.2010
comment
Да, если вы хотите, чтобы ваш макет зависел от вашей разметки, полностью упустив суть макета CSS и по существу вернувшись к способу работы с таблицами, CSS-фреймворки — отличный способ. Плюс в качестве бонуса большинство из них не могут делать жидкую верстку. О, какой прогресс. - person bobince; 13.07.2010
comment
В частности, YUI без проблем справляется с жидкостью. Как и в простом примере, вы можете использовать проценты в обязательном порядке. - person bpeterson76; 13.07.2010
comment
Я изучил это, спасибо. Но я разрабатываю собственную IDE для сайта для своей компании. Сравнительно многие генераторы сильно ограничены. Ограничено тем, что они специализируются только на одном типе дизайна/типе дизайна. - person Azmisov; 13.07.2010