Подтвердить что ты не робот

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. если требуется.

4b9b3361

Ответ 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>