Làm cách nào để <label> và <input> xuất hiện trên cùng một dòng trên một biểu mẫu HTML?


94

Tôi đang tạo một biểu mẫu đăng ký cho một trang web. Tôi muốn mỗi nhãn và phần tử đầu vào tương ứng của nó xuất hiện trên cùng một dòng.

Đây là mã của tôi:

#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>  


Tôi giống như hầu hết rằng câu trả lời này đã không nhận được downvoted bởi vì bạn nói bạn không muốn thử và sai;)
Anna Klein

Câu trả lời:


72

Giả sử bạn muốn thả nổi các phần tử, bạn cũng sẽ phải thả nổi các labelphần tử.

Một cái gì đó như thế này sẽ hoạt động:

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

Ngoài ra, một cách tiếp cận phổ biến hơn sẽ là gói các input/ labelphần tử thành các nhóm:

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

Lưu ý rằng forthuộc tính phải tương ứng với idphần tử có thể gắn nhãn, không phải của nó name. Điều này sẽ cho phép người dùng nhấp vào labelđể cung cấp tiêu điểm cho phần tử biểu mẫu tương ứng.


1
cảm ơn! đây chính xác là những gì tôi muốn đạt được. Cả hai phương pháp đều hoạt động tốt đối với tôi. Tôi có 1 câu hỏi, trong css, tại sao tôi căn chỉnh văn bản của biểu mẫu div vào giữa và sau đó căn phải các nhãn? nếu tôi không căn giữa biểu mẫu div, nó có làm rối mã của tôi không?
luchxo

Câu trả lời tốt, đặc biệt là việc đề cập đến clear: both;nó đã giúp ích cho trường hợp của tôi.
Sirar Salih

33

Tôi thấy "display:flex"phong cách là một cách tốt để làm cho các yếu tố này ở cùng một đường thẳng. Không có vấn đề gì loại phần tử trong div. Đặc biệt nếu lớp đầu vào là form-control, các giải pháp khác như bootstrap, inline-block sẽ không hoạt động tốt.

Thí dụ:

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

Thêm chi tiết về màn hình: flex:

flex-direction: hàng, cột

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

căn chỉnh các mục: kéo dài, uốn cong-bắt đầu, uốn cong-kết thúc, trung tâm


không nhận thức được sự tồn tại của flex
Espoir Murhabazi

18

aaa ## HTML Tôi khuyên bạn nên bọc chúng trong một div, vì bạn có thể sẽ trôi nổi chúng trong một số ngữ cảnh nhất định.

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

CSS

Sau đó, trong div đó, bạn có thể tạo từng phần inline-blockđể bạn có thể sử dụng vertical-alignđể căn giữa chúng - hoặc đặt đường cơ sở, v.v. (nhãn và thông tin đầu vào của bạn có thể thay đổi kích thước trong tương lai ...

.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

CẬP NHẬT: giữa năm 2016 + với các truy vấn phương tiện ưu tiên trên thiết bị di động và hộp linh hoạt

Đây là cách tôi làm mọi việc những ngày này.

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>

SCSS

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


tôi có phải bọc mỗi nhãn và phần tử tương ứng của nó trong một div khác không? hay tôi chỉ bao gồm tất cả các nhãn trong một div này
luchxo

Tôi quấn một khoảng cho 'nhãn' và một đầu vào - trong <label>phần tử bây giờ là một ngày.
sheriffderek

5

Những gì bạn đã thiếu là phao: trái; đây là một ví dụ vừa được thực hiện trong 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>

Cách hiệu quả hơn để làm điều này là thêm một lớp vào các nhãn và đặt float: left; vào lớp trong CSS


4

Ngoài việc sử dụng float, như những người khác đã đề xuất, bạn cũng có thể dựa vào một khung công tác như Bootstrap , nơi bạn có thể sử dụng lớp "dạng ngang" để có nhãn và đầu vào trên cùng một dòng.

Nếu bạn không quen với Bootstrap, bạn cần bao gồm:

  • liên kết đến Bootstrap CSS (liên kết trên cùng có ghi <- CSS được biên dịch và rút gọn mới nhất ->) , cũng như thêm một số div:
  • div class = "form-group"
  • div class = "col -..."
  • cùng với class = "col-sm-2 control-label" trong mỗi nhãn, như Bootstrap hiển thị, mà tôi đã đưa vào bên dưới.
  • Tôi cũng đã định dạng lại nút của bạn để nó tuân thủ Bootstrap.
  • và thêm chú giải vào hộp biểu mẫu của bạn, vì bạn đang sử dụng tập trường.

Nó rất đơn giản và bạn sẽ không phải gặp rắc rối với float hoặc hàng tấn CSS để định dạng, như bạn đã liệt kê ở trên.

  <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

Đối với Bootstrap 4, nó có thể được thực hiện với 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

Tôi đang sử dụng Angular 6 với Bootstrap 4 và thấy cách này hoạt động:

<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
Đơn giản và hiệu quả.
caram

2

Tôi đã thực hiện điều này theo một số cách khác nhau nhưng cách duy nhất tôi tìm thấy để giữ các nhãn và dữ liệu văn bản / đầu vào tương ứng trên cùng một dòng và luôn bao bọc hoàn hảo theo chiều rộng của cha là sử dụng bảng hiển thị: nội tuyến.

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>

Trong số tất cả các câu trả lời ở trên, sử dụng display: inline-table như bạn đề xuất đã phù hợp với tôi mà không cần phải bọc nhãn và hộp nhập của tôi trong một div.
coder101

2

Gói nhãn và đầu vào trong div bootstraps

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

2

Điều này hoạt động tốt, nó đặt nút radio hoặc hộp kiểm có nhãn vào cùng một dòng mà không có bất kỳ css nào. <label><input type="radio" value="new" name="filter">NEW</label> <label><input type="radio" value="wow" name="filter">WOW</label>


1


-2

Một tùy chọn khác là đặt một bảng bên trong biểu mẫu. (xem bên dưới) Tôi biết một số người không thích các bảng nhưng tôi nghĩ chúng hoạt động tốt khi nói đến bố cục biểu mẫu đáp ứng.

<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
Bảng không nên được sử dụng để bố trí.
Michał Perłakowski

2
1) Tất cả các mũ làm tổn thương tôi. 2) Bàn, như @Gothdo nói, nên không được sử dụng trong cách bố trí, nó chỉ nên được sử dụng trong dữ liệu bảng goo.gl/V9dRtp
Padawan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.