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), независимо от размера браузера, я хочу соединить элементы label и input рядом друг с другом. У меня также есть свобода вносить изменения в HTML. если необходимо.


person hashg    schedule 09.01.2011    source источник


Ответы (6)


Это одна из тех вещей, которые может быть удивительно сложно сделать правильно.

Многие люди предложат использовать для этого 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 */
}

Надеюсь, это поможет.

Редактировать: вы можете использовать этот плагин для установки ширины каждой метки:

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();

и все... все ваши метки будут иметь ширину самой длинной метки

person Spudley    schedule 09.01.2011
comment
Работает идеально. Я бы столкнулся с проблемами, если бы контейнер div не обертывал метку и ввод. - person hashg; 10.01.2011

Поместите каждую метку с соответствующим входом в тег 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>
person amosrivera    schedule 09.01.2011
comment
p здесь не имеет смысла. Это не набор абзацев. div будет лучшим выбором. см. принятый ответ. - person Merlyn Morgan-Graham; 02.01.2013

Я думаю, что использование javascript для простого трюка css - это излишество. Вот тот, который я сделал только что: http://jsfiddle.net/t6R93/

div{
  display: table-row;
}
label,input{
  display:table-cell;
}

PS: в других браузерах могут быть проблемы. Я тестировал только с Chrome.

person egiray    schedule 15.11.2013

Нет необходимости использовать JavaScript, jQuery или дополнительные div. Вам просто нужно:

  • Плавающие 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>

person Michał Perłakowski    schedule 07.01.2016

Мне было любопытно посмотреть, можно ли это сделать с помощью «естественной» семантической разметки, то есть без несемантических элементов-оболочек и с label, содержащим соответствующий input, вместо того, чтобы ссылаться на него с помощью слегка неуклюжего атрибута for:

<fieldset>
  <label>Error Prefix<input/></label>
  <label>Error Number<input/></label>
</fieldset>

Метка с фиксированной шириной не будет выравнивать входные данные здесь, потому что текст не является отдельным элементом, и элегантное минимальное решение Шахида также не работает, но если вы хотите сделать все входные данные одинаковой ширины (что выглядит ИМХО в любом случае приятно) вы можете 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>
person mrec    schedule 03.04.2014

person    schedule
comment
+1 Хороший ответ, только этот фрагмент кода -> display:inline-block;width:50%; достаточно! - person devasia2112; 12.07.2012