Textarea для заполнения родительского контейнера точно, с заполнением

Я хочу, чтобы <textarea> полностью заполнил родительский контейнер абсолютно необходимого размера, с заполнением в текстовом поле. У меня это работает для Chrome, используя следующий код:

<div id="wrap"><textarea>hello Qaru world</textarea></div>
/* Color and border CSS omitted for simplicity */
#wrap    { position:absolute; top:10%; left:20%; right:30%; bottom:60%      }
textarea { position:absolute; top:0; left:0; right:0; bottom:0; padding:1em }

enter image description here

К сожалению, Firefox (v5) неправильно соблюдает правую/нижнюю позицию, создавая эти результаты:

Firefox's rendering of the markup; the textarea does not fill the container.

Здесь сценарий, показывающий проблему в действии: http://jsfiddle.net/ZEhwR/

Как я могу достичь результата, указанного в первом предложении в Chrome и FF (и в идеале IE9)?

Ответ 1

Используйте width: 100%; height: 100%, чтобы текстовое поле заполнило div. К сожалению, вы не сможете нанести маржи/отступы, так как они ДОБАВЛЯТЬ на 100%, поэтому края справа/внизу будут переполняться.

Изменить. Чтобы использовать width:100% вместе с дополнением, вы можете изменить модель размера рамки:

width:100%;
height:100%; 
box-sizing: border-box;         /* For IE and modern versions of Chrome */
-moz-box-sizing: border-box;    /* For Firefox                          */
-webkit-box-sizing: border-box; /* For Safari                           */

При этом изменении 100% теперь относится к расстоянию между внешними границами, а не расстоянию между пределами содержимого.

Ответ 2

У меня есть решение, где вы можете иметь ширину и высоту 100% с заполнением в текстовой области. Я использую отрицательные поля для достижения желаемого эффекта.

HTML:

<div class="container">
    <textarea class="text"/></textarea>
</div>

CSS

.container{
  padding: 10px
  border: 1px solid silver
}

.container .text{
  resize: none;
  outline: none;
  width: 100%;
  padding: 10px;
  border: none;
  height: 100%;
  margin: -10px;
}

Протестировано это, работая над Google Chrome и Firefox

Ответ 3

Это случай, когда я настоятельно рекомендую изменить разметку (это даже не повредит семантике):

HTML

<div id="wrap">
  <label class="textarea-label">
    <textarea></textarea>
  </label>
</div>

CSS

.textarea-label
{
  display: block;
  /* border, padding, and other styles go here,
  don't set the height, and don't use floats or positioning */
}

.textarea-label textarea
{
  border: 0 none;
  margin: 0;
  outline: 0 none;
  padding: 0;
  width: 100%;
}

Вы все равно можете изменять размер текстового поля без проблем. Если вы используете inline-block для метки, вы также можете изменить размер по горизонтали.

Преимущество использования метки заключается в том, что щелчок по метке будет по-прежнему фокусировать текстовое поле, как если бы вы нажали на текстовое поле. Кроме того, используя селектор потомков, вы сохраните стили textarea по умолчанию, когда вам просто нужна текстовая область plain-ol.

Ответ 4

Если единственная проблема, с которой сталкивается ваша облицовка, будет добавлена ​​к ширине и высоте 100%, вы можете рассмотреть свойство CSS3 с размером окна. вот пример

.box {
  box-sizing: border-box;
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
  width: 100px;
  padding: 10px;
}

В этом случае поле будет иметь общую ширину 100 пикселей вместо 120 пикселей.

Подробнее об этом значении свойства проверьте ссылка