Можно ли остановить текстовые поля шириной 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>

Если это запустить, вы можете увидеть, посмотрев на "нормальное" текстовое поле, что "широкое" текстовое поле выступает за пределы контейнера. "Нормальное" текстовое поле перемещается к фактическому краю контейнера. Я пытаюсь заставить "широкое" текстовое поле заполнить свой контейнер, не расширяясь за край, как "нормальное" текстовое поле.

12 ответов

Решение

Что вы можете сделать, это удалить "дополнительные" по умолчанию на 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>

Изменить: Другой вариант, вместо удаления стиля из 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 и граница.

Есть ли способ заставить текстовое поле заполнить ширину контейнера, не выходя за его пределы?

Да: с помощью свойства CSS3 'box-sizing: border-box' вы можете переопределить, что означает 'ширина', чтобы включить внешний отступ и рамку.

К сожалению, потому что это CSS3, поддержка не очень развита, и поскольку процесс спецификации еще не закончен, он пока что имеет другие временные имена в браузерах. Так:

input.wide {
    width: 100%;
    box-sizing: border-box;
    -moz-box-sizing: border-box;
    -webkit-box-sizing: border-box;
}

Альтернативой старой школы является просто поместить количество 'padding-right' на включающий элемент

или , равное примерно тому, сколько дополнительных левого и правого отступа / границы в 'px', как вы думаете, браузеры будут дать вход. (Обычно 6px для IE<8.)

Это решило проблему для меня!

Без необходимости внешнего div. Просто примените его к данному текстовому полю.

box-sizing: border-box; 

С помощью этого свойства "Свойства ширины и высоты (и свойства min/max) включают содержимое, отступы и рамку, но не поле"

Смотрите описание имущества в w3schools.

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

Просто столкнулся с этой проблемой сам, и единственное решение, которое я смог найти, работавшее во всех моих тестовых браузерах (IE6, IE7, Firefox), было следующее:

  1. Оберните поле ввода в два отдельных DIV
  2. Установите внешний DIV на ширину 100%, это предотвратит переполнение документа контейнером
  3. Поместите отступ во внутреннем DIV точного количества, чтобы компенсировать горизонтальное переполнение ввода.
  4. Установите пользовательский отступ на входе так, чтобы он переполнялся на ту же величину, которую я учел во внутреннем 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), поэтому мы устанавливаем отступ справа для внутреннего DIV в 6px.

Поддержка размеров ящиков довольно хороша: http://caniuse.com/

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

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

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

Обратите внимание, что поля, границы и отступы текстового поля включены в размер CSS, указанный для него - это контейнер, который отбрасывает вещи.

Я сносно обошел эту проблему, используя 98%, но это далеко не идеальное решение, поскольку поля ввода имеют тенденцию к дальнейшему сокращению по мере увеличения контейнера.


РЕДАКТИРОВАТЬ: я сталкивался с подобным вопросом - я никогда не пробовал дать ответ, и я не знаю наверняка, относится ли он к вашей проблеме, но похоже, что так и будет.

Одно решение, которое может работать (это работает для меня), состоит в том, чтобы применить отрицательное поле при вводе (текстовое поле)... или фиксированную ширину для 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;

}

Если вы не можете использовать box-sizing:border-box Вы можете попробовать удалить width:100% и положить очень большой size атрибут в <input> Элемент недостаток, однако, вы должны изменить HTML, и не можете сделать это только с помощью CSS:

<input size="1000"></input>

Если вы не можете использовать размер окна (например, когда вы конвертируете 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>

Если вам не нужно делать это динамически (например, ваша форма имеет фиксированную ширину), вы можете просто установить ширину дочернего элемента. <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;
}

Это работает:

<div>
    <input type="text" 
        style="margin: 5px; padding: 4px; border: 1px solid; 
        width: 200px; width: calc(100% - 20px);">
</div>

Первая ширина - это запасное правило для старых браузеров.

Просто введите стиль смещения для дополнительного заполнения. В следующем примере отступ на входе будет 10 пикселей слева и справа для общего смещения отступа 20 пикселей:

input[type=text]{
   width: calc(100% - 20px);
}
Другие вопросы по тегам