CSS для выравнивания метки и ввода
Фрагмент кода HTML:
<fieldset id="o-bs-sum-buginfo">
<label for="o-bs-sum-bug-ErrorPrefix">Error Prefix</label>
<input type="text" id="o-bs-sum-bug-ErrorPrefix" name="ErrorPrefix" value="" />
<label for="o-bs-sum-bug-ErrorNumber">Error Number</label>
<input type="text" id="o-bs-sum-bug-ErrorNumber" name="ErrorNumber" value="" />
....
</fieldset>
Используя только CSS (или jquery), независимо от размера браузера, я хочу связать метки и элементы ввода рядом друг с другом. У меня также есть свобода менять настройки HTML. если требуется.
Ответы
Ответ 1
Это одна из тех вещей, которые могут быть удивительно сложными, чтобы получить право.
Многие люди предлагают использовать float:left;
для этого. Лично мне очень не нравятся поплавки; они, похоже, вызывают больше проблем, чем они решают.
Мое предпочтение - использовать встроенный блок. Это метод отображения, который объединяет встроенные свойства (так что вы можете легко выравнивать элементы рядом друг с другом и т.д.) С помощью свойств блока (например, указывать размеры).
Таким образом, ответ состоит в том, чтобы сделать их как display:inline-block;
, и дать подсказкам фиксированную ширину, которая заставит поля ввода рядом с ними выстраиваться в линию.
Вам также понадобится какой-либо фид строки или разрыв после поля ввода, иначе следующее приглашение появится в той же строке, что не является желаемым эффектом. Лучший способ добиться этого - поместить каждое приглашение и его поле в контейнер <div>
.
Итак, ваш HTML будет выглядеть так:
<fieldset id="o-bs-sum-buginfo" class="myfields">
<div>
<label for="o-bs-sum-bug-ErrorPrefix">Error Prefix</label>
<input type="text" id="o-bs-sum-bug-ErrorPrefix" name="ErrorPrefix" value="" />
</div>
<div>
<label for="o-bs-sum-bug-ErrorNumber">Error Number</label>
<input type="text" id="o-bs-sum-bug-ErrorNumber" name="ErrorNumber" value="" />
</div>
....
</fieldset>
и ваш CSS будет выглядеть так:
.myfields label, .myfields input {
display:inline-block;
}
.myfields label {
width:200px; /* or whatever size you want them */
}
Надеюсь, что это поможет.
Edit:
вы можете использовать этот плагин для установки ширины каждой метки:
jQuery.fn.autoWidth = function(options)
{
var settings = {
limitWidth : false
}
if(options) {
jQuery.extend(settings, options);
};
var maxWidth = 0;
this.each(function(){
if ($(this).width() > maxWidth){
if(settings.limitWidth && maxWidth >= settings.limitWidth) {
maxWidth = settings.limitWidth;
} else {
maxWidth = $(this).width();
}
}
});
this.width(maxWidth);
}
с этой страницы в комментарии
и вы используете его следующим образом:
$("div.myfields div label").autoWidth();
и все это... все ваши ярлыки будут принимать ширину самой длинной метки
Ответ 2
#o-bs-sum-buginfo label, #o-bs-sum-buginfo input{display:inline-block;width:50%;}
Ответ 3
Поместите каждую метку с соответствующим вводом в тег p. Затем добавьте следующий css:
label{
float:left;
width:100px; //whatever width that suits your needs
}
p{
margin:10px 0; //manipulate the vertical spaces for each input..
}
<fieldset id="o-bs-sum-buginfo">
<p>
<label for="o-bs-sum-bug-ErrorPrefix">Error Prefix</label>
<input type="text" id="o-bs-sum-bug-ErrorPrefix" name="ErrorPrefix" value="" />
</p>
</fieldset>
Ответ 4
Я думаю, что использование javascript для простого трюка css является излишним.
Вот тот, который я сделал сейчас:
http://jsfiddle.net/t6R93/
div{
display: table-row;
}
label,input{
display:table-cell;
}
PS: У этого могут быть недостатки с другими браузерами. Я тестировал только Chrome.
Ответ 5
Нет необходимости использовать JavaScript, jQuery или дополнительные div
s. Вам просто нужно:
- Поместите как
input
, так и label
влево (обратите внимание, что input
должен быть заблокирован для блокировки).
- Добавить
clear: both
в label
.
- Установите фиксированную ширину (например,
100px
) на label
.
input {
display: block;
float: left;
}
label {
float: left;
clear: both;
width: 100px;
}
<fieldset id="o-bs-sum-buginfo">
<label for="o-bs-sum-bug-ErrorPrefix">Error Prefix</label>
<input type="text" id="o-bs-sum-bug-ErrorPrefix" name="ErrorPrefix" value="" />
<label for="o-bs-sum-bug-ErrorNumber">Error Number</label>
<input type="text" id="o-bs-sum-bug-ErrorNumber" name="ErrorNumber" value="" />
</fieldset>
Ответ 6
Мне было любопытно узнать, можно ли это сделать с "естественной" семантической разметкой, т.е. без элементов, не являющихся семантической оболочкой, и с label
, содержащей его соответствующий input
, а не ссылаться на него с помощью слегка неуклюжий for
атрибут:
<fieldset>
<label>Error Prefix<input/></label>
<label>Error Number<input/></label>
</fieldset>
Знак с фиксированной шириной не будет выравнивать входные данные здесь, потому что текст не является отдельным элементом, а элегантное минимальное решение Shahid тоже не работает, но если вы готовы сделать все входы одинаковой ширины ( в любом случае ИМХО выглядит хорошо), вы можете float
их right
:
label { display:block; margin:8px; width:360px; clear:right; overflow:auto; }
input, button, textarea, select { box-sizing:border-box; -moz-box-sizing:border-box; width:200px; float:right; }
-moz-box-sizing
должен быть избыточным, когда FF29 освобожден, и даже box-sizing
не требуется, если вы не смешиваете типы управления формой. clear
и overflow
необходимы для textarea
.
Полный пример с использованием смешанного ввода:
<!DOCTYPE html>
<html>
<head>
<title>Aligned labels</title>
<style>
label { display:block; margin:8px; width:360px; clear:right; overflow:auto; }
input, button, textarea, select { box-sizing:border-box; -moz-box-sizing:border-box; width:200px; float:right; }
</style>
</head>
<body>
<label>Name<input type="text" value="Sir Galahad of Camelot"/></label>
<label>Quest<textarea>I seek the Holy Grail</textarea></label>
<label>Favourite Colour<select><option>Blue</option><option>Yellow</option></select></label>
<label>If you're sure...<button>Give Answers</button></label>
</body>
</html>