Кто-нибудь знает, почему элементы ввода шириной 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>
html
input
html-table
width
Марко Демайо
источник
источник
form
сlabel
s иinput
s внутриul
илиol
. который, по крайней мере, немного более семантичен. Конечно, вам следует использоватьform
, даже если вы все-таки придерживаетесьtable
.Ответы:
Вы можете использовать
box-sizing
свойство CSS3 для включения внешнего отступа и границы:источник
<!--[if lt IE 8]>
иinput[type="text"] {width:95%}
Значение ширины не учитывает границы или отступы:
http://www.htmldog.com/reference/cssproperties/width/
У вас будет 2 пикселя отступа с каждой стороны плюс 1 пиксель границы с каждой стороны.
100% + 2 * (2px + 1px) = 100% + 6px, что больше, чем 100% дочернего содержимого родительского td.
У вас есть возможность:
box-sizing: border-box;
в соответствии с ответом @pricco ;источник
text-indent
для имитации заполнения перед передним краем текста иline-height
для вертикального заполнения (хотя сохранение вертикального заполнения в любом случае не повлияет на ширину).Проблема с такими вещами
width:95%;
заключается в том, что они не выглядят правильно в широких гибких макетах (потому что 5% тогда могут быть как 30 пикселей).Следующие решения мне очень подходят (протестированы в Firefox, IE 9, Safari):
(добавлены цвета, чтобы было легче заметить правильный отступ)
Хитрость заключается в том, чтобы обернуть ввод двумя div, внешний имеет поле 3px (что делает его на 3px меньше, чем td), внутренний имеет отступ 3px. Это делает ввод на 6 пикселей меньше td, с которого вы хотели начать.
Я не уверен в механике этого, но это работает.
В этом простом примере он также работает только с одним div с правым полем 6. Однако в случае моего веб-приложения работает только вышеуказанное решение.
источник
Проблема была объяснена ранее, поэтому я только повторю: ширина не учитывает границы и отступы. Один из возможных ответов на этот вопрос, который не обсуждался, но который, как я обнаружил, мне очень помог, - обернуть ваши данные. Вот код, и я объясню, как это помогает через секунду:
DIV, обертывающий INPUT, не имеет ни заполнения, ни границы. Это решение. DIV будет расширяться до размера своего контейнера, но также будет учитывать границу и отступы. Теперь у INPUT не будет проблем с расширением до размера своего контейнера, так как он не имеет границ и площадок. Также обратите внимание, что переполнение DIV скрыто. Кажется, что по умолчанию элементы могут выпасть за пределы своего контейнера с переполнением по умолчанию visible. Это просто гарантирует, что ввод остается внутри своего контейнера и не пытается проткнуть его.
Я тестировал это в Chrome и Fire Fox. Оба, кажется, уважают это решение.
ОБНОВЛЕНИЕ : поскольку я только что получил случайное отрицательное голосование, я хотел бы сказать, что лучший способ справиться с переполнением - использовать атрибут CSS3 box-sizing, как описано pricco:
Кажется, что это довольно хорошо поддерживается основными браузерами и не является «взломанным», как трюк с переполнением. Однако при таком подходе в текущих браузерах возникают некоторые незначительные проблемы (см. Http://caniuse.com/#search=box-sizing Известные проблемы).
источник
overflow: hidden;
содержимое по-прежнему «высовывается» за пределы поля точно таким же образом, но оно усекается, а не отображается, поэтому оно не перекрывает другой контент.Я знаю, что этому вопросу 3 года, но проблема все еще сохраняется для текущих браузеров, и люди все еще приходят сюда. Решение на данный момент - calc () :
Он поддерживается большинством современных браузеров.
источник
Проблема связана с блочной моделью входного элемента. Я совсем недавно нашел хорошее решение проблемы, когда пытался сохранить 100% ввода для мобильных устройств.
Оберните ввод другим элементом, например, div. Затем примените стиль, который вы хотите для ввода, к этому div-оболочке. Например:
Дайте .input-wrapper заполнение с закругленными углами и т.д., все, что вы хотите для своего ввода, затем укажите ширину ввода 100%. Ваш ввод красиво дополнен рамкой и т. Д., Но без раздражающего переполнения!
источник
Я исправил эту проблему, начиная с ответа @ hallodom. Все мои входные данные содержались внутри li, поэтому все, что мне нужно было сделать, это установить li overflow: hidden, чтобы удалить это избыточное переполнение ввода.
источник
вместо этой маржинальной борьбы просто сделай
таким образом граница ячейки видна, и вы можете контролировать цвет фона строки
источник
Выньте "http://www.w3.org/TR/html4/loose.dtd" из объявления DOCTYPE, и это решит вашу проблему.
Ура! :)
источник
http://www.w3.org/TR/html4/strict.dtd
Strict? исх. w3.org/QA/2002/04/valid-dtd-list.html В любом случае это не вариант, потому что изменение DOCTYPE сейчас, вероятно, повлияет на отображение многих других материалов на веб-страницах.С помощью Javascript вы можете получить точную ширину содержащего TD, а затем назначить ее непосредственно входному элементу.
Ниже приведен необработанный javascript, но jQuery сделает его чище ...
Проблемы с этим решением:
1) Если у вас есть входные данные, содержащиеся в другом элементе, таком как SPAN, вам понадобится цикл и найти TD, потому что такие элементы, как SPAN, будут обертывать вход и отображать его размер, а не ограничиваться размером TD.
2) Если у вас есть отступы или поля, добавленные на разных уровнях, возможно, вам придется явно вычесть это из [pEl.offsetWidth]. В зависимости от вашей структуры HTML, которая может быть рассчитана.
3) Если размер столбцов таблицы изменяется динамически, то изменение размера одного элемента приведет к перекомпоновке таблицы в некоторых браузерах, и вы можете получить ступенчатый эффект, поскольку вы последовательно «исправляете» размеры ввода. Решение состоит в том, чтобы назначить столбцу определенную ширину в процентах или в пикселях ИЛИ собрать новые значения ширины и установить их после. См. Код ниже ..
источник
Решил проблему, подав заявку
box-sizing:border-box
; к самим ячейкам таблицы, помимо того, что делает то же самое с вводом и оболочкой.источник
Я решил проблему с помощью этого
источник
Я обычно устанавливаю ширину ввода 99%, чтобы исправить это:
Вы также можете удалить стили по умолчанию, но это сделает менее очевидным, что это текстовое поле. Однако я все равно покажу код для этого:
Ad @ m
источник
Проблема заключается в
border-width
элементе ввода. Вскоре попробуйте установитьmargin-left
для элемента ввода значение-2px
.источник