Як зробити так, щоб <label> і <input> відображалися в одному рядку у формі HTML?


94

Я створюю реєстраційну форму для веб-сайту. Я хочу, щоб кожна мітка та відповідний вхідний елемент відображалися в одному рядку.

Ось мій код:

#form {
 background-color: #FFF;
 height: 600px;
 width: 600px;
 margin-right: auto;
 margin-left: auto;
 margin-top: 0px;
 border-top-left-radius: 10px;
 border-top-right-radius: 10px;
 padding: 0px;
}

label {
 font-family: Georgia, "Times New Roman", Times, serif;
 font-size: 18px;
 color: #333;
 height: 20px;
 width: 200px;
 margin-top: 10px;
 margin-left: 10px;
 text-align: right;
 clear: both;
}

input {
 height: 20px;
 width: 300px;
 border: 1px solid #000;
 margin-top: 10px;
 float: left;
}
<div id="form">

 <form action="" method="post" name="registration" class="register">
  
  <fieldset>

   <label for="Student"> Name: </label>
   <input name="Student" />
   <label for="Matric_no"> Matric number: </label>
   <input name="Matric_no" />
   <label for="Email"> Email: </label>
   <input name="Email" />
   <label for="Username"> Username: </label>
   <input name="Username" />
   <label for="Password"> Password: </label>
   <input name="Password" type="password" />
   
   <input name="regbutton" type="button" class="button" value="Register" />
  </fieldset>

 </form>
</div>  


Мені найбільше подобається, що ця відповідь не була проголосована, тому що ви сказали, що не хочете намагатися і помилитися;)
Анна Кляйн

Відповіді:


72

Припускаючи, що ви хочете плавати елементи, вам також доведеться плавати labelелементи теж.

Щось на зразок цього буде працювати:

label {
    /* Other styling... */
    text-align: right;
    clear: both;
    float:left;
    margin-right:15px;
}

В якості альтернативи, більш поширеним підходом було б обернення input/ labelелементів у групи:

<div class="form-group">
    <label for="Student">Name:</label>
    <input name="Student" id="Student" />
</div>

Зверніть увагу, що forатрибут повинен відповідати idелементу, що позначається, а не його name. Це дозволить користувачам клацнути на, labelщоб зосередити увагу на відповідному елементі форми.


1
Дякую! саме цього я хотів досягти. Обидва методи мені добре підходять. 1 питання, яке я маю, у css, чому я вирівнюю текст форми div за центром, а потім вирівнюю мітки праворуч? якщо я не буду вирівнювати по формі div по центру, це зіпсує мій код?
luchxo

Гарна відповідь, особливо згадка про clear: both;яку допомогла моїй справі.
Sirar Salih

33

Я знайшов "display:flex"стиль - це хороший спосіб зробити ці елементи в одному рядку. Незалежно від того, який елемент у div. Особливо, якщо клас введення - контроль форми, інші рішення, такі як bootstrap, inline-block, не працюватимуть добре.

Приклад:

<div style="display:flex; flex-direction: row; justify-content: center; align-items: center">
    <label for="Student">Name:</label>
    <input name="Student" />
</div>

Детальніше про дисплей: flex:

flex-direction: рядок, стовпець

justify-content: flex-end, center, space-between, space-around

align-items: stretch, flex-start, flex-end, center


не знав про існування
флексу

18

aaa ## HTML Я б запропонував вам обернути їх у div, оскільки ви, ймовірно, в кінцевому підсумку перемістите їх у певний контекст.

<div class="input-w">
    <label for="your-input">Your label</label>
    <input type="text" id="your-input" />
</div>

CSS

