Почему добавление CSS увеличивает размер элемента?

Я пытаюсь дать моему div и textarea некоторые отступы. Когда я делаю это, он увеличивает размер элемента, а не сужает область содержимого внутри него. Есть ли способ достичь того, что я пытаюсь сделать?

Ответ 1

Вы можете добавить box-sizing:border-box к элементу контейнера, чтобы иметь возможность указывать ширину и высоту, которые не меняются при добавлении дополнений и/или границы элемента.

См. здесь (MDN) для спецификаций.

Обновить (скопированный комментарий для ответа)

В настоящее время значение border-box поддерживается во всех основных браузерах в соответствии с Показатели MDN

Для некоторых браузеров, конечно, требуется правильный префикс, т.е. -webkit и -moz, как вы можете видеть здесь

Ответ 2

Согласно спецификациям CSS2, отображаемая ширина элемента типа ящика равна сумме его ширины, левой/правой границы и слева /right padding (левое/правое поле также входит в игру). Если ваша ячейка имеет ширину "100%", а также имеет границу, границу и дополнение, они будут влиять (увеличивать) ширину, занимаемую объектом.

Итак, если ваше текстовое пространство должно быть на 100% шире, присвойте значения ширине, краю-левому/правому, по-левому/правому и отступы-левому/правому, чтобы их сумма составляла 100%.


В CSS3 мы имеем три модели размера коробки. Вы можете использовать модель border-box:

Указанная ширина и высота (и соответствующие свойства min/max) на этот элемент определяет поле границы элемента. То есть, любой прокладка или граница, указанные на элементе, выложены и нарисованы внутри этой указанной ширины и высоты. Ширина и высота содержимого вычисляются путем вычитания ширины границы и заполнения соответствующие стороны от заданных свойств ширины и высоты.

Ответ 3

Это был беспорядок в части W3C, и различные браузеры только добавили эту сложность с их собственными версиями бокс-моделей. Лично, вместо того, чтобы думать, какой браузер или настройка CSS будут делать трюк, я просто обертываю содержимое окна в еще одну инструкцию DIV и использую поля на этом DIV, вместо того, чтобы использовать отступы, например:

<div id="container" style="width: 300px; border: 10px solid red;">
   <div id="content" style="width: 250px; margin: 25px;">
      Some content
   </div>
</div>

Хотя это работает только для контейнеров с фиксированным размером

Ответ 5

Для более кросс-браузерного решения вы можете избежать этого поведения, обернув любой тег, который требует дополнения в другой тег с фиксированной шириной, и давая ему width: auto. Таким образом, если родитель имеет ширину x, и вы добавляете дополнение к ребенку, ребенок наследует всю ширину x, применяя заполнение правильно, не изменяя ширину родительского элемента или его собственную.

Ответ 6

По умолчанию div разделяет ширину родительского контейнера, поэтому, чтобы избежать проблем с совместимостью с браузером, вы можете добавить дочерний div в указанный div, а затем добавить требуемое дополнение к дочернему div.

N.B - не указывайте ширину дочернего div, потому что она увеличится, если вы добавите дополнение