Как выровнять формы ввода в HTML

Я новичок в HTML, и я пытаюсь научиться использовать формы.

Самая большая проблема, с которой я сталкиваюсь, - это выравнивание форм. Вот пример моего текущего файла HTML:

<form>
 First Name:<input type="text" name="first"><br />
 Last Name:<input type="text" name="last"><br />
 Email:<input type="text" name="email"><br />
</form>

Проблема с этим заключается в том, что поле поля после "Email" кардинально отличается с точки зрения расстояния по сравнению с именем и фамилией. Каков "правильный" способ сделать так, чтобы они "выстраивались" по существу?

Я пытаюсь практиковать хорошую форму и синтаксис... многие люди могут делать это с помощью CSS. Я не уверен, я до сих пор изучил только основы HTML.

18 ответов

Решение

Другой пример, это использует CSS, я просто помещаю форму в div с классом контейнера. И указал, что входные элементы, содержащиеся внутри, должны быть на 100% ширины контейнера и не иметь никаких элементов с обеих сторон.

.container {
  width: 500px;
  clear: both;
}

.container input {
  width: 100%;
  clear: both;
}
<html>

<head>
  <title>Example form</title>
</head>

<body>
  <div class="container">
    <form>
      <label>First Name</label>
      <input type="text" name="first"><br />
      <label>Last Name</label>
      <input type="text" name="last"><br />
      <label>Email</label>
      <input type="text" name="email"><br />
    </form>
  </div>
</body>

</html>

Принятый ответ (установка явной ширины в пикселях) затрудняет внесение изменений и прерывается, когда пользователи используют другой размер шрифта. Использование таблиц CSS, с другой стороны, прекрасно работает:

form  { display: table;      }
p     { display: table-row;  }
label { display: table-cell; }
input { display: table-cell; }
<form>
  <p>
    <label for="a">Short label:</label>
    <input id="a" type="text">
  </p>
  <p>
    <label for="b">Very very very long label:</label>
    <input id="b" type="text">
  </p>
</form>

Вот JSFiddle: http://jsfiddle.net/DaS39/1/

И если вам нужны метки по правому краю, просто добавьте text-align: right на ярлыки: http://jsfiddle.net/DaS39/


РЕДАКТИРОВАТЬ: Еще одно быстрое примечание: таблицы CSS также позволяют вам играть со столбцами: например, если вы хотите, чтобы поля ввода занимали как можно больше места, вы можете добавить следующее в вашей форме

<div style="display: table-column;"></div>
<div style="display: table-column; width:100%;"></div>

Вы можете добавить white-space: nowrap к labels в таком случае.

Простое решение для вас, если вы новичок в HTML, это просто использовать таблицу, чтобы выстроить все в ряд.

<form>
  <table>
    <tr>
      <td align="right">First Name:</td>
      <td align="left"><input type="text" name="first" /></td>
    </tr>
    <tr>
      <td align="right">Last Name:</td>
      <td align="left"><input type="text" name="last" /></td>
    </tr>
    <tr>
      <td align="right">Email:</td>
      <td align="left"><input type="text" name="email" /></td>
    </tr>
  </table>
</form>

Я считаю, что гораздо проще изменить отображение надписей на встроенный блок и установить ширину

label {
    display: inline-block;
    width:100px;
    text-align: right;
}

Вы должны использовать стол. С точки зрения логической структуры данные являются табличными: именно поэтому вы хотите, чтобы они были выровнены, потому что вы хотите показать, что метки связаны не только с их полями ввода, но и друг с другом, в двумерной структуре.

[подумайте, что бы вы сделали, если бы вместо полей ввода отображались строковые или числовые значения.]

Для этого я предпочитаю сохранять правильную семантику HTML и максимально использовать CSS.

Что-то вроде этого сделало бы работу:

label{
  display: block;
  float: left;
  width : 120px;    
}

Однако есть один недостаток: вам может потребоваться выбрать правильную ширину метки для каждой формы, и это будет нелегко, если ваши метки могут быть динамическими (например, метки I18N).

Я большой поклонник использования списков определений.

<dl>
<dt>Username:</dt>
<dd><input type="text" name="username" /></dd>
<dt>Password:</dt>
<dd><input type="password" name="password" /></dd>
</dl>

Их легко стилизовать с помощью CSS, и они избегают клейма использования таблиц для разметки.

Используя CSS

.containerdiv label {
  float:left;
  width:25%;
  text-align:right;
  margin-right:5px; /* optional */
}
.containerdiv input {
  float:left;
  width:65%;
}

