Как я могу сделать TextArea шириной 100% без переполнения, если в CSS есть отступы?

У меня отображается следующий фрагмент CSS и HTML.

textarea
{
  border:1px solid #999999;
  width:100%;
  margin:5px 0;
  padding:3px;
}
<div style="display: block;" id="rulesformitem" class="formitem">
  <label for="rules" id="ruleslabel">Rules:</label>
  <textarea cols="2" rows="10" id="rules"/>
</div>

Проблема в том, что текстовая область оказывается на 8 пикселей шире (2 пикселя для границы + 6 пикселей для заполнения), чем родительская. Есть ли способ продолжить использовать границу и отступы, но ограничить общий размер textarea шириной родительского элемента?


person Eric Schoonover    schedule 07.11.2008    source источник
comment
Кстати, об этом есть хорошая статья Джеффри Уэй на tutsplus здесь: net.tutsplus.com/tutorials/html-css-techniques/ Может, это кому-то поможет;)   -  person Somebody    schedule 04.03.2011


Ответы (15)


Почему бы не забыть о хитростях и просто сделать это с помощью CSS?

Я часто использую:

.boxsizingBorder {
    -webkit-box-sizing: border-box;
       -moz-box-sizing: border-box;
            box-sizing: border-box;
}

См. Поддержку браузера здесь.

person Piet Bijl    schedule 11.11.2010
comment
Не могу поверить, что это сработало. Но это случилось. CSS никогда не бывает таким простым. :-) - person Nate Bird; 12.01.2012
comment
Это должно быть одна из самых крутых вещей, которые я обнаружил за последнее время. Спасибо, есть ли возможность сделать это и в IE7? - person Jeremy A. West; 19.03.2012
comment
Обратите внимание, что вы все равно захотите использовать width: 100% вместе с рамкой. - person Tyler; 07.06.2012
comment
К сожалению, это не будет работать в более старых версиях IE. Это означает, что вам все равно нужно будет написать код для таблицы стилей IE. - person ; 21.03.2013
comment
Разве старые версии Internet Explorer не используют только поведение рамки? - person Peter Hedberg; 01.04.2013
comment
По моему опыту, это отключает атрибут rows. Вам также нужно будет установить высоту через CSS. - person Nick; 09.04.2013
comment
Также отлично работает для элемента формы. Может сработать и для других. - person Gayan Dasanayake; 10.12.2013
comment
Также работает с type = 'file'. - person MrCleanX; 03.01.2014
comment
может кто-нибудь объяснить это, пожалуйста, куда идет этот класс? div, окружающий текстовое поле? - person koolaang; 12.08.2016
comment
Это фантастика ... даже спустя столько лет, все равно каждый день узнавать что-то новое. @koolaang в основном говорит, что размер объекта не должен влиять на отступы, поэтому теоретически вы можете применить этот стиль прямо к самому текстовому полю. - person Mike; 25.08.2016
comment
Согласен, замечательно, я годами игнорировал многие вещи css 3 из-за необходимости поддерживать, например, 7, но в течение последнего года или около того я игнорирую их пользователей, которые также формируют ничтожную долю рынка. Я считаю, что лучшее, что вы можете сделать на данный момент с коммерческой точки зрения, - это полностью игнорировать msie 5 6 7 8, я могу сказать из нашей демографической группы, которая старше, что люди в основном перестали использовать msie в целом из-за этих проблем с поддержкой, и это радует технически пользователи. Так что освободи себя, lol, от тирании msie 8-7, вперед, css 3! - person Lizardx; 09.03.2017

Кажется, что ответ на многие проблемы с форматированием CSS - "добавить еще ‹div>!"

Итак, в этом же духе, пробовали ли вы добавить обертку div, к которой применяются границы / отступы, а затем поместить внутри нее текстовое поле шириной 100%? Что-то вроде (непроверено):

textarea
{
  width:100%;
}
.textwrapper
{
  border:1px solid #999999;
  margin:5px 0;
  padding:3px;
}
<div style="display: block;" id="rulesformitem" class="formitem">
  <label for="rules" id="ruleslabel">Rules:</label>
  <div class="textwrapper"><textarea cols="2" rows="10" id="rules"/></div>