Тоді в рамках цього div ви можете створити кожен фрагмент inline-blockтак, щоб його можна було використовувати vertical-alignдля центрування - або встановити базову лінію тощо (ваші мітки та введення можуть змінити розміри в майбутньому ...

.input-w label, .input-w input {
    float: none; /* if you had floats before? otherwise inline-block will behave differently */
    display: inline-block;
    vertical-align: middle;    
}

jsFiddle

ОНОВЛЕННЯ: середина 2016 року + з медіа-запитами для мобільних пристроїв та flex-box

Ось так я роблю справи в наші дні.

HTML

<label class='input-w' for='this-input-name'>
  <span class='label'>Your label</span>
  <input class='input' type='text' id='this-input-name' placeholder='hello'>
</label>

<label class='input-w' for='this-other-input-name'>
  <span class='label'>Your label</span>
  <input class='input' type='text' id='this-other-input-name' placeholder='again'>
</label>

СКСС

html { // https://www.paulirish.com/2012/box-sizing-border-box-ftw/
  box-sizing: border-box;
  *, *:before, *:after {
    box-sizing: inherit;
  }
} // if you don't already reset your box-model, read about it

.input-w {
  display: block;
  width: 100%; // should be contained by a form or something
  margin-bottom: 1rem;
  @media (min-width: 500px) {
    display: flex;
    flex-direction: row;
    align-items: center;
  }
  .label, .input {
    display: block;
    width: 100%;
    border: 1px solid rgba(0,0,0,.1);
    @media (min-width: 500px) {
      width: auto;
      display: flex;
    }
  }
  .label {
    font-size: 13px;
    @media (min-width: 500px) {
      /* margin-right: 1rem; */
      min-width: 100px; // maybe to match many?
    }
  }
  .input {
    padding: .5rem;
    font-size: 16px;
    @media (min-width: 500px) {
      flex-grow: 1;
      max-width: 450px; // arbitrary
    }
  }
}

jsFiddle


чи потрібно обертати кожну мітку та відповідний елемент в інший div? або я просто включаю всі мітки в цей єдиний div
luchxo

Я обертаю проміжок для "мітки" та введення - в <label>елемент тепер дні.
шерифдерек

5

Чого вам не вистачало, так це поплавця: зліва; ось приклад, щойно зроблений у HTML

<div id="form">
<form action="" method="post" name="registration" class="register">
    <fieldset>
        <label for="Student" style="float: left">Name:</label>
        <input name="Student" />
        <label for="Matric_no" style="float: left">Matric number:</label>
        <input name="Matric_no" />
        <label for="Email" style="float: left">Email:</label>
        <input name="Email" />
        <label for="Username" style="float: left">Username:</label>
        <input name="Username" />
        <label for="Password" style="float: left">Password:</label>
        <input name="Password" type="password" />
        <input name="regbutton" type="button" class="button" value="Register" />
    </fieldset>
</form>

Більш ефективний спосіб зробити це - додати клас до міток та встановити float: left; до класу в CSS


4

Окрім використання плаваючих значень, як пропонували інші, ви також можете покластися на такий фреймворк, як Bootstrap, де ви можете використовувати клас "горизонтальна форма", щоб мітка та введення були в одному рядку.

Якщо ви не знайомі з Bootstrap, вам доведеться включити:

  • посилання на CSS Bootstrap (верхнє посилання, де вказано <- Останній скомпільований та зменшений CSS ->) , в голові, а також додати деякі div:
  • div class = "form-group"
  • div class = "col -..."
  • разом із class = "col-sm-2 control-label" у кожній мітці, як показує Bootstrap, який я включив нижче.
  • Я також переформатував вашу кнопку, щоб вона відповідала Bootstrap.
  • і додав легенду до вашого поля форми, оскільки ви використовували набір полів.

Це дуже прямо, і вам не доведеться возитися з поплавками або тонною CSS для форматування, як ви перерахували вище.

  <div id="form">
    <div class="row">
      <form action="" method="post" name="registration" class="register form-horizontal">
        <fieldset>
        <legend>Address Form</legend>

      <div class="form-group">
        <label for="Student" class="col-sm-2 control-label">Name:</label>
          <div class="col-sm-6">
            <input name="Student" class="form-control">
          </div>
      </div>

      <div class="form-group">
        <label for="Matric_no" class="col-sm-2 control-label">Matric number: </label>
          <div class="col-sm-6">
            <input name="Matric_no" class="form-control">
          </div>
      </div>

      <div class="form-group">
        <label for="Email" class="col-sm-2 control-label">Email: </label>
          <div class="col-sm-6">
            <input name="Email" class="form-control">
          </div>
      </div>

      <div class="form-group">
        <label for="Username" class="col-sm-2 control-label">Username: </label>
          <div class="col-sm-6">
            <input name="Username" class="form-control">
          </div>
      </div>

      <div class="form-group">
        <label for="Password" class="col-sm-2 control-label">Password: </label>
          <div class="col-sm-6">
            <input name="Password" type="password" class="form-control">
          </div>
      </div>

      <div>
        <button class="btn btn-info" name="regbutton" value="Register">Submit</button>
      </div>

      </fieldset>
    </form>
    </div>
  </div>
</div>


3

Для Bootstrap 4 це можна зробити за допомогою class="form-group" style="display: flex"

<div class="form-group" style="display: flex">
    <label>Topjava comment:</label>
    <input class="form-control" type="checkbox"/>
</div>

3

Я використовую Angular 6 з Bootstrap 4 і вважаю, що такий спосіб працює:

<div class="form-group row">
    <div class="col-md-2">
        <label for="currentPassword">Current Password:</label>
    </div>
    <div class="col-md-6">
        <input type="password" id="currentPassword">
    </div>
</div>

1
Простий та ефективний.
карам

2

Я зробив це декількома різними способами, але єдиний спосіб, який я знайшов, який зберігає мітки та відповідні текстові / вхідні дані в одному рядку і завжди ідеально обертається на ширину батьківського, полягає у використанні таблиці display: inline.

CSS

.container {
  display: inline-table;
  padding-right: 14px;
  margin-top:5px;
  margin-bottom:5px;
}
.fieldName {
  display: table-cell;
  vertical-align: middle;
  padding-right: 4px;
}
.data {
  display: table-cell;
}

HTML

<div class='container'>
    <div class='fieldName'>
        <label>Student</label>
    </div>
    <div class='data'>
        <input name="Student" />
    </div>
</div>
<div class='container'>
    <div class='fieldName'>
        <label>Email</label>
    </div>
    <div class='data'>
      <input name="Email" />
    </div>
</div>

З усіх наведених вище відповідей використання display: inline-table, як ви запропонували, працювало для мене, без необхідності загортати мітку та поле введення в div.
coder101

2

Оберніть мітку та вхідні дані у div bootstraps

<div class ="row">
  <div class="col-md-4">Name:</div>
  <div class="col-md-8"><input type="text"></div>
</div>

2

Ця річ працює добре: вона ставить перемикач або прапорець із міткою в один рядок без css. <label><input type="radio" value="new" name="filter">NEW</label> <label><input type="radio" value="wow" name="filter">WOW</label>


1


-2

Інший варіант - розміщення таблиці всередині форми. (див. нижче) Я знаю, що деякі люди ненавидять таблиці, але я думаю, що вони добре працюють, коли справа стосується адаптивних макетів форм.

<FORM METHOD="POST" ACTION="http://www.cs.tut.fi/cgi-bin/run/~jkorpela/echo.cgi">
<TABLE BORDER="1">
  <TR>
    <TD>Your name</TD>
    <TD>
      <INPUT TYPE="TEXT" NAME="name" SIZE="20">
    </TD>
  </TR>
  <TR>
    <TD>Your E-mail address</TD>
    <TD><INPUT TYPE="TEXT" NAME="email" SIZE="25"></TD>
  </TR>
</TABLE>
<P><INPUT TYPE="SUBMIT" VALUE="Submit" NAME="B1"></P>
</FORM>

2
Таблиці не слід використовувати для макетування.
Міхал Перлаковський,

2
1) Мені болять усі шапки. 2) Таблиці, як сказав @Gothdo, не повинні використовуватися в макеті, вони повинні використовуватися лише в табличних даних goo.gl/V9dRtp
Падаван
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.