это даст вам что-то вроде:

           label1 |input box             |
    another label |another input box     |

Ну, для самых основ вы можете попробовать выровнять их в таблице. Однако использование таблицы плохо для размещения, так как таблица предназначена для содержимого.

То, что вы можете использовать, это CSS плавающие методы.

CSS код

.styleform label{float:left;}
.styleform input{margin-left:200px;} /* this gives space for the label on the left */
.styleform .clear{clear:both;} /* prevent elements from stacking weirdly */

HTML

<div class="styleform">
<form>
<label>First Name:</label><input type="text" name="first" /><div class="clear"></div>
<label>Last Name:</label><input type="text" name="first" /><div class="clear"></div>
<label>Email:</label><input type="text" name="first" /><div class="clear"></div>
</form>
</div>

Подробную статью, которую я написал, можно найти, отвечая на вопрос о проблеме с плавающей точкой в ​​IE7: проблемы с плавающей точкой в ​​IE7

Я знаю, что на этот вопрос уже дан ответ, но я нашел новый способ их правильного выравнивания - с дополнительным преимуществом - см. http://www.gargan.org/en/Web_Development/Form_Layout_with_CSS/

в основном вы используете элемент label вокруг ввода и выравниваете его так:

<label><span>Name</span> <input /></label>
<label><span>E-Mail</span> <input /></label>
<label><span>Comment</span> <textarea></textarea></label>

а затем с CSS вы просто выравнивать:

label {
    display:block;
    position:relative;
}

label span {
    font-weight:bold;
    position:absolute;
    left: 3px;
}

label input, label textarea, label select {
    margin-left: 120px;    
}
  • вам не нужно разбираться в беспорядке для переноса строк - это означает, что вы можете быстро создать многостолбцовый макет динамически
  • вся строка кликабельна. Особенно для флажков это огромная помощь.
  • Динамически показывать / скрывать строки формы легко (вы просто ищете вход и скрываете его родительский элемент -> метку)
  • Вы можете назначить классы всей метке, чтобы она показала ввод ошибок намного яснее (не только вокруг поля ввода)

Это также можно сделать с помощью CSS и без таблиц, плавающих элементов или фиксированной длины, изменив направление содержимого на , а затем обратно на , но метки должны идти после каждого ввода.

Чтобы избежать этого переупорядочения разметки, просто установите текст метки в data-*атрибут и показать его с помощью псевдоэлемента. Думаю, станет намного понятнее.

Вот пример установки текста метки в пользовательском атрибуте с именем data-textи показывать их с помощью ::afterпсевдоэлемент, поэтому мы не возимся с разметкой при изменении directionк rtlа также ltr:

Ответ Клемана, безусловно, лучший. Вот несколько улучшенный ответ, показывающий различные возможные варианты выравнивания, включая кнопки с выравниванием по левому краю и правому краю:

label
{ padding-right:8px;
}

.FAligned,.FAlignIn
{ display:table;
}

.FAlignIn
{ width:100%;
}

.FRLeft,.FRRight,.FRCenter
{ display:table-row;
 white-space:nowrap;
}

.FCLeft,.FCRight,.FCCenter
{ display:table-cell;
}

.FRLeft,.FCLeft,.FILeft
{ text-align:left;
}

.FRRight,.FCRight,.FIRight
{ text-align:right;
}

.FRCenter,.FCCenter,.FICenter
{ text-align:center;
}
<form class="FAligned">
 <div class="FRLeft">
  <p class="FRLeft">
   <label for="Input0" class="FCLeft">Left:</label>
   <input id="Input0" type="text" size="30"  placeholder="Left Left Left" class="FILeft"/>
  </p>
  <p class="FRLeft">
   <label for="Input1" class="FCRight">Left Right Left:</label>
   <input id="Input1" type="text" size="30"  placeholder="Left Right Left" class="FILeft"/>
  </p>
  <p class="FRRight">
   <label for="Input2" class="FCLeft">Right Left Left:</label>
   <input id="Input2" type="text" size="30"  placeholder="Right Left Left" class="FILeft"/>
  </p>
  <p class="FRRight">
   <label for="Input3" class="FCRight">Right Right Left:</label>
   <input id="Input3" type="text" size="30"  placeholder="Right Right Left" class="FILeft"/>
  </p>
  <p class="FRLeft">
   <label for="Input4" class="FCLeft">Left Left Right:</label>
   <input id="Input4" type="text" size="30"  placeholder="Left Left Right" class="FIRight"/>
  </p>
  <p class="FRLeft">
   <label for="Input5" class="FCRight">Left Right Right:</label>
   <input id="Input5" type="text" size="30"  placeholder="Left Right Right" class="FIRight"/>
  </p>
  <p class="FRRight">
   <label for="Input6" class="FCLeft">Right Left Right:</label>
   <input id="Input6" type="text" size="30"  placeholder="Right Left Right" class="FIRight"/>
  </p>
  <p class="FRRight">
   <label for="Input7" class="FCRight">Right:</label>
   <input id="Input7" type="text" size="30"  placeholder="Right Right Right" class="FIRight"/>
  </p>
  <p class="FRCenter">
   <label for="Input8" class="FCCenter">And centralised is also possible:</label>
   <input id="Input8" type="text" size="60"  placeholder="Center in the centre" class="FICenter"/>
  </p>
 </div>
 <div class="FAlignIn">
  <div class="FRCenter">
   <div class="FCLeft"><button type="button">Button on the Left</button></div>
   <div class="FCCenter"><button type="button">Button on the Centre</button></div>
   <div class="FCRight"><button type="button">Button on the Right</button></div>
  </div>
 </div>
