How to align input forms in HTML
Sophia Terry
I'm new to HTML and I'm trying to learn how to use forms.
The biggest issue I am having so far is aligning the forms. Here is an example of my current HTML file:
<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>The problem with this is, the field box after 'Email' is drastically different in terms of spacing compared to first, and last name. What is the 'proper' way to make it so that they 'line-up' essentially?
I am trying to practice good form and syntax...a lot of people might do this with CSS I am not sure, I have only learned the very basics of HTML so far.
217 Answers
The accepted answer (setting an explicit width in pixels) makes it hard to make changes, and breaks when your users use a different font size. Using CSS tables, on the other hand, works great:
form { display: table; }
p { display: table-row; }
label { display: table-cell; }
input { display: table-cell; }<form> <p> <label for="a">Short label:</label> <input type="text"> </p> <p> <label for="b">Very very very long label:</label> <input type="text"> </p>
</form>Here's a JSFiddle:
And if you need the labels right-aligned, just add text-align: right to the labels:
EDIT: One more quick note: CSS tables also let you play with columns: for example, if you want to make the input fields take as much space as possible, you can add the following in your form
<div></div>
<div></div>you may want to add white-space: nowrap to the labels in that case.
Another example, this uses CSS, I simply put the form in a div with the container class. And specified that input elements contained within are to be 100% of the container width and not have any elements on either side.
.container { width: 500px; clear: both;
}
.container input { width: 100%; clear: both;
}<html>
<head> <title>Example form</title>
</head>
<body> <div> <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> 6 A simple solution for you if you're new to HTML, is just to use a table to line everything up.
<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> 8 I find it far easier to change the display of the labels to inline-block and set a width
label { display: inline-block; width:100px; text-align: right;
} 1 You should use a table. As a matter of logical structure the data is tabular: this is why you want it to align, because you want to show that the labels are not related solely to their input boxes but also to each other, in a two-dimensional structure.
[consider what you would do if you had string or numeric values to display instead of input boxes.]
1I'm a big fan of using definition lists.
<dl>
<dt>Username:</dt>
<dd><input type="text" name="username" /></dd>
<dt>Password:</dt>
<dd><input type="password" name="password" /></dd>
</dl>They're easy to style using CSS, and they avoid the stigma of using tables for layout.
1For this, I prefer to keep a correct HTML semantic, and to use a CSS simple as possible.
Something like this would do the job :
label{ display: block; float: left; width : 120px;
}One drawback however : you might have to pick the right label width for each form, and this is not easy if your labels can be dynamic (I18N labels for instance).
using css
.containerdiv label { float:left; width:25%; text-align:right; margin-right:5px; /* optional */
}
.containerdiv input { float:left; width:65%;
}this give you something like:
label1 |input box | another label |another input box | 1 I know this has already been answered, but I found a new way to align them nicely - with an extra benefit - see
basically you use the label element around the input and align using that:
<label><span>Name</span> <input /></label>
<label><span>E-Mail</span> <input /></label>
<label><span>Comment</span> <textarea></textarea></label>and then with css you simply align:
label { display:block; position:relative;
}
label span { font-weight:bold; position:absolute; left: 3px;
}
label input, label textarea, label select { margin-left: 120px;
}- you do not need any messy br lying around for linebreaks - meaning you can quickly accomplish a multi-column layout dynamically
- the whole line is click-able. Especially for checkboxes this is a huge help.
- Dynamically showing/hiding form lines is easy (you just search for the input and hide its parent -> the label)
- you can assign classes to the whole label making it show error input much clearer (not only around the input field)
Clément's answer is by far the best. Here's a somewhat improved answer, showing different possible alignments, including left-center-right aligned buttons:
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> <div> <p> <label for="Input0">Left:</label> <input type="text" size="30" placeholder="Left Left Left"/> </p> <p> <label for="Input1">Left Right Left:</label> <input type="text" size="30" placeholder="Left Right Left"/> </p> <p> <label for="Input2">Right Left Left:</label> <input type="text" size="30" placeholder="Right Left Left"/> </p> <p> <label for="Input3">Right Right Left:</label> <input type="text" size="30" placeholder="Right Right Left"/> </p> <p> <label for="Input4">Left Left Right:</label> <input type="text" size="30" placeholder="Left Left Right"/> </p> <p> <label for="Input5">Left Right Right:</label> <input type="text" size="30" placeholder="Left Right Right"/> </p> <p> <label for="Input6">Right Left Right:</label> <input type="text" size="30" placeholder="Right Left Right"/> </p> <p> <label for="Input7">Right:</label> <input type="text" size="30" placeholder="Right Right Right"/> </p> <p> <label for="Input8">And centralised is also possible:</label> <input type="text" size="60" placeholder="Center in the centre"/> </p> </div> <div> <div> <div><button type="button">Button on the Left</button></div> <div><button type="button">Button on the Centre</button></div> <div><button type="button">Button on the Right</button></div> </div> </div>
</form>I added some padding on the right of all labels (padding-right:8px) just to make the example slight less horrible looking, but that should be done more carefully in a real project (adding padding to all other elements would also be a good idea).
The traditional method is to use a table.
Example:
<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>However, many would argue that tables are restricting and prefer CSS. The benefit of using CSS is that you could use various elements. From divs, ordered and un-ordered list, you could accomplish the same layout.
In the end, you'll want to use what you're most comfortable with.
Hint: Tables are easy to get started with.
2Well for the very basics you can try aligning them in the table. However the use of table is bad for layout since table is meant for contents.
What you can use is CSS floating techniques.
CSS Code
.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>
<form>
<label>First Name:</label><input type="text" name="first" /><div></div>
<label>Last Name:</label><input type="text" name="first" /><div></div>
<label>Email:</label><input type="text" name="first" /><div></div>
</form>
</div>An elaborated article I wrote can be found answering the question of IE7 float problem: IE7 float right problems
4It also can be done using CSS and without tables or floats or fixed lengths by changing the content direction to rtl and then back to ltr, but the labels must go after each input.
To avoid this markup reordering, just set the label's text in a data-* attribute and show it using an ::after pseudo-element. I think it becomes much clearer.
Here is an example setting the label's text in a custom attribute called data-text and showing them using the ::after pseudo-element, so we don't mess with markup while changing direction to rtl and ltr :
form
{ display: inline-block; background-color: gold; padding: 6px;
}
label{ display: block; direction: rtl;
}
input{ direction: ltr;
}
label::after{ content: attr(data-text);
}<form> <label> <input type="text" /> </label> <label> <input type="text" /> </label> <label> <input type="text" /> </label>
</form> css I used to solve this problem, similar to Gjaa but styled better
p
{ text-align:center; }
.styleform label
{ float:left; width: 40%; text-align:right; }
.styleform input
{ float:left; width: 30%; }Here is my HTML, used specifically for a simple registration form with no php code
<form> <h1>Register</h1> <div> <fieldset> <p><label>Name:</label> <input type="text" placeholder="Name" autofocus required> </p> <p><label>Email:</label> <input type="text" placeholder="Email Address" required> </p> <p><label>Username:</label> <input type="text" placeholder="Username" autofocus required> </p> <p> <label>Password:</label> <input type="password" placeholder="Password" required> </p> </fieldset> <fieldset> </fieldset> </div> <p> <input type="submit" value="Register"> </p>It's very simple, and I'm just beginning, but it worked quite nicely
Insert input tags inside an unordered lists.Make the style-type none. Here's an example.
<ul>
Input1
<li> <input type="text" />
Input2
<li> <input type="text" />
<ul/>Worked for me !
1<form> <div> <label for='username'>UserName</label> <input type='text' name='username' id='username' value=''> </div>
</form>In the CSS you have to declare both label and input as display: inline-block and give width according to your requirements. Hope this will help you. :)
Simply add
<form align="center ></from>Just put align in opening tag.
1