Текстовое поле ввода 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 ]

0 голосов
/ 22 мая 2012

С помощью некоторого Javascript вы можете получить точную ширину содержащего TD, а затем назначить ее непосредственно элементу ввода.

Ниже приведен необработанный javascript, но jQuery сделает его чище ...

var inputs = document.getElementsByTagName('input');
for (var i = 0; i < inputs.length; i++)
{
    var el = inputs[i];
    if (el.style.width == '100%')
    {
        var pEl = el.parentNode;  // Assumes the parent node is the TD...
        el.style.width = pEl.offsetWidth;
    }
}

Проблемы с этим решением:

1) Если ваши входные данные содержатся в другом элементе, таком как SPAN, то вам нужно будет выполнить цикл и найти TD, потому что такие элементы, как SPAN, обернут вход и покажут его размер, а не ограничиваются размером TD .

2) Если у вас есть отступы или поля, добавленные на разных уровнях, возможно, вам придется явно вычесть это из [pEl.offsetWidth]. В зависимости от вашей структуры HTML, которая может быть рассчитана.

3) Если столбцы таблицы имеют динамический размер, то изменение размера одного элемента приведет к тому, что таблица будет переформатирована в некоторых браузерах, и вы можете получить пошаговый эффект при последовательном «исправлении» входных размеров. Решение состоит в том, чтобы назначить конкретную ширину столбцу в виде процентов или пикселей ИЛИ собрать новые значения ширины и установить их после. Смотрите код ниже ..

var inputs = document.getElementsByTagName('input');
var newSizes = [];
for (var i = 0; i < inputs.length; i++)
{
    var el = inputs[i];
    if (el.style.width == '100%')
    {
        var pEl = el.parentNode;  // Assumes the parent node is the TD...
        newSizes.push( { el: el, width: pEl.offsetWidth });
    }
}

// Set the sizes AFTER to avoid stepping...
for (var i = 0; i < newSizes.length; i++)
{
    newSizes[i].el.style.width = newSizes[i].width;
}
0 голосов
/ 25 июля 2011

Извлеките "http://www.w3.org/TR/html4/loose.dtd" из декларации DOCTYPE, и это решит вашу проблему.

Ура! :)

0 голосов
/ 19 июня 2011

Я обычно устанавливаю ширину своих входов на 99%, чтобы исправить это:

input {
    width: 99%;
}

Вы также можете удалить стили по умолчанию, но это сделает менее очевидным, что это текстовое поле. Тем не менее, я покажу код для этого:

input {
    width: 100%;
    border-width: 0;
    margin: 0;
    padding: 0;
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
}

Ad @ м

0 голосов
/ 09 сентября 2010

Проблема заключается в border-width элемента ввода. Вскоре попробуйте установить margin-left элемента ввода на -2px.

table input {
  margin-left: -2px;
}
...