</form>

Я добавил отступ справа от всех меток (padding-right:8px) просто для того, чтобы пример выглядел менее ужасно, но в реальном проекте это следует делать более осторожно (добавление отступов ко всем другим элементам также было бы хорошей идеей).

Традиционный метод заключается в использовании таблицы.

Пример:

<table>
  <tbody>
     <tr>
        <td>
           First Name:
        </td>
        <td>
           <input type="text" name="first">
        </td>
     </tr>
     <tr>
        <td>
           Last Name:
        </td>
        <td>
           <input type="text" name="last">
        </td>
     </tr>
  </tbody>
</table>

Однако многие утверждают, что таблицы ограничивают и предпочитают CSS. Преимущество использования CSS в том, что вы можете использовать различные элементы. Из списка div, упорядоченного и неупорядоченного списка вы можете выполнить тот же макет.

В конце концов, вы захотите использовать то, что вам наиболее удобно.

Подсказка: с таблицами легко начать.

CSS Я использовал для решения этой проблемы, похож на Gjaa, но стиль лучше

p
{
    text-align:center;
        }
.styleform label
{
    float:left;
    width: 40%;
    text-align:right;
    }
.styleform input
{
    float:left;
    width: 30%;
    }

Вот мой HTML, используемый специально для простой формы регистрации без php-кода

<form id="registration">
    <h1>Register</h1>
    <div class="styleform">
    <fieldset id="inputs">
        <p><label>Name:</label> 
          <input id="name" type="text" placeholder="Name" autofocus required>
        </p>
        <p><label>Email:</label>   
          <input id="email" type="text" placeholder="Email Address" required>
        </p>
        <p><label>Username:</label>
          <input id="username" type="text" placeholder="Username" autofocus required>
        </p>
        <p>   
          <label>Password:</label>
          <input id="password" type="password" placeholder="Password" required>
        </p>
    </fieldset>
    <fieldset id="actions">

    </fieldset>
    </div>
    <p>
          <input type="submit" id="submit" value="Register">
          </p>

Это очень просто, и я только начинаю, но это работало довольно хорошо

<form>
    <div>
        <label for='username'>UserName</label>
        <input type='text' name='username' id='username' value=''>  
    </div>
</form>

В CSS вы должны объявить как label, так и input как display: inline-block и указать ширину в соответствии с вашими требованиями. Надеюсь, что это поможет вам.:)

Вставьте теги ввода в неупорядоченные списки. Сделайте тип стиля нет. Вот пример.

<ul>
Input1     
<li> <input type="text" />
Input2
<li> <input type="text" />
<ul/>

Работал на меня!

Я думаю, было бы проще, если бы вы использовали таблицу для структурирования своей формы. Может быть утомительно, но ничего "скопировать и вставить" с небольшим редактированием не может исправить.

<form>
<table>
<tr>
<td> <label>First Name:</label> </td> <td> <input type="text" name="first"> </td> </tr>
<tr> <td> <label>Last Name:</label> </td> <td> <input type="text" name="last"> </td></tr>
<tr> <td> <label> Email: </label> </td> <td> <input type="text" name="email"> </td></tr>
</table>
</form>

Вы можете добавить некоторые отступы или плавать содержимое ячейки, чтобы она выглядела более просторной.

Просто добавь

<form align="center ></from>

Просто поместите выравнивание в открывающий тег.

Другие вопросы по тегам