Есть несколько способов сделать это, но ни один из них не совершенен.
Как вы указали:
- Firefox / Opera / Safari / Chrome / IE8 + распознает свойство размера блока, позволяющее вам использовать границы.
- IE6 будет использовать старую (правильную?) Модель рамки по умолчанию.
- Однако IE7 использует модель блока заполнения W3C в стандартном режиме и не распознает свойство размера блока CSS, поэтому нет способа вернуться к модели рамки. Если вам нужна поддержка IE7 (и вы, вероятно, все еще делаете это), у вас есть один из четырех вариантов:
1. Условные комментарии:
<!--[if IE 7]>
Special instructions for IE 7 here
<![endif]-->
Используйте размеры блока для IE8 и 9, затем сделайте определенные переопределения для IE7. Этот вариант будет болезненным.
2. Шипп Коробка проклеивающая полифилл:
https://github.com/Schepp/box-sizing-polyfill
Этот превосходный Polyfill - это файл HTC, который изменяет поведение браузера по умолчанию в IE6 и 7, поэтому они используют блочную модель W3C. Это хорошо для легкого использования, но может вызвать проблемы самостоятельно, если используется широко. Используйте с осторожностью и ТЕСТ.
3. Вложенные Div в старом стиле:
Подход с вложенным div в старом стиле все еще хорош:
<div style="width:100px; border:1px solid black">
<div style="margin:10px">
Content
</div>
</div>
Несемантический вложенный div обеспечивает косвенное заполнение, с тем недостатком, что ваша разметка становится неопрятной. Очевидно, что не используйте встроенные стили, я использую их здесь для иллюстрации.
Старая поговорка Никогда не используйте отступы для элемента фиксированной ширины все еще остается верным.
4. Мое предпочтительное решение - прямой выбор ребенка:
И наоборот, с помощью прямого дочернего селектора. Допустим, у вас есть div с фиксированной шириной, содержащий некоторое содержимое:
<div class="content">
<h1>Hi</h1>
<p>hello <em>there</em></p>
</div>
Затем вы можете написать правило для добавления левого и правого полей для всех прямых потомков div:
.content {
width:500px;
padding:20px 0;
}
.content > * {
margin:0 20px;
}
Это добавит небольшой запас к h1 и p, но не к вложенным em, создавая видимость заполнения 20px для содержимого div, но не вызывая ошибку модели блока.
5. Рассмотрим прекращение поддержки IE7
IE7 - последний браузер, который не распознает свойство размера блока. Если вы получаете мало трафика из IE7, вы могли бы рассмотреть вопрос о прекращении поддержки. Ваш CSS будет намного приятнее.
По состоянию на конец 2013 года это мой предпочтительный вариант.
РЕДАКТИРОВАНИЕ 2017: Вероятно, уже давно пора отказаться от поддержки IE7 и просто использовать border-box.