知蛛网
  • 首页
  • 会员
  • 活动
  • 工作台

常见问题
活动
关于我们
联系我们
隐私协议
用户协议
会员协议
© 2026 知蛛网. 保留所有权利。
首页会员工作台我的
flynn@flynn
主页wiki简历作品集
目录
全部书籍
00-路线
  • 学习路线
  • 命名与写作规范
01-计算机基础
01-计算机网络
  • 互联网是如何工作的
  • HTTP协议
  • TCP/IP协议
  • 浏览器直接打开本地html文件,请求时的协议问题
02-浏览器原理
  • 浏览器是如何渲染页面的
  • 浏览器是如何渲染页面的
  • 面试之浏览器
03-操作系统
  • 进程与线程
  • 内存管理与虚拟内存
  • IO 模型与多路复用
  • 文件系统与页缓存
04-数据结构与算法
  • 数组与链表
  • 栈与队列
  • 哈希表
  • 树与堆
  • 基础数据结构
01-基础数据结构
02-高级算法
  • 排序算法
  • 二分查找
  • 递归与回溯
  • 动态规划
  • 双指针与滑动窗口
03-leetcode刷题
02-前端核心
01-web开发
  • Web 和 Web 标准
  • web 入门
  • web 开发
  • URL
  • 域名
  • Web服务器
  • 命令行
  • 工作流程和流程
  • 超链接
  • 浏览器指纹
02-html
  • HTML基础语法
  • HTML 概述
  • HTML 发展史
  • HTML调试
  • HTML标题与段落
  • 文本格式化
  • 强调与重要性
  • 块级元素和内联元素
  • 列表
  • 区块
  • 语义元素
  • 页面结构化和语义化
  • 超链接
  • 相对路径和绝对路径
  • 图片
  • 表格
  • 表单和按钮
  • 多媒体
  • 视频/音频
  • HTML 头部
  • HTML 字符集
  • HTML颜色
  • HTML 语言代码
  • HTML 国家/地区
  • Emoji (表情符号)
  • HTML 标签简写及全称 |
  • SVG
  • Canvas 2D
  • Canvas 3D
  • 框架 `<iframe>`
  • HTML 拖放
  • HTML5 Geolocation(地理定位)
  • Web 存储
  • HTML URL 编码
  • MathML
  • 远程图片资源在自己网站中无法展示问题
03-css
  • CSS简介
  • CSS 语法
  • CSS 创建
  • CSS 发展史
  • CSS 浏览器支持
  • CSS 选择器
  • CSS `!important` 规则
  • css颜色
  • CSS 文本格式
  • CSS 盒子模型
  • CSS 尺寸
  • CSS 内边距
  • CSS 外边距
  • CSS 边框
  • CSS 轮廓
  • CSS 背景(background)
  • CSS 溢出
  • CSS 文档流
  • CSS 显示和可见性
  • CSS 浮动
  • CSS 定位
  • CSS 对齐方式
  • CSS 网页布局
  • CSS 多列布局(CSS Multi-column Layout)
  • CSS 透明度
  • CSS 响应式设计(Responsive Design)
  • CSS 媒体查询
  • CSS 列表
  • CSS 表格
  • CSS 表单
  • CSS 链接
  • CSS 用户界面
  • CSS 计数器
  • CSS 过渡
  • CSS 动画
  • CSS 2D 转换
  • CSS 3D 转换
  • CSS 变量(CSS Custom Properties)
  • CSS 原生嵌套(CSS Nesting)
  • CSS 函数(CSS Functions)
