讲解

<input>type 属性决定了它是什么控件,现代浏览器提供了二十多种类型,用对类型等于免费获得合适的键盘、格式校验和交互。文本类有:email(移动键盘弹出 @ 键、自动校验格式)、tel(数字键盘)、urlsearchnumber(数字键盘,配 min/max/step 限定范围与步长)。日期类有 datetimemonth,浏览器直接弹出原生日历。还有 color(取色器)、range(滑块)、file(文件选择,配 accept=".png,.jpg" 限定类型)、hidden(随表单提交但不显示的字段)。

选择类控件有三个注意点。复选框 checkbox 多选多,每个选项各自独立;单选框 radio 多选一,同一组的 radio 必须共享同一个 name,浏览器靠 name 识别「这是同一组」,value 才是提交上去的值;下拉框 <select><option>,选项多时用 <optgroup label="..."> 分组。多行文本用 <textarea>,行数用 rows 控制,它没有 value 属性,初始内容写在标签之间。

还有三个结构性元素:<fieldset> 把一组相关控件框起来、<legend> 给这组控件起标题(「收货信息」「支付方式」),长表单分组后清晰得多;<datalist> 给文本框配一组建议项,既能输入又能从建议中选,是「可输入的下拉框」;<button>type 有 submit(提交,默认值)、reset(重置)、button(普通按钮)三种——表单里的按钮如果不写 type,点击就会提交表单,想让它只做普通按钮务必写 type="button"

示例

<form action="/order" method="post">
  <label for="email">邮箱</label>
  <input type="email" id="email" name="email" required />

  <label for="qty">数量(1–10)</label>
  <input type="number" id="qty" name="qty" min="1" max="10" step="1" value="1" />

  <label for="date">配送日期</label>
  <input type="date" id="date" name="date" />

  <fieldset>
    <legend>配送方式</legend>
    <label><input type="radio" name="ship" value="std" checked /> 标准快递</label>
    <label><input type="radio" name="ship" value="exp" /> 加急</label>
  </fieldset>

  <label for="gift">包装</label>
  <select id="gift" name="gift">
    <optgroup label="付费包装">
      <option value="box">礼盒 ¥10</option>
    </optgroup>
    <optgroup label="免费">
      <option value="none" selected>无需包装</option>
    </optgroup>
  </select>

  <label for="note">备注</label>
  <textarea id="note" name="note" rows="3" maxlength="200"></textarea>

  <label for="coupon">优惠码</label>
  <input list="coupons" id="coupon" name="coupon" />
  <datalist id="coupons">
    <option value="NEW2026"></option>
    <option value="VIP88"></option>
  </datalist>

  <button type="submit">提交订单</button>
  <button type="reset">清空</button>
</form>

常见坑

  • radio 组 name 不一致:name 不同浏览器就认不出是同一组,结果变成可以全选。同组单选共享 name,靠 value 区分选项。
  • button 不写 type:默认 type="submit",在表单里点「普通按钮」却把表单提交了。非提交按钮一定写 type="button"
  • 给 textarea 写 value 属性:它没有 value 属性,初始值要写在 <textarea>这里</textarea> 标签之间。
  • 只依赖浏览器校验:required、type="email"、min/max 都能被绕过,浏览器校验只是用户体验层,服务端必须再校验一遍。

小结

input 的 type 决定控件形态(email/number/date/range 等自带键盘与校验);radio 同组共享 name,checkbox 各自独立;select/textarea/datalist/fieldset 各管一摊;button 的 type 默认是 submit。下一章学习让页面结构「自解释」的语义化元素。