aboutsummaryrefslogtreecommitdiff
path: root/build/default-brower-forms/index.html
blob: 48c8dfd106e7870954d2bb2ab4104cc6bd3a1df7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
<!doctype html>
<html lang="en" id="top">
<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<link rel="icon" href="data:,">
	<title>Very Basic Form Styling</title>
	<link href="https://bt.ht/atom.xml" type="application/atom+xml" rel="alternate" title="Atom feed for blog posts" />
	<style>*{box-sizing:border-box;}body{font-family:sans-serif;margin:0 auto;max-width:650px;padding:1rem;}img{max-width:100%;}pre{overflow:auto;}table{text-align:left;width:100%;}</style>
</head>

<nav>
  <a href="#menu">Menu &darr;</a>
</nav>

<main>
<h1>Very Basic Form Styling</h1>
<p>2019-11-13</p>
<p>Web forms can be great - I'm borderline obsessed with them. I love tinkering with pre-existing logins / sign up pages and I've also open sourced a minimal CSS form-styling plugin: <a href="https://normform.netlify.com/">Normform</a>. While simple CSS plugins like these can be helpful, I often feel like we are over-engineering our web forms. I'm certainly guilty of it.</p>
<p>That's not to say developers should just use default browser styling for their forms and call it a day - that is far from ideal. Just pull-back on adding so much styling garbage to the forms themselves.</p>
<p>Let's check out an embedded demo below to see what some bare-bones form styling could look like:</p>
<p><a href="https://codepen.io/bradleytaunt/pen/oNwzvMa">Live CodePen Example</a></p>
<p>This form isn't going to win any design awards or blow anyone away with its creativity. That's okay - because it gets the job done. Users understand it's a form and items are broken down into digestible chunks. Mission accomplished, right?</p>
<h2>Breaking the form down</h2>
<p>Let's take a look at the HTML of the entire form:</p>
<pre><code>&lt;form action=&quot;&quot;&gt;
    &lt;fieldset&gt;
        &lt;legend&gt;Personal Details&lt;/legend&gt;
        &lt;label for=&quot;username&quot;&gt;Desired Username:&lt;/label&gt;
        &lt;input type=&quot;text&quot; id=&quot;username&quot;&gt;
        &lt;label for=&quot;name&quot;&gt;Full Name:&lt;/label&gt;
        &lt;input type=&quot;text&quot; id=&quot;name&quot;&gt;
        &lt;label for=&quot;email&quot;&gt;Email Address:&lt;/label&gt;
        &lt;input type=&quot;email&quot; id=&quot;email&quot;&gt;
        &lt;label for=&quot;date&quot;&gt;Date of Birth:&lt;/label&gt;
        &lt;input type=&quot;date&quot; id=&quot;date&quot;&gt;
    &lt;/fieldset&gt;
    &lt;br&gt;
    &lt;fieldset&gt;
        &lt;legend&gt;Contact Details&lt;/legend&gt;
        &lt;label for=&quot;address&quot;&gt;Home Address:&lt;/label&gt;
        &lt;input type=&quot;text&quot; id=&quot;address&quot;&gt;
        &lt;label for=&quot;postal&quot;&gt;Postal Code:&lt;/label&gt;
        &lt;input type=&quot;text&quot; id=&quot;postal&quot;&gt;
        &lt;label for=&quot;phone&quot;&gt;Phone Number:&lt;/label&gt;
        &lt;input type=&quot;tel&quot; id=&quot;phone&quot;&gt;
    &lt;/fieldset&gt;
    &lt;br&gt;
    &lt;fieldset&gt;
        &lt;legend&gt;Select an Option&lt;/legend&gt;
        &lt;label for=&quot;radio-1&quot;&gt;
            &lt;input type=&quot;radio&quot; id=&quot;radio-1&quot; name=&quot;radio-choice&quot;&gt;
            The option is pretty nice
        &lt;/label&gt;
        &lt;label for=&quot;radio-2&quot;&gt;
            &lt;input type=&quot;radio&quot; id=&quot;radio-2&quot; name=&quot;radio-choice&quot;&gt;
            This option is a little bit better
        &lt;/label&gt;
        &lt;label for=&quot;radio-3&quot;&gt;
            &lt;input type=&quot;radio&quot; id=&quot;radio-3&quot; name=&quot;radio-choice&quot;&gt;
            This option is the best
        &lt;/label&gt;
    &lt;/fieldset&gt;
    &lt;br&gt;
    &lt;fieldset&gt;
        &lt;legend&gt;Notifications&lt;/legend&gt;
        &lt;label for=&quot;checkbox-1&quot;&gt;
            &lt;input type=&quot;checkbox&quot; id=&quot;checkbox-1&quot;&gt;
            I would like to receive email notifications
        &lt;/label&gt;
        &lt;label for=&quot;checkbox-2&quot;&gt;
            &lt;input type=&quot;checkbox&quot; id=&quot;checkbox-2&quot;&gt;
            I would like to subscribe to the weekly newsletter
        &lt;/label&gt;
    &lt;/fieldset&gt;
    &lt;br&gt;
    &lt;input type=&quot;reset&quot; value=&quot;Reset&quot;&gt;
    &lt;input type=&quot;submit&quot; value=&quot;Submit&quot;&gt;
