2010-03-03 2 views
92

Кто-нибудь знает, почему входные элементы с шириной 100% проходят по границе ячеек таблицы.Текстовое поле ввода HTML с шириной 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> 
+1

I предположил бы, что если вы просто используете таблицу для представления входов, вы можете переключиться на использование 'form' с' label's и 'input' в' ul' или 'ol'. которая, по крайней мере, немного более смысловая. Конечно, вы должны использовать 'form', даже если вы придерживаетесь' table'. –

ответ

191

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

input[type="text"] { 
    width: 100%; 
    box-sizing: border-box; 
    -webkit-box-sizing:border-box; 
    -moz-box-sizing: border-box; 
} 
+1

Грустно сказать, но, к сожалению, IE 7 не имеет дело с правильной коробкой. Попробуйте следующее в IE 7 ... http: //www.css3.info/preview/box-sizing/или см. http://css-tricks.com/box-sizing/ – AnthonyVO

+2

Если бы та же проблема и нашел этот камень – Steoates

+0

@AnthonyVO: true, единственным обходным решением для IE7 является добавление определенного CSS для он использует IE условные комментарии '' и 'input [type =" text "] {width: 95%}' –

23

Ширина значение не учитывает границы или дополнения:

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

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

Вы имеете возможность:

  • Либо параметр box-sizing: border-box; как на @pricco's answer;
  • Или используйте 0 полей и отступов (избегая дополнительного размера).
+0

далее, чтобы ответить на вопрос о старших очках, вы можете установить отступ и границу до 0px, тогда 100% должны работать. – Mauro

+0

Действительно, даже без установки прокладки для td - очень хорошо добавлено. – ANeves

+1

Кроме того, если добавление создает проблему, можно использовать 'text-indent' для имитации заполнения перед передним краем текста и' line-height' для вертикального заполнения (хотя сохранение вертикального заполнения не повлияет ширина в любом случае). –

-2

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

table input { 
    margin-left: -2px; 
} 
+0

не думаю. что просто сдвигает поле влево и уничтожает левое поле –

-4

У меня была точно такая же проблема, и решить это следующим образом:

input[type="text"] {width: 95%;} 
+0

за мои деньги, это плюс центрирование ввода в поле - лучший способ пойти –

7

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

<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 имеет переполнение, которое скрыто. Похоже, что по умолчанию элементы могут выходить за пределы своего контейнера с переполнением по умолчанию видимого. Это просто гарантирует, что вход остается внутри его контейнера и не пытается просочиться.

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

UPDATE: Так как я только что получил случайный downvote, я хотел бы сказать, что лучший способ справиться с переполнением с CSS3 коробчатой ​​проклейкой атрибута, как описано pricco:

.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; 
} 

Этих кажется, очень хорошо поддерживается основными браузерами и не «взломан», как трюк с переполнением.Тем не менее, существуют некоторые незначительные проблемы в текущих браузерах с таким подходом (см. Известные проблемы).

+2

Краткое примечание: с 'overflow: hidden;' контент все еще 'протыкает 'на внешнюю сторону окна точно так же, но она усекается, а не отображается, поэтому она не перекрывает другой контент. – ANeves

-1

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

input { 
    width: 99%; 
} 

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

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

Ad @ м

13

Проблема с такими вещами как 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> 

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

Трюк состоит в том, чтобы обернуть вход с двумя div, внешний имеет 3px margin (что делает его на 3px меньше, чем td), внутренний имеет 3px дополнение. Это делает вход 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> 
0

Вынимают «http://www.w3.org/TR/html4/loose.dtd» из объявления DOCTYPE и исправить вашу проблему.

Cheers! :)

+0

Вы имеете в виду использование 'http: // www.w3.org/TR/html4/strict.dtd' Strict? ссылка http://www.w3.org/QA/2002/04/valid-dtd-list.html В любом случае это не вариант, потому что изменение DOCTYPE теперь, вероятно, повлияет на рендеринг многих других stuf в веб-страницах. –

1

Проблема связана с моделью блока входных элементов. Недавно я нашел хорошее решение проблемы при попытке сохранить мой вход на 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; 
} 

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

1

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

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

.ie7 input { 
    width:100%; 
} 
0

С помощью некоторого 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; 
} 
2

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

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

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

0

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

1

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

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

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

0

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

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; 
} 
Смежные вопросы