04-javascript
  • 什么是 JavaScript?
  • 编程范式(Programming Paradigm)
  • 什么是范式?
  • ECMAScript 规范
  • 什么是语法糖
  • 开发环境搭建
  • 什么是堆和栈?
  • 什么是执行上下文
  • JavaScript 垃圾回收机制
  • 作业队列与事件循环
  • 深拷贝和浅拷贝
  • 语法与类型
  • 字面量
  • 控制流与错误处理
  • 循环与迭代
  • 函数
  • 表达式与运算符
  • 数字和字符串
  • 表达日期与时间
  • 正则表达式
  • 索引集合类
  • 带键的集合
  • 对象
  • 类
  • Promise
  • async/await
  • 迭代器和生成器
  • 国际化
  • 模块
  • 资源管理
  • 属性的可枚举性和所有权
  • 闭包
  • 继承与原型链
  • 元编程
  • 内存管理
  • 内置对象
  • arguments 对象
  • BOM 对象(浏览器对象模型)
  • DOM 对象(文档对象模型)
  • bind、apply、call的区别
  • new 操作符
  • typeof 和 instanceof 的区别
  • HTML5 Web Workers
05-typescript
  • TypeScript 类型系统基础
  • 类型体操
03-框架与跨端
01-react
  • 开发环境搭建
  • JSX
  • 组件
  • 生命周期
  • Hooks
  • 组件通信
  • 状态管理
  • React 19 新特性
  • useCallback 闭包陷阱
  • 常用的性能优化操作
  • Firbe 架构
  • React 18 新特性
  • useRef
  • 基于umijs 4.0 搭建官网
  • react+vite本地开发,如何手机联调
  • React 实现谷歌登录
  • React 项目调起 WhatsApp
02-vue
  • vue 解决跨域请求
  • 在vue2使用TinyMCE富文本编辑器
  • 使用jszip 导出新闻
  • Vue 本地开发启用 https
  • 基于vue3+vite+ts+elementplus+pinia+axios搭建后台管理系统
03-react-native
  • iOS 开发环境(RN 0.72)
  • RN 原生模块(Native Module)
  • 查看Maven包的Java包名
  • 优化 APP 启动速度
  • 安全键盘
  • 启动图与 Icon 尺寸规范
  • RN如何生成/配置iOS的开发者证书和生产证书
  • 邓白氏编码
  • 微信开放平台配置Universal Link
  • 上架至Apple App Store
04-android
  • 开发环境搭建
  • Android项目目录结构
  • 认识Gradle
04-工程化
01-git
  • 如何解决已被git跟踪文件不在跟踪
  • git标签
  • Git报错: Failed to connect to github.com port 443 解决方案
  • Git 分支操作速查
02-构建工具
  • 构建工具原理与选型
02-webpack
  • webpack 核心概念与构建流程
  • webpack 性能优化
03-vite
  • vite 为什么快
  • vite 插件与生产构建
03-测试
  • 前端测试体系
04-部署
  • Nginx 反向代理解决跨域
  • SPA 刷新非首页报 404
05-docker
  • Docker 常用命令
  • docker-compose nginx配置ssl证书
  • Docker Desktop 升级后 docker-compose 命令找不到
06-性能优化
  • 前端性能优化体系
  • 背景 GIF 优化方案
07-微前端
  • 微前端实战(qiankun)
  • 微前端 · qiankun
01-qiankun
05-后端与数据
01-nodejs
  • Node 版本与依赖的 engines 冲突
  • Express 实现 Gmail 发信(邮箱验证码)
02-php
  • 浏览器保存新闻,发布到自有网站
  • [分布式] 浏览器保存新闻,发布到自有网站
  • 邮件发送,多账号轮询
  • nginx和php-fpm通信问题导致网站页面空白
03-python
  • macOS M1 芯片 如何安装 py 和 tkinter
  • tkinter 编写的程序如何打包成桌面软件
04-架构设计
  • 后台管理系统中角色管理、管理员管理、权限设置他们三者之间的关系
05-运维
  • redis启动失败
  • 实现自动备份宝塔项目及数据库到本地
  • 宝塔面板
01-宝塔
06-实战项目
  • 实战准备工作
02-项目记录
  • AI-Chat 模块技术文档
  • CRMChat 部署
