Могу ли я остановить текстовые поля шириной 100% от расширения их контейнеров?
Предположим, у меня есть текстовое поле, которое я хочу заполнить целую строку. Я бы назвал стиль таким:
input.wide {display:block; width: 100%}
Это вызывает проблемы, поскольку ширина зависит от содержимого текстового поля. Текстовые поля по умолчанию имеют поля, границы и отступы, что делает текстовое поле шириной 100% больше, чем его контейнер.
Например, здесь справа:
Есть ли способ сделать текстовое поле заполнять ширину его контейнера, не расширяясь за его пределами?
Вот пример HTML, чтобы показать, что я имею в виду:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>Untitled Page</title>
<style type="text/css">
#outer{border: 1px solid #000; width: 320px; margin: 0px;padding:0px}
#inner{margin: 20px; padding: 20px; background: #999;border: 1px solid #000;}
input.wide {display:block; margin: 0px}
input.normal {display:block; float: right}
</style>
</head>
<body>
<div id="outer">
<div id="inner">
<input type="text" class="wide" />
<input type="text" class="normal" />
<div style="clear:both;"></div>
</div>
</div>
</body>
</html>
Если это выполняется, вы можете увидеть, посмотрев "нормальное" текстовое поле, в котором "обширное" текстовое поле торчит вне контейнера. "Нормальное" текстовое поле плавает до фактического края контейнера. Я пытаюсь сделать "широкое" текстовое поле заполнить его контейнер, не расширяясь за пределы, как "нормальное" текстовое поле.
Ответы
Ответ 1
Что вы можете сделать, так это удалить "дополнительные" по умолчанию на input
:
input.wide {display:block; width:100%;padding:0;border-width:0}
Это сохранит input
внутри своего контейнера.
Теперь, если вам нужны границы, оберните input
в div
, с границами, установленными на div
(таким образом вы можете удалить display:block
из input
тоже). Что-то вроде:
<div style="border:1px solid gray;">
<input type="text" class="wide" />
</div>
Edit:
Другой вариант заключается в том, чтобы вместо удаления стиля из input
компенсировать его в обернутом div
:
input.wide {width:100%;}
<div style="padding-right:4px;padding-left:1px;margin-right:2px">
<input type="text" class="wide" />
</div>
Это даст вам несколько разные результаты в разных браузерах, но они не будут перекрывать контейнер. Значения в div зависят от того, насколько велика граница на input
и сколько места вы хотите между input
и границей.
Ответ 2
Есть ли способ сделать текстовое поле заполнять ширину его контейнера, не расширяясь за его пределами?
Да: с помощью свойства CSSize: box-size: border-box вы можете переопределить, что означает "ширина", чтобы включить внешнее дополнение и границу.
К сожалению, поскольку CSS3, поддержка не очень зрелая, и поскольку процесс спецификации еще не закончен, у него разные временные имена в браузерах. Итак:
input.wide {
width: 100%;
box-sizing: border-box;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
}
Альтернатива старой школы - просто добавить количество "padding-right" на прилагаемом элементе div > или <td> , равном примерно количеству дополнительных левых и правых дополнений/границ в 'px, думают, что браузер предоставит вход. (Обычно 6px для IE < 8.)
Ответ 3
Просто я столкнулся с этой проблемой, и единственным решением, которое я смог найти во всех моих тестовых браузерах (IE6, IE7, Firefox), было следующее:
- Оберните поле ввода двумя отдельными DIV
- Установите внешний DIV на ширину 100%, это предотвратит переполнение контейнера над документом
- Введите внутреннюю DIV-метку точной суммы, чтобы компенсировать горизонтальное переполнение ввода.
- Задайте настраиваемое дополнение на входе, чтобы оно переполнялось на ту же величину, что и во внутреннем DIV
Код:
<div style="width: 100%">
<div style="padding-right: 6px;">
<input type="text" style="width: 100%; padding: 2px; margin: 0;
border : solid 1px #999" />
</div>
</div>
Здесь полное горизонтальное переполнение для входного элемента - 6px - 2x (padding + border) - поэтому мы устанавливаем padding-right для внутреннего DIV 6px.
Ответ 4
Это решило проблему для меня!
Без необходимости внешнего div. Просто примените его к вашему текстовому полю.
box-sizing: border-box;
С этим свойством "Свойства ширины и высоты (и свойства min/max) включают в себя содержимое, заполнение и границу, но не поле"
См. описание свойства w3schools.
Надеюсь, это поможет кому-то!
Ответ 5
поддержка размера коробки очень хороша: http://caniuse.com/#search=box-sizing
Поэтому, если вы не нацеливаете IE7, вы должны решить такие проблемы, используя это свойство. Слой, такой как sass или less, упрощает обработку правил с префиксом, например, btw.
Ответ 6
Собственно, это потому, что CSS определяет 100% относительно всей ширины контейнера, включая его поля, границы и отступы; это означает, что пространство avail. его содержание составляет некоторую сумму меньше 100%, если у контейнера нет полей, границ или отступов.
Это противоречит интуиции и широко рассматривается многими как ошибка, с которой мы сейчас сталкиваемся. Это эффективно означает, что размеры% не подходят ни для чего другого, кроме контейнера верхнего уровня, и даже тогда, только если у него нет полей, границ или отступов.
Обратите внимание, что поля поля, границы и отступы включены в заданный для него размер CSS - это контейнер, который отбрасывает вещи.
Я неплохо справился с этим, используя 98%, но это менее совершенное решение, так как поля ввода, как правило, уменьшаются, поскольку контейнер становится больше.
EDIT: я столкнулся с этим похожим вопросом - я никогда не пробовал ответ , и Я не знаю точно, относится ли это к вашей проблеме, но похоже, что это будет.
Ответ 7
Одно решение, которое может работать (оно работает для меня), - это применить отрицательный запас на входе (текстовое поле)... или фиксированную ширину для ie7 или отказаться от поддержки ie7.
Это приводит к идеальной ширине пикселя.. Для меня его 7, поэтому я добавил 3 и 4, но он по-прежнему пиксель идеален.
У меня была та же проблема, и я ненавидел иметь дополнительные div для границы и т.д.!
Итак, вот мое решение, которое, похоже, работает!
Вы должны использовать только таблицу стилей ie7, чтобы избежать стартов.
input.text{
background-color: #fbfbfb;
border : solid #eee 1px;
width: 100%;
-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
height: 32px;
*line-height:32px;
*margin-left:-3px;
*margin-right:-4px;
display: inline;
padding: 0px 0 0 5px;
}
Ответ 8
Если вы не можете использовать box-sizing:border-box
, вы можете попробовать удалить width:100%
и поместить очень большой атрибут size
в элемент <input>
, но вам придется изменить html и не можете сделайте это только с помощью CSS:
<input size="1000"></input>
Ответ 9
Если вам не нужно делать это динамически (например, ваша форма имеет фиксированную ширину), вы можете просто установить ширину дочерних элементов <input>
на ширину своего контейнера минус любые украшения, такие как заполнение, край, границы и т.д.:
// the parent div here has a width of 200px:
.form-signin input[type="text"], .form-signin input[type="password"], .form-signin input[type="email"], .form-signin input[type="number"] {
font-size: 16px;
height: auto;
display: block;
width: 280px;
margin-bottom: 15px;
padding: 7px 9px;
}
Ответ 10
Если вы не можете использовать размер окна (например, при преобразовании HTML в PDF с помощью iText). Попробуйте следующее:
CSS
.input-wrapper { border: 1px solid #ccc; padding: 0 5px; min-height: 20px; }
.input-wrapper input[type=text] { border: none; height: 20px; width: 100%; padding: 0; margin: 0; }
HTML
<div class="input-wrapper">
<input type="text" value="" name="city"/>
</div>
Ответ 11
Это работает:
<div>
<input type="text"
style="margin: 5px; padding: 4px; border: 1px solid;
width: 200px; width: calc(100% - 20px);">
</div>
Первая "ширина" - это правило возврата для старых браузеров.
Ответ 12
Просто введите ввод для смещения для дополнительного заполнения. В следующем примере заполнение на входе будет 10px слева и справа для полного смещения заполнения 20px:
input[type=text]{
width: calc(100% - 20px);
}