Текстовое поле ввода HTML шириной 100% переполняет ячейки таблицы - PullRequest
101 голосов
/ 03 марта 2010

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

В простом приведенном ниже поле ввода перейдите за границу ячеек таблицы, результат будет ужасным. Это было проверено, и это происходит таким же образом на: Firefox, IE7 и Safari.

Имеет ли это смысл для вас? Я что-то упустил, знаете ли вы о возможном решении?

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">    
<html><head>    
   <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <!-- don't use closing slash in meta tag, it breaks HTML4.01 transitional -->
   <title>Test input text in table</title>
   <style type="text/css">      
      table {border-top: 1px solid #ff0000; border-left: 1px solid #ff0000;}
      table td {border-right: 1px solid #00ff00; border-bottom: 1px solid #00ff00;}
      input[type="text"] {width: 100%;} /* removing this would make input not to go over cells border, but they would be too short, I want them to fit cells size */
   </style>    
</head><body>

<table cellpadding="0" cellspacing="0">
   <tr>
      <td><p>column one hello babe babe babe</p></td>
      <td><p>column two hello babe more</p></td>
      <td><p>column three hello babe more and more</p></td>
   </tr>
   <tr>
      <td><input type="text" value="test"></td>
      <td><input type="text" value="test"></td>
      <td><input type="text" value="test"></td>
   </tr>
</table>

</body></html>

Ответы [ 14 ]

206 голосов
/ 30 ноября 2011

Вы можете использовать свойство CSS3 box-sizing для включения внешнего отступа и границы:

input[type="text"] {
     width: 100%; 
     box-sizing: border-box;
     -webkit-box-sizing:border-box;
     -moz-box-sizing: border-box;
}
24 голосов
/ 03 марта 2010

Значение ширины не учитывает границы или отступы:

http://www.htmldog.com/reference/cssproperties/width/

Вы получаете 2px отступа с каждой стороны, плюс 1px границы с каждой стороны.
100% + 2 * (2px + 1px) = 100% + 6px, что превышает 100% дочернего содержимого, которое имеет родительский td.

У вас есть возможность:

  • Либо установка box-sizing: border-box; в соответствии с @ оценкой цены ;
  • Или с использованием 0 поля и отступов (избегая дополнительного размера).
14 голосов
/ 02 июля 2011

Проблема с такими вещами, как width:95%;, заключается в том, что они не выглядят правильно в широких гибких макетах (потому что тогда 5% могут быть как 30 пикселей).

Следующие решения работают очень хорошо для меня (протестировано в Firefox, IE 9, Safari):

<table style="background-color: blue; width: 100%;" cellpadding="0" cellspacing="0">
<tr>
    <td style="background-color: red;   padding: 3px;">
        <div style="margin-right: 3px;">
            <div style="padding-right: 3px;">
                <input type="text" style="width:100%;">
            </div>
        </div>
    </td>
    <td style="background-color: purple;   padding: 3px;">
        <div style="margin-right: 3px;">
            <div style="padding-right: 3px;">
                <input type="text" style="width:100%;">
            </div>
        </div>
    </td>
    <td style="background-color: green;   padding: 3px;">
        <div style="margin-right: 3px;">
            <div style="padding-right: 3px;">
                <input type="text" style="width:100%;">
            </div>
        </div>
    </td>
</tr>
</table>

(добавлены цвета, чтобы было легче заметить правильное заполнение)

Хитрость заключается в том, чтобы обернуть ввод двумя делителямивнешнее поле имеет отступ в 3 пикселя (что делает его на 3 пикселя меньше, чем у td), внутреннее имеет отступ в 3 пикселя.Это делает ввод на 6px меньше, чем td, с чего вы и хотели начать.

Я не уверен в механике этого, но это работает.

В этом простом примере он также работает только с одним div с правым полем 6. Однако в случае моего веб-приложения работает только вышеуказанное решение.

<table style="background-color: blue; width: 100%;" cellpadding="0" cellspacing="0">
<tr>
    <td style="background-color: red;   padding: 3px;">
        <div style="margin-right: 6px;">
                <input type="text" style="width:100%;">
        </div>
    </td>
    <td style="background-color: purple;   padding: 3px;">
        <div style="margin-right: 6px;">
                <input type="text" style="width:100%;">
        </div>
    </td>
    <td style="background-color: green;   padding: 3px;">
        <div style="margin-right: 6px;">
                <input type="text" style="width:100%;">
        </div>
    </td>
</tr>
</table>
8 голосов
/ 19 июня 2011

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

<table>
  <tr>
    <td><div style="overflow:hidden"><input style="width:100%" type="text" name="name" value="hello world" /></div></td>
  </tr>
</table>

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

Я проверял это в Chrome и в Fire Fox. Кажется, что оба хорошо уважают это решение.

ОБНОВЛЕНИЕ : Так как я только что получил случайное понижение, я хотел бы сказать, что лучший способ справиться с переполнением - это атрибут размера блока CSS3, как описано у priceco:

.myinput {
    -moz-box-sizing: border-box;
    -webkit-box-sizing: border-box;
    -ms-box-sizing: border-box;
    -o-box-sizing: border-box;
    box-sizing: border-box;
}

Это, кажется, довольно хорошо поддерживается основными браузерами и не является "хакерским", как трюк с переполнением. Однако в современных браузерах с таким подходом есть некоторые незначительные проблемы (см. http://caniuse.com/#search=box-sizing Известные проблемы).

2 голосов
/ 02 октября 2013

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

input {
    width: calc(100% - 12px); /* IE 9,10 , Chrome, Firefox */
    width: -webkit-calc(100% - 12px); /*For safari 6.0*/
}

Поддерживается большинством современных браузеров.

1 голос
/ 19 сентября 2015

вместо этой маржинальной борьбы просто сделайте

input{
    width:100%;
    background:transparent !important;
}

таким образом, граница ячейки видна, и вы можете контролировать цвет фона строки

1 голос
/ 17 февраля 2012

Я исправил эту проблему, начиная с ответа @ hallodom. Все мои входные данные содержались внутри li, поэтому все, что мне нужно было сделать, это установить переполнение li: скрытое, чтобы удалить это избыточное переполнение ввода.

.ie7 form li {
  width:100%;
  overflow:hidden;
}

.ie7 input {
  width:100%;
}
1 голос
/ 17 ноября 2011

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

Оберните ваш ввод другим элементом, например, div. Затем примените стиль, который вы хотите для своего ввода, к этому div обертки. Например:

<div class="input-wrapper">
 <input type="text" />
</div>

.input-wrapper {
    border-raius:5px;
    padding:10px;
}
.input-wrapper input[type=text] {
    width:100%;
    font-size:16px;
}

Дайте .input-wrapper отступы с закругленными углами и т. Д., Все, что вы хотите для ввода, затем укажите ширину ввода 100%. Вы хорошо добавили свой ввод с рамкой и т. Д., Но без раздражающего переполнения!

0 голосов
/ 13 июня 2017

Я решил проблему с помощью этого

tr td input[type=text] {
  width: 100%;
  box-sizing: border-box;
  -webkit-box-sizing:border-box;
  -moz-box-sizing: border-box;
  background:transparent !important;
  border: 0px;
}
0 голосов
/ 16 октября 2014

Я решил проблему, применив box-sizing:border-box; к самим ячейкам таблицы, кроме того, что делали то же самое с вводом и оболочкой.

...