Я надеюсь найти ресурс для выравнивания элементов ввода на странице HTML. Мне трудно заставить элемент выбора и текстовое поле иметь одинаковую ширину даже при использовании атрибута стиля ширины, и это еще сложнее в разных браузерах. Наконец, файловые входы кажутся невозможными для кросс-браузера одинаковой ширины. Есть ли хорошие руководства или советы для достижения этого? Возможно, есть некоторые атрибуты CSS по умолчанию, которые я должен установить.
Как выровнять элементы ввода HTML?
Ответы (9)
Я проверил это в Internet Explorer 7, Firefox 3 и Safari/Google Chrome. Я определенно вижу проблему с <select>
и <input type="file">
. Мои выводы показали, что если вы стилизуете все входные данные одинаковой ширины, <select>
будет примерно на 5 пикселей короче во всех браузерах.
Использование скрипта сброса CSS Эрика Мейера не помогает. проблема, однако, если вы просто сделаете свои <select>
inputs на 5 пикселей шире, вы получите очень хорошее (хотя и не идеальное) выравнивание в основных браузерах. Единственное, что отличается, это Safari/Google Chrome, и он кажется на 1 или 2 пикселя шире, чем все остальные браузеры.
Что касается <input type="file">
, у вас нет большой гибкости в отношении стиля. Если вам подходит JavaScript, вы можете реализовать метод , показанный в quirksmode, чтобы добиться больший контроль над стилем элемента управления загрузкой файлов.
См. мой полный рабочий пример ниже в XHTML 1.0 Strict для типичной формы с постоянной шириной ввода. Обратите внимание, что это не использует трюк со 100% шириной, указанный здесь другими, потому что у него та же проблема с несовместимой шириной. Кроме того, для отображения формы не используются таблицы, поскольку таблицы следует использовать только для табличных данных, а не для макета.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Example Form</title>
<style type="text/css">
label,
input,
select,
textarea {
display: block;
width: 200px;
float: left;
margin-bottom: 1em;
}
select {
width: 205px;
}
label {
text-align: right;
width: 100px;
padding-right: 2em;
}
.clear {
clear: both;
}
</style>
</head>
<body>
<form action="#">
<fieldset>
<legend>User Profile</legend>
<label for="fname">First Name</label>
<input id="fname" name="fname" type="text" />
<br class="clear" />
<label for="lname">Last Name</label>
<input id="lname" name="lname" type="text" />
<br class="clear" />
<label for="fav_lang">Favorite Language</label>
<select id="fav_lang" name="fav_lang">
<option value="c#">C#</option>
<option value="java">Java</option>
<option value="ruby">Ruby</option>
<option value="python">Python</option>
<option value="perl">Perl</option>
</select>
<br class="clear" />
<label for="bio">Biography</label>
<textarea id="bio" name="bio" cols="14" rows="4"></textarea>
<br class="clear" />
</fieldset>
</form>
</body>
</html>
Я обычно помещаю их в ячейку div или таблицы (ужас! Я знаю) той ширины, которую хочу, затем устанавливаю для select и input style:width значение 100%, чтобы они заполняли div/ячейку, в которой они находятся.
<td>
в следующую ячейку.
- person Ian Boyd; 20.06.2012
Я обнаружил, что если вы установите границы и отступы элементов select и input равными 0, они будут одинаковой ширины. (Проверено на Chrome 14, Firefox 7.0.1, Opera 11.51, IE 9)
Установка границы/отступа в 1 пиксель для элементов выбора и ввода делает элемент ввода на 2 пикселя шире. Например:
<form class="style">
<input name="someInput" />
<select name="options">
<option value="1">Value 1</option>
<option value="2">Value 2</option>
</select>
</form>
.style select {
width: 100px;
padding: 1px;
border: 1px solid black;
}
.style input {
width: 96px; /* -2 px for 1px padding(1px from each side) and -2px for border
(select element seems to put border inside, not outside?) */
padding: 1px;
border: 1px solid black;
}
Помимо ширины, я бы также установил границы и поля, они могут влиять или не влиять на ваши элементы управления. Что-то вроде этого может помочь:
input, select {
width: 100px;
margin: 0px;
border: 1px solid;
}
У Рона тоже есть хорошая идея.
Вы начинаете свои файлы CSS с некоторыми базовыми настройками? Может быть полезно отключить отступы и поля для всех элементов. Я не проверял, может ли это повлиять на элементы select/input.
Вот пример сброса CSS от Эрика Мейера:
http://meyerweb.com/eric/thoughts/2007/05/01/reset-reloaded/
Файловые входы могут принципиально различаться в разных браузерах и определенно не позволяют многого настраивать, что может раздражать, но я также понимаю, почему это связано с точки зрения безопасности. Например, попробуйте изменить текст кнопки «Обзор», которая появляется в большинстве браузеров, или сравните ввод файла в Safari с другими браузерами...
Я не думаю, что идея Рона Рона работает...
прецедент:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title></title>
<link href="styles/reset.css" rel="stylesheet" type="text/css"/>
<style type="text/css">
input, select{
width: 100%;
}
</style>
</head>
<body>
<div style="width: 200px;">
<input type="text">
<select>
<option>asdasd</option>
<option>asdasd</option>
</select>
</div>
</body>
</html>
Это приводит к тому, что ввод становится на несколько пикселей шире, чем выбор (вероятно, это зависит от ОС). Я не уверен, что это может быть достигнуто, даже с трюком +5px, поскольку стиль выбора, похоже, зависит от ОС (по крайней мере, темы Windows).
Если вам срочно нужно { width: 100%; } и ширина не указана в пикселях, тогда jQuery вам в помощь:
$(function () {
var allSelects = $('input[type="text"], textarea');
allSelects.css('width', (allSelects.width()-6)+'px');
}
-6 пикселей лучше всего подходят для меня (FF9), редактируйте, как считаете нужным.
Это связано с тем, что при вводе граница и отступы добавляются к ширине (как и для большинства других элементов). С помощью ‹select› граница и отступы включаются в ширину, как и в старом режиме IE quirks.
Вы можете обойти это, увеличив ширину, чтобы учесть это:
input { width: 200px; padding: 10px; border-width:5px; }
select { width: 230px; padding: 10px; border-width:5px; }
Или (если вы можете положиться на поддержку браузера) вы можете использовать новое свойство CSS3 box-sizing, чтобы заставить их вести себя согласованно и рисовать отступы и границы за пределами ширины элемента:
input, select {
width: 200px;
padding: 10px;
border-width:5px;
-webkit-box-sizing: content-box; /* Safari/Chrome, other WebKit */
-moz-box-sizing: content-box; /* Firefox, other Gecko */
box-sizing: content-box; /* Opera/IE 8+ */
}
В качестве альтернативы вы можете установить для box-sizing значение border-box, чтобы входные данные вели себя как выборки, с отступами, нарисованными внутри ширины поля.
Протестировано в Chrome, IE8, FF