07-面试专项
01-面试
  • 面试之自我介绍
  • CSS 面试
  • JS面试
  • React面试
  • Vue面试
  • RN 面试 · 题目清单
  • RN 面试 · 答案详解
  • RN 物流公司 · 题目清单
  • RN 物流公司 · 答案详解
  • Uniapp 面试
  • 带团队经验
12-react专项
  • 一个表格,某一行的某一列数据变动了,如何优化性能?
13-reactnative专项
  • RN 开发过程中,有遇到什么棘手的问题?你是如何解决的?
14-过往面试总结
  • 冷哥传媒 · 面试题
  • 沐腾科技 · 面试题
  • 字符频率排序
02-面试八股
  • 网络八股
  • 浏览器八股
  • 工程化八股
03-算法面试题
  • 前端高频手写题
  • 场景设计题
04-真实面试经历
  • 20251027 盾蓝科技 面试
  • 20251028 芝麻甜心 面试
08-工具
01-n8n
  • 初始n8n
  • 快速入门
  • 在宝塔中搭建n8n环境
  • n8n中常用节点
  • n8n和代码的区别
02-Trae
  • Figma MCP 配置指南
03-UI_UX_pro_max
  • UI_UX_pro_max的使用
04-开发环境
  • VMWare虚拟机安装
  • PowerShell 执行策略与编码设置
98-杂项
  • A股股票交易相关费用
99-手册
  • iOS 开发者账号申请流程及费用
  • 邓白氏编码申请及费用
  • App 推送通道申请及费用
  • App 开发收费项目清单
  • 注册AWS账号
  • 使用Amazon Polly实现文本转语音
  • Google 翻译 Key 申请与前端调用
  • 使用SmsForwarder转发短信

表单和按钮

02-html2026/11/14

表单是 HTML 中用于收集用户输入的重要元素。

基本表单结构

<form action="/submit" method="POST">
  <!-- 表单控件 -->
  <input type="text" name="username">
  <button type="submit">提交</button>
</form>

核心表单元素

1. <form> - 表单容器

定义表单及其提交行为。

<form action="/api/submit" method="POST" enctype="application/x-www-form-urlencoded" target="_blank" novalidate>
  <!-- 表单内容 -->
</form>

主要属性:

  • action - 提交地址
  • method - 提交方法 (GET/POST)
  • enctype - 编码类型
  • target - 响应打开位置
  • novalidate - 禁用浏览器验证

2. <input> - 输入控件

最常用的表单元素,通过 type 属性定义不同类型。

<!-- 文本输入 -->
<input type="text" name="username" placeholder="请输入用户名">

<!-- 密码输入 -->
<input type="password" name="password" placeholder="请输入密码">

<!-- 邮箱输入 -->
<input type="email" name="email" required>

<!-- 数字输入 -->
<input type="number" name="age" min="0" max="120" step="1">

<!-- 日期选择 -->
<input type="date" name="birthday">
<input type="time" name="time">
<input type="week" name="week">
<input type="month" name="month">
<input type="datetime-local" name="datetime-local"><!-- 本地时间 -->

<!-- 文件上传 -->
<input type="file" name="avatar" accept="image/*">

<!-- 隐藏字段 -->
<input type="hidden" name="user_id" value="123">

<!-- 单选按钮 -->
<label>性别:</label>
<input type="radio" id="male" name="gender" value="male" checked>
<label for="male">男</label>
<input type="radio" id="female" name="gender" value="female">
<label for="female">女</label>

<!-- 复选框 -->
<input type="checkbox" id="book" name="book" checked>
<label for="book">书</label>
<input type="checkbox" id="pen" name="pen" checked>
<label for="pen">笔</label>

<!-- URL 输入 -->
<input type="email" id="email" name="email" multiple><!-- multiple 属性允许输入多个邮箱,用逗号分隔 -->

<!-- 电话号码 -->
<input type="tel" id="phone" name="phone" pattern="[0-9]{3}-[0-9]{4}-[0-9]{4}">

