Every input needs a visible label, and unusual formats need instructions before the field. Public form examples.
A field with no label, or a label that vanishes when you start typing, forces people to guess. WCAG 2.1 success criterion 3.3.2 says that labels or instructions are provided when content requires user input. In the Understanding document, "requires" is read loosely: optional fields count too, because they also accept input.
Whether a label is correctly coded and linked belongs to 1.3.1, the accessible name to 4.1.2, and whether the wording is clear to 2.4.6. This criterion asks the simpler question: is there something there that tells a person what to enter?
DOJ's guidance lists inaccessible forms among common barriers, naming unlabeled fields and unclear instructions among them. Government forms are particularly prone: placeholder-only fields in a utility account lookup, unexplained asterisks, date formats nobody states, groups of radio buttons whose shared question sits in a heading far away. For an overview, see common barriers.
<input name="acct" placeholder="Utility account number"><label for="acct">Utility account number</label>
<input id="acct" name="acct" inputmode="numeric" placeholder="e.g. 4471-0092"><p>Type of visit</p>
<input type="radio" name="visit" id="v1"> <label for="v1">New patient</label>
<input type="radio" name="visit" id="v2"> <label for="v2">Return visit</label><fieldset>
<legend>Type of visit</legend>
<input type="radio" name="visit" id="v1"> <label for="v1">New patient</label>
<input type="radio" name="visit" id="v2"> <label for="v2">Return visit</label>
</fieldset><label for="tag">Dog license tag</label>
<input id="tag" name="tag" pattern="[A-Z]{2}[0-9]{5}"><label for="tag">Dog license tag</label>
<p id="tag-hint">Two capital letters then five digits, for example AB12345.</p>
<input id="tag" name="tag" pattern="[A-Z]{2}[0-9]{5}" aria-describedby="tag-hint">// SwiftUI
TextField("Parcel number", text: $parcel) // label disappears once typed// SwiftUI
VStack(alignment: .leading) {
Text("Parcel number")
Text("Printed on your tax bill, e.g. 12-345-678").font(.caption)
TextField("12-345-678", text: $parcel)
.accessibilityLabel("Parcel number")
}// Jetpack Compose
OutlinedTextField(
value = parcel, onValueChange = { parcel = it },
placeholder = { Text("Parcel number") }
)// Jetpack Compose
OutlinedTextField(
value = parcel, onValueChange = { parcel = it },
label = { Text("Parcel number") },
supportingText = { Text("Printed on your tax bill, e.g. 12-345-678") }
)display:none.