Подтвердить что ты не робот

CSS: текстовое поле для заполнения родительского контейнера

Я пытаюсь разрешить <input type="text"> (далее называемый "текстовым полем" ) заполнить родительский контейнер настройками width до 100%. Это работает до тех пор, пока я не дам текстовому полю дополнение. Затем это добавляется к ширине содержимого и переполнению поля ввода. Обратите внимание, что в Firefox это происходит только при рендеринге контента в соответствии со стандартами. В режиме quirks применяется другая модель коробки.

Здесь минимальный код для воспроизведения поведения во всех современных браузерах.

#x {
  background: salmon;
  padding: 1em;
}

#y, input {
  background: red;
  padding: 0 20px;
  width: 100%;
}
<div id="x">
  <div id="y">x</div>
  <input type="text"/>
</div>
4b9b3361

Ответ 1

Вы можете окружить текстовое поле <div> и указать <div> padding: 0 20px. Ваша проблема заключается в том, что ширина 100% не содержит значений заполнения или поля; эти значения добавляются поверх 100% -ной ширины, таким образом, переполнение.

Ответ 2

С помощью CSS3 вы можете использовать свойство box-sizing на своих входах для стандартизации своих моделей боксов. Что-то вроде этого позволит вам добавить прописку и иметь 100% ширину:

input[type="text"] {
    -webkit-box-sizing: border-box; // Safari/Chrome, other WebKit
    -moz-box-sizing: border-box;    // Firefox, other Gecko
    box-sizing: border-box;         // Opera/IE 8+
}

К сожалению, это не сработает для IE6/7, но все остальное в порядке (Список совместимости), поэтому, если вам нужно поддержать эти браузерами лучше всего будет решение Davids.

Если вы хотите прочитать больше эту блестящую статью Криса Койера.

Надеюсь, это поможет!

Ответ 3

Из-за того, как определяется и реализуется Box-Modell, я не думаю, что существует только css-решение этой проблемы, (Помимо того, что описано Matthew: использование процента для заполнения, например, ширина: 94%, заполнение: 0 3%;)

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

Интересный побочный продукт некоторого тестирования, который я сделал: Firefox делает, устанавливает ширину поля ввода до 100%, если дополнительно к width: 100%; вы также устанавливаете максимальную ширину до 100%. Это не работает в Opera 9.5 или IE 7, хотя (не тестировали старые версии).

Ответ 4

Это, к сожалению, невозможно с чистым CSS; Изменения HTML или Javascript необходимы для любого нетривиального гибкого, но ограниченного поведения пользовательского интерфейса. Столбцы CSS3 помогут в этом отношении несколько, но не в таких сценариях, как ваша.

Решение David является самым чистым. На самом деле это не случай с девитами - вы не добавляете кучу divs без необходимости или даете им классные имена, такие как "p" и "h1". Он служит определенной цели, и в этом случае приятно, что это также расширяемое решение - например, вы можете добавить закругленные углы в любое время, не добавляя ничего дальше. Доступность также не затрагивается, поскольку они являются пустыми div.

Fwiw, вот как я реализую все мои текстовые поля:

<div class="textbox" id="username">
    <div class="before"></div>
    <div class="during">
        <input type="text" value="" />
    </div>
    <div class="after"></div>
</div>

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

Другие решения - использовать таблицы, например. Amazon использует таблицы, чтобы получить гибкий, но ограниченный макет, или использовать Javascript для настройки размеров и обновления их при изменении размеров окна, например. Документы Google, Карты и т.д. Все это делают.

В любом случае, мои два цента: не позволяйте идеализму встать на путь практичности в таких случаях.:) Решение David работает и вряд ли загромождает HTML вообще (и на самом деле использование семантических классных имен вроде "before" и "after" по-прежнему очень чистое imo).

Ответ 5

Я считаю, что вы можете противостоять переполнению с отрицательным отрывом. то есть

margin: -1em;

Ответ 6

Такое поведение вызвано различными интерпретациями модели окна. В правильной модели окна указано, что ширина применяется только к содержимому, а добавление и добавление к нему добавляются. Таким образом, вы получаете 100% плюс 20px правое и левое дополнение, равное 100% + 40px, как общая ширина. Оригинальная модель IE box, также известная как режим quirks, включает в себя заполнение и разметку по ширине. Таким образом, ширина вашего контента в этом случае будет составлять 100% - 40 пикселей. Вот почему вы видите два разных поведения. Насколько я знаю, для этого нет решения, однако существует проблема, устанавливая ширину, чтобы сказать 98%, и отступы до 1% с каждой стороны.

Ответ 7

@Domenic это не работает. width auto не делает ничего больше, чем поведение по умолчанию этого элемента, потому что начальное значение ширины авто (см. стр. 164, Cascading Style Sheets Level 2 Revision 1 Specification). Присвоение отображения блока типов также не работает, это просто говорит браузеру использовать блок-блок при отображении элемента и не присваивает по умолчанию поведение как можно большего пространства, например, div (см. Стр. 121, Каскадный стиль Листы 2-го уровня версии 1). Это поведение обрабатывается визуальным пользовательским агентом, а не определением CSS или HTML.

Ответ 8

Отступ по умолчанию и граница будут препятствовать тому, чтобы ваше текстовое поле действительно составляло 100%, поэтому сначала вы должны установить их в 0:

input {
    background: red;
    padding: 0;
    width: 100%;
    border: 0; //use 0 instead of "none" for ie7 
}

Затем поместите свою границу и любое дополнение или поля, которые вы хотите в div вокруг текстового поля:

.text-box {
    padding: 0 20px;
    border: solid 1px #000000;
}

<body>
    <div id="x">
        <div id="y">x</div>
        <div class="text-box"><input type="text"/></div>
    </div>
</body>

Это должно позволить вашему текстовому окну расширяться и указать нужный размер без javascript.