</div>

person Dave Sherohman    schedule 07.11.2008
comment
В итоге я отказался от использования% widths. Я считаю, что ваш подход сработает так же хорошо. Спасибо! - person Eric Schoonover; 08.11.2008
comment
Не забудьте добавить. в класс textwrapper. - person Chris Porter; 24.03.2010
comment
@Chris: Спасибо, исправили. Я слегка удивлен, что кому-то понадобилось почти полтора года, чтобы это уловить ... - person Dave Sherohman; 25.03.2010
comment
Как в этом случае будут выглядеть полосы прокрутки текстового поля? - person Daniel LeCheminant; 22.04.2010
comment
В Chrome, когда вы фокусируете элемент textarea, он автоматически подсвечивается, и если вы создаете отступ для оболочки div, этот отступ будет виден, и из-за этого будут видны две границы. Один из hightlighting, а другой из .textwrapper border: 1px solid # 999999; - person Somebody; 04.03.2011
comment
Я обнаружил проблему при тестировании этого кода, мне пришлось добавить ‹/textarea› вместо ‹textarea .... /›, чтобы он работал правильно. - person Mc-; 19.02.2012

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

На мой взгляд, лучший подход - по возможности использовать низкоуровневые решения для достижения максимальной поддержки браузерами. В этом случае только HTML может работать нормально, избегая использования Javascript (который, во всяком случае, мы все любим).

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

Взглянув на специфику W3C, мы можем заметить следующие преимущества:

  • атрибут «for» не требуется: когда тег LABEL содержит целевой ввод, он автоматически фокусирует дочерний ввод при нажатии;
  • если внешняя метка для текстовой области уже была разработана, конфликтов не возникает, поскольку данный вход может иметь одну или несколько меток.

См. особенности W3C для получения более подробной информации.

Простой пример:

.container { 
  width: 400px; 
  border: 3px 
  solid #f7c; 
  }
.textareaContainer {
	display: block;
	border: 3px solid #38c;
	padding: 10px;
  }
textarea { 
  width: 100%; 
  margin: 0; 
  padding: 0; 
  border-width: 0; 
  }
<body>
<div class="container">
	I am the container
	<label class="textareaContainer">
		<textarea name="text">I am the padded textarea with a styled border...</textarea>
	</label>
</div>
</body>

Заполнение и граница элементов .textareaContainer - это те элементы, которые мы хотим передать текстовому полю. Попробуйте отредактировать их, чтобы оформить как хотите. Я дал элементу .textareaContainer большие и видимые отступы и границы, чтобы вы могли видеть их поведение при нажатии.

person Emanuele Del Grande    schedule 23.03.2010
comment
Не уверен, какие кроссбраузерные ошибки здесь скрываются, но мне понравился подход. +1 - person HRJ; 27.10.2010

Если вас не слишком беспокоит ширина заполнения, это решение фактически сохранит заполнение в процентах.

textarea
{
    border:1px solid #999999;
    width:98%;
    margin:5px 0;
    padding:1%;
}

Не идеально, но вы получите отступы, а ширина в сумме составит 100%, так что все в порядке.

person Chris James    schedule 07.11.2008

Этот код работает у меня с IE8 и Firefox

<td>
    <textarea style="width:100%" rows=3 name="abc">Modify width:% accordingly</textarea>
</td>
person Jeff Guest    schedule 13.11.2013
comment
Работал и в Chrome. - person Sanjeev; 05.01.2018

Вы можете использовать свойство box-sizing, оно поддерживается всеми основными стандартными браузерами и IE8 +. Тем не менее, вам все равно понадобится обходной путь для IE7. Дополнительные сведения см. здесь.

person jzfgo    schedule 25.03.2010
comment
@DavidJohnstone: И поскольку вы больше не разрабатываете сайты для IE7 или старше, это решение :) - person Jonatan Littke; 17.08.2012

Я искал решение для встроенного стиля вместо решения CSS, и это лучшее, что я могу сделать для адаптивного текстового поля:

<div style="width: 100%; max-width: 500px;">
  <textarea style="width: 100%;"></textarea>