&lt;/form&gt;
</code></pre>
<p>Notice the <code>fieldset</code> and <code>legend</code> elements? I bet you don't see or hear about those HTML items very often. By default, <code>fieldset</code> allows sibling or related inputs to be semantically grouped together. The <code>legend</code> elements give the user great visual cues about which items are grouped together, helping to focus on each section individually as they complete the form. Use these grouping elements as much as possible (when it makes sense of course) for a better guided experience for your users. </p>
<p>Avoid making your own custom sections and instead use these existing HTML semantics.</p>
<h2>Almost no CSS at all</h2>
<p>Now it's time to style this form with only 6 property declarations:</p>
<pre><code>form label {
    display: block;
}
form input {
    display: inline-block;
    margin-bottom: 10px;
    padding: 10px;
    width: 100%;
}
form input[type=&quot;radio&quot;],
form input[type=&quot;checkbox&quot;],
form input[type=&quot;reset&quot;],
form input[type=&quot;submit&quot;] {
    width: auto;
}
</code></pre>
<p>Of course, you can always add minor adjustments (like in my demo example above)</p>
<ul>
<li>Legend typeface and sizing</li>
<li>Form and fieldset background colors</li>
<li>Extra margin and padding</li>
<li>Custom reset / submit buttons</li>
</ul>
<p>But the main point of this post is to showcase how little CSS is needed to implement decent web forms - so any further improvements are up to you, dear reader. </p>
<p>Just try not to reinvent the wheel.</p>
<h2>Final rant - don't ignore the reset</h2>
<p>A lot of "modern" web forms have moved away from including the reset input on their forms, which I think is fairly short-sighted. Resetting all form fields might be a smaller edge case, but it is certainly a better option than relying on the user to <i>refresh</i> or in some cases, individually deleting each input. Yikes.</p>
<p>Happy form building!</p>
<footer role="contentinfo">
    <h2>Menu Navigation</h2>
    <ul id="menu">
        <li><a href="/">Home</a></li>
        <li><a href="/projects">Projects</a></li>
        <li><a href="/uses">Uses</a></li>
        <li><a href="/wiki">Wiki</a></li>
        <li><a href="/resume">Resume</a></li>
        <li><a href="/colophon">Colophon</a></li>
        <li><a href="/now">Now</a></li>
        <li><a href="/donate">Donate</a></li>
        <li><a href="/atom.xml">RSS</a></li>
        <li><a href="#top">&uarr; Top of the page</a></li>
    </ul>
    <small>
        Built with <a href="https://git.sr.ht/~bt/barf">barf</a>. <br>
        Maintained with ♥ for the web. <br>
        Proud supporter of <a href="https://usefathom.com/ref/DKHJVX">Fathom</a> &amp; <a href="https://nextdns.io/?from=74d3p3h8">NextDNS</a>. <br>
        The content for this site is <a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>.<br> The <a href="https://git.sr.ht/~bt/bt.ht">code for this site</a> is <a href="https://git.sr.ht/~bt/bt.ht/tree/master/item/LICENSE">MIT</a>.
    </small>
</footer>