<!-- 数字输入 -->
<input type="number" id="quantity" name="quantity" min="1" max="100" step="1" value="1">
<input type="number" id="price" name="price" min="0" max="1000" step="0.01">

<!-- 范围选择 -->
<label for="volume">音量:</label>
<input type="range" id="volume" name="volume" min="0" max="100" step="5" value="50">
<span id="volume-value">50</span>
<script>
document.getElementById('volume').addEventListener('input', function() {
  document.getElementById('volume-value').textContent = this.value;
});
</script>

<!-- 颜色选择 -->
<input type="color" id="color-picker" name="color" value="#ff0000">

<!-- 搜索框 -->
<input type="search" id="search" name="search" results="5">

3. <label> - 标签

为表单控件提供标签,提高可访问性。

<!-- 隐式关联 -->
<label>
  用户名:
  <input type="text" name="username">
</label>

<!-- 显式关联 -->
<label for="email">邮箱地址:</label>
<input type="email" id="email" name="email">
上一篇表格
下一篇多媒体
本页目录
基本表单结构核心表单元素1. `<form>` - 表单容器2. `<input>` - 输入控件3. `<label>` - 标签4. `<textarea>` - 多行文本5. `<select>` - 下拉选择6. `<button>` - 按钮7. `<fieldset>` 和 `<legend>` - 分组9. `<datalist>` - 数据列表10. `<output>` - 输出结果11. `<progress>` - 进度条12. `<meter>` - 度量衡表单属性完整的表单示例最佳实践

4. <textarea> - 多行文本

用于输入多行文本内容。

<label for="message">留言:</label>
<textarea id="message" name="message" rows="4" cols="50" placeholder="请输入您的留言..."></textarea>

<!-- 可调整大小 -->
<textarea name="content" style="resize: both;"></textarea>

5. <select> - 下拉选择

创建下拉选择列表。

<label for="city">选择城市:</label>
<select id="city" name="city">
  <option value="">请选择</option>
  <option value="beijing">北京</option>
  <option value="shanghai">上海</option>
  <option value="guangzhou">广州</option>
</select>

<!-- 多选 -->
<select name="hobbies" multiple size="4">
  <option value="reading">阅读</option>
  <option value="sports">运动</option>
  <option value="music">音乐</option>
</select>

<!-- 分组 -->
<select name="car">
  <optgroup label="德系车">
    <option value="bmw">宝马</option>
    <option value="benz">奔驰</option>
  </optgroup>
  <optgroup label="日系车">
    <option value="toyota">丰田</option>
    <option value="honda">本田</option>
  </optgroup>
</select>

6. <button> - 按钮

创建可点击的按钮。

<button type="submit">提交表单</button>
<button type="reset">重置表单</button>
<button type="button">普通按钮</button>

<!-- 带图标的按钮 -->
<button type="submit">
  <img src="submit-icon.png" alt=""> 提交
</button>

7. <fieldset> 和 <legend> - 分组

将相关控件分组。

<fieldset>
  <legend>个人信息</legend>
  
  <label>
    姓名:
    <input type="text" name="name">
  </label>
  
  <label>
    年龄:
    <input type="number" name="age">
  </label>
</fieldset>

<fieldset disabled>
  <legend>只读信息</legend>
  <!-- 禁用的表单控件 -->
</fieldset>

9. <datalist> - 数据列表

<label for="browser">选择浏览器:</label>
<input type="text" id="browser" name="browser" list="browsers">

<datalist id="browsers">
  <option value="Chrome">
  <option value="Firefox">
  <option value="Safari">
  <option value="Edge">
  <option value="Opera">
</datalist>

10. <output> - 输出结果

<form oninput="result.value = parseInt(a.value) + parseInt(b.value)">
  <input type="number" id="a" name="a" value="10"> +
  <input type="number" id="b" name="b" value="20"> =
  <output name="result" for="a b">30</output>
</form>

11. <progress> - 进度条

<label for="file">文件上传进度:</label>
<progress id="file" value="70" max="100">70%</progress>

<!-- 不确定进度 -->
<progress id="loading">加载中...</progress>

12. <meter> - 度量衡

<label for="disk-usage">磁盘使用量:</label>
<meter id="disk-usage" value="0.6" min="0" max="1" low="0.2" high="0.8" optimum="0.5">60%</meter>

<!-- 实际应用 -->
<label>存储空间:</label>
<meter value="75" min="0" max="100" low="25" high="85" optimum="50">75%</meter>

表单属性

<!-- 表单名称 -->
<input type="text" name="username">

<!-- 占位符文本 -->
<input type="text" name="username" placeholder="请输入用户名(3-20个字符)">

<!-- 必填字段 -->
<input type="text" required>

<!-- 自动获取焦点 -->
<input type="text" name="search" autofocus>

<!-- 长度限制 -->
<input type="text" minlength="2" maxlength="50">

<!-- 数值范围 -->
<input type="number" min="0" max="100" step="1">

<!-- 模式匹配 -->
<input type="text" pattern="[A-Za-z]{3,}">

<!-- 禁用验证 -->
<form novalidate>
  <input type="email" name="email" required>
  <button type="submit">提交(不验证)</button>
</form>

<!-- 自定义验证 -->
<input type="text" oninvalid="this.setCustomValidity('请输入有效值')" oninput="setCustomValidity('')">

<!-- 表单关联 -->
<!-- 使用 form 属性关联表单 -->
<input type="text" name="extra" form="main-form">

<form id="main-form">
  <input type="text" name="username">
  <button type="submit">提交</button>
</form>

完整的表单示例

<form action="/register" method="POST" novalidate>
  <fieldset>
    <legend>用户注册</legend>
    
    <div class="form-group">
      <label for="username">用户名:</label>
      <input type="text" id="username" name="username" required minlength="3" maxlength="20" placeholder="3-20个字符">
    </div>
    
    <div class="form-group">
      <label for="email">邮箱地址:</label>
      <input type="email" id="email" name="email" required placeholder="example@email.com">
    </div>
    
    <div class="form-group">
      <label for="password">密码:</label>
      <input type="password" id="password" name="password" required minlength="6" placeholder="至少6位字符">
    </div>
    
    <div class="form-group">
      <label for="gender">性别:</label>
      <select id="gender" name="gender">
        <option value="">请选择</option>
        <option value="male">男</option>
        <option value="female">女</option>
        <option value="other">其他</option>
      </select>
    </div>
    
    <div class="form-group">
      <label>兴趣爱好:</label>
      <div>
        <label>
          <input type="checkbox" name="hobbies" value="sports"> 运动
        </label>
        <label>
          <input type="checkbox" name="hobbies" value="reading"> 阅读
        </label>
        <label>
          <input type="checkbox" name="hobbies" value="music"> 音乐
        </label>
      </div>
    </div>
    
    <div class="form-group">
      <label>订阅通知:</label>
      <label>
        <input type="radio" name="newsletter" value="yes" checked> 是
      </label>
      <label>
        <input type="radio" name="newsletter" value="no"> 否
      </label>
    </div>
    
    <div class="form-group">
      <label for="bio">个人简介:</label>
      <textarea id="bio" name="bio" rows="4" placeholder="介绍一下你自己..."></textarea>
    </div>
    
    <div class="form-group">
      <label for="avatar">头像上传:</label>
      <input type="file" id="avatar" name="avatar" accept="image/png, image/jpeg">
    </div>
    
    <div class="form-actions">
      <button type="submit">注册</button>
      <button type="reset">重置</button>
    </div>
  </fieldset>
</form>

最佳实践

  1. 始终使用
  2. 合理分组 - 使用 fieldset 和 legend
  3. 提供清晰的占位符和提示
  4. 使用合适的输入类型
  5. 实施客户端验证
  6. 考虑移动端体验
  7. 提供明确的错误信息