</div>
person Jee Mok    schedule 22.10.2018
comment
Да, думаю, это лучшее решение. Спасибо. - person novonimo; 29.09.2020
comment
У меня это не сработало в последней версии Chrome. Мне пришлось использовать min-width: 100%, чтобы он заработал. - person dotcoder; 13.10.2020
comment
@MohanGundlapalli - это простое правило CSS, которое должно работать и для последней версии Chrome. Есть ли другие стили, влияющие на правило width: 100%? возможно, вы можете попробовать проверить его с помощью инструмента разработчика Chrome - person Jee Mok; 14.10.2020

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

Я не думаю, что с вами нормально выражать ширину отступов и границ в процентах от родительского.

person buti-oxa    schedule 07.11.2008

Если вы наберете и сместите его следующим образом:

textarea
{
    border:1px solid #999999;
    width:100%;
    padding: 7px 0 7px 7px; 
    position:relative; left:-8px; /* 1px border, too */
}

правая сторона текстового поля идеально выравнивается с правой стороной контейнера, и текст внутри текстового поля идеально выравнивается с основным текстом в контейнере ... а левая сторона текстового поля 'прилипает немного. иногда бывает красивее.

person commonpike    schedule 03.04.2013

Используйте свойство размера окна:

-moz-box-sizing:border-box; 
-webkit-box-sizing:border-box; 
box-sizing:border-box;

Это поможет

person user3074446    schedule 03.08.2014

Для людей, использующих Bootstrap, textarea.form-control также может привести к проблемам с размером текстового поля. Chrome и Firefox, похоже, используют разную высоту со следующим CSS Bootstrap:

textarea.form-conrtol{
    height:auto;
}
person Gwi7d31    schedule 07.08.2014

Я часто исправляю эту проблему с помощью calc(). Вы просто задаете текстовой области ширину 100% и определенное количество отступов, но вам нужно вычесть общее левое и правое отступы из 100% ширины, которую вы дали текстовому полю:

textarea {
    border: 0px;
    width: calc(100% -10px);
    padding: 5px; 
}

Или, если вы хотите дать текстовому полю границу:

textarea {
    border: 1px;
    width: calc(100% -12px); /* plus the total left and right border */
    padding: 5px; 
}
person Jeroen Bellemans    schedule 15.11.2016

Как насчет отрицательной рентабельности?

textarea {
    border:1px solid #999999;
    width:100%;
    margin:5px -4px; /* 4px = border+padding on one side */
    padding:3px;
}
person meustrus    schedule 14.06.2012

Проблема заключается в свойстве box-sizing. По умолчанию начальное значение свойства box-sizing равно content-box. так что у вас есть что-то вроде этого под капотом:

textarea {
  border:1px solid #999999;
  width:100%;
  margin:5px 0;
  padding:3px;
  box-sizing: content-box;
}

box-sizing: content-box; означает, что ширина фактического элемента равна ширине поля содержимого элемента. поэтому, когда вы добавляете отступы (в данном случае padding-right и padding-left - ›потому что мы говорим о ширине) и границу (в данном случае border-right и border-left -› потому что мы говорим о ширине), эти значения добавляются к окончательной ширине. так что ваш элемент будет шире, чем вы хотите.

установите значение box-sizing: border-box;. поэтому ширина будет рассчитываться так:

horizontal border + horizontal padding + width of content box = width

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

person Ali Baghban    schedule 25.04.2021

person    schedule
comment
+1 Это будет работать в большем количестве браузеров, чем операторы CSS3. К сожалению, миру по-прежнему нужны div-обертки. - person BenSwayne; 11.08.2012
comment
Мне очень нравится этот ответ. Это заставляет текстовое поле соответствовать размерам без каких-либо магических процентных чисел менее 100%. Вы можете использовать отступы со всех сторон в оболочке, чтобы заставить текстовую область перемещаться и оставаться внутри родительской. Минимальная высота и высота также должны составлять 100% обертки. Затем текстовое поле можно установить на 100% с тем же отступом, чтобы все подходило идеально. - person justdan23; 13.12.2018