jQuery UI 教程

jQuery UI 是基于 jQuery 的官方 UI 组件库,提供交互组件(拖放、排序、缩放)、小部件(日期选择器、对话框、标签页、自动完成)与特效动画。

与 jQuery EasyUI 不同,jQuery UI 更轻量、组件风格统一,且由 jQuery 团队官方维护,是前端开发中历史悠久的经典库。

核心组成

分类内容
交互(Interactions)拖放、放置、缩放、选择、排序
小部件(Widgets)折叠面板、自动完成、对话框、菜单、滑块、标签页等
特效(Effects)显示/隐藏/切换动画、颜色动画、类动画
工具(Utilities)定位(Position)、部件工厂(Widget Factory)

快速开始

<link rel="stylesheet" href="jquery-ui.css">
<script src="jquery.js"></script>
<script src="jquery-ui.js"></script>

<script>
$(function () {
  $("#datepicker").datepicker();   // 一行代码生成日期选择器
});
</script>
💡 提示
jQuery UI 的组件都遵循统一 API:$('#el').组件名('方法', 参数)。学会一个组件,其他组件触类旁通。

jQuery UI 简介

jQuery UI 由 jQuery 团队官方开发与维护,是 jQuery 生态的官方组件库,目标是提供一致、可主题化、易用的交互组件。

为什么选择 jQuery UI

  • 官方维护:与 jQuery 同团队,质量与兼容性有保障
  • 主题系统:支持 ThemeRoller 在线换肤,样式统一
  • 无依赖:只依赖 jQuery,不需要额外框架
  • 兼容性好:支持老浏览器,适合企业存量项目

组件清单

类别组件
交互draggable、droppable、resizable、selectable、sortable
小部件accordion、autocomplete、button、datepicker、dialog、menu、progressbar、slider、spinner、tabs、tooltip
特效show、hide、toggle、effect、addClass、removeClass、switchClass、color animation
工具position、widget factory

与 Bootstrap 的关系

✅ 说明
Bootstrap 是 CSS 框架(含少量 JS 组件),jQuery UI 是 JS 组件库。两者可共存:Bootstrap 管布局样式,jQuery UI 管复杂交互。

现状

jQuery UI 已进入维护模式(不再添加新特性),但存量项目极多;其组件设计思想(主题化、部件工厂、统一 API)至今仍有学习价值。

jQuery UI 下载

获取 jQuery UI 的方式有多种:CDN、官方下载器、npm。本教程逐一介绍。

方式一:CDN(推荐,快速)

<!-- jQuery UI CSS -->
<link rel="stylesheet"
  href="https://code.jquery.com/ui/1.13.2/themes/base/jquery-ui.css">

<!-- jQuery + jQuery UI JS -->
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script src="https://code.jquery.com/ui/1.13.2/jquery-ui.min.js"></script>

方式二:npm(构建项目)

npm install jquery jquery-ui-dist
// 引入
import $ from "jquery";
import "jquery-ui-dist/jquery-ui";
import "jquery-ui-dist/jquery-ui.css";

方式三:官方下载器(按需打包)

1. 打开 jqueryui.com/download
2. 勾选需要的组件(如只需 datepicker + dialog)
3. 选择主题,点击下载
4. 得到精简版 jquery-ui.min.js + css

文件组成

文件用途
jquery-ui.min.js全部组件 JS
jquery-ui.css组件样式
themes/base/基础主题资源(图片等)
external/依赖的外部库(如图标)
⚠️ 注意
一定要先引入 jQuery 再引入 jQuery UI;生产环境用压缩版(.min.js)减小体积。

jQuery UI 使用

jQuery UI 的使用非常统一:选择一个元素 → 调用组件方法。本教程演示基本调用方式与常用选项。

基础调用

// 无参数初始化
$("#myDiv").draggable();

// 带选项初始化
$("#datepicker").datepicker({
  dateFormat: "yy-mm-dd",
  minDate: 0,           // 不能选过去的日期
  changeYear: true
});

// 初始化后调用方法
$("#dialog").dialog("open");
$("#tabs").tabs("option", "active", 2);
$("#accordion").accordion("destroy");   // 销毁组件

读取选项

// 获取选项值
var format = $("#datepicker").datepicker("option", "dateFormat");

// 设置选项(可链式)
$("#datepicker")
  .datepicker("option", "minDate", new Date())
  .datepicker("option", "maxDate", "+1M");

事件绑定

// 初始化时通过选项绑定
$("#slider").slider({
  min: 0, max: 100, value: 50,
  slide: function (event, ui) {
    $("#amount").val(ui.value);
  },
  change: function (event, ui) {
    console.log("最终值:", ui.value);
  }
});

// 或通过 on 绑定(组件触发 jQuery 事件)
$("#dialog").on("dialogclose", function () {
  console.log("对话框已关闭");
});

链式调用

$("#myWidget")
  .widgetName("option", "disabled", false)
  .widgetName("refresh");
  // 部分组件支持 refresh 重绘
✅ 规律
所有组件方法名一致:初始化=直接调用、option 读写配置、destroy 销毁、refresh 重绘。这就是部件工厂的功劳(见后文)。

jQuery UI 定制

定制 jQuery UI 主要有三个层面:主题定制、组件裁剪、行为配置。

1. 主题定制(ThemeRoller)

jqueryui.com/themeroller
→ 可视化调整颜色/圆角/字体
→ 一键下载定制后的 CSS

2. 组件裁剪(按需下载)

在 download 页只勾选用到的组件:
✓ Interactions: draggable, droppable
✓ Widgets: datepicker, dialog
✓ Effects: show, hide
→ 生成的 JS 比全量小很多

3. 行为配置(选项定制)

$("#dialog").dialog({
  title: "自定义标题",
  width: 500,
  modal: true,               // 模态
  draggable: true,           // 可拖动
  resizable: false,          // 禁止缩放
  buttons: [
    { text: "确定", click: function () { $(this).dialog("close"); } },
    { text: "取消", click: function () { $(this).dialog("close"); } }
  ]
});

4. 全局默认值定制

// 修改所有 datepicker 的默认值
$.datepicker.setDefaults({
  dateFormat: "yy-mm-dd",
  showWeek: true
});

// 修改所有 dialog 默认值
$.widget("ui.dialog", $.ui.dialog, {
  options: $.extend($.ui.dialog.prototype.options, {
    modal: true,
    width: 480
  })
});
✅ 最佳实践
生产环境:ThemeRoller 定制主题 + 按需下载组件 + setDefaults 统一默认值,三管齐下既统一又精简。

jQuery UI 工作原理

理解 jQuery UI 的工作原理,能帮你预测组件行为、排查问题。核心机制:选项合并、事件回调、插件方法、主题类。

1. 插件本质

// jQuery UI 组件本质是 jQuery 插件
// 给元素添加方法,数据存到元素上
$.fn.draggable = function (options) {
  // 首次调用:初始化,数据存 $.data(el, 'ui-draggable')
  // 再次调用:按字符串方法名分发
  return this.each(function () {
    if (typeof options === "string") {
      // 方法调用:$(el).draggable('destroy')
      handleMethod(this, options);
    } else {
      // 初始化
      initWidget(this, options);
    }
  });
};

2. 选项合并机制

// 选项优先级: 默认值 < 全局默认 < 实例选项
$.widget("ui.dialog", {
  options: { modal: false, width: 300 },   // 默认
  _create: function () {
    // this.options 已合并所有层级的选项
    console.log(this.options.modal);
  }
});

3. 主题类与状态

<!-- 组件运行时添加 ui-* 类控制样式 -->
<div class="ui-dialog ui-widget ui-widget-content
     ui-corner-all ui-front">
  <div class="ui-dialog-titlebar ui-widget-header">...</div>
  <div class="ui-dialog-content">...</div>
</div>

4. 事件机制

// 组件事件 = 选项回调 + jQuery 事件 双重支持
$("#slider").slider({
  change: function (e, ui) { }   // 选项回调
});
// 等价于
$("#slider").on("slidechange", function (e, ui) { });
💡 核心
一句话:jQuery UI 组件 = 插件方法 + 数据存储 + 主题类 + 事件,全部由「部件工厂」统一实现(后文详解)。

jQuery UI 主题

jQuery UI 的主题系统基于 CSS 框架(CSS Framework):组件共享一套 ui-* 类,换主题只需换 CSS 文件,HTML 无需改动。

主题类体系

类作用
ui-widget组件根容器
ui-widget-header标题栏背景
ui-widget-content内容区背景
ui-state-default默认状态(按钮等)
ui-state-hover悬停状态
ui-state-active激活状态
ui-state-highlight高亮提示
ui-state-error错误状态
ui-corner-all圆角
ui-icon图标

自定义主题(覆盖 CSS 变量)

/* 覆盖 jquery-ui.css 之后的样式 */
.ui-widget-header {
  background: #2f6fb2;
  color: #fff;
}
.ui-state-default {
  background: #f5f5f5;
  border-radius: 4px;
}
.ui-state-hover {
  background: #e8f0fb;
}

组件共用主题

<!-- 所有组件都用同一套 ui-* 类,主题一致 -->
<div class="ui-widget">
  <button class="ui-button ui-widget ui-state-default
         ui-corner-all">按钮</button>
</div>

<!-- 输入框统一样式 -->
<input class="ui-widget ui-state-default ui-corner-all">
✅ 技巧
想快速自定义主题,优先用 ThemeRoller 生成基础 CSS,再微调几个 ui-state-* 类的颜色即可统一全站。

jQuery UI ThemeRoller

ThemeRoller 是 jQuery UI 官方的在线主题生成器,可视化调整颜色、字体、圆角,一键下载定制 CSS。

使用流程

1. 打开 jqueryui.com/themeroller
2. 调整各类颜色:
   - 基本色(背景/边框/文字)
   - 标题栏颜色
   - 悬停/激活/高亮/错误状态色
   - 圆角大小、图标风格
3. 右上角点击 "Download theme"
4. 获取定制后的 jquery-ui.css

主题变量对应关系

ThemeRoller 项对应 CSS 类
Fontbody, .ui-widget 字号字体
Corner radiusui-corner-all 等圆角类
Default stateui-state-default
Hover stateui-state-hover
Active stateui-state-active
Highlightui-state-highlight
Errorui-state-error
Contentui-widget-content
Headerui-widget-header

多主题共存

/* 生成两套主题:base(默认) 与 dark(深色) */
/* 深色主题中,组件根加 dark 类即可切换 */
.dark .ui-widget-header { background: #333; color: #fff; }
.dark .ui-state-default { background: #555; color: #eee; }
✅ 建议
先选一个接近目标风格的官方预设主题(如 ui-darkness、smoothness),再在 ThemeRoller 里微调,比从零配色快得多。

jQuery UI CSS 框架 API

jQuery UI 的 CSS 框架提供一组可复用的工具类与交互状态类,配合 addClass 方法实现平滑的类动画。

框架工具类

类用途
ui-helper-hidden隐藏元素(绝对定位不可见)
ui-helper-hidden-accessible视觉隐藏但可被读屏器读取
ui-helper-reset重置 margin/padding/边框
ui-helper-clearfix清除浮动
ui-helper-zfix遮挡 iframe 修复(旧 IE)
ui-front提升到最上层
ui-state-disabled禁用状态

交互状态类

<!-- 默认/悬停/激活状态切换 -->
<a class="ui-state-default" href="#">按钮</a>

/* CSS */
.ui-state-default { background:#e6e6e6; border:1px solid #ccc; }
.ui-state-hover   { background:#dadada; border-color:#999; }
.ui-state-active  { background:#fff; border-color:#007fff; }

用 addClass 实现状态动画

// 平滑切换状态(需要引入 effects 模块)
$("#btn")
  .on("mouseenter", function () {
    $(this).addClass("ui-state-hover", 200);   // 200ms 动画
  })
  .on("mouseleave", function () {
    $(this).removeClass("ui-state-hover", 200);
  });

图标系统

<!-- ui-icon 图标(配合主题图片) -->
<span class="ui-icon ui-icon-circle-triangle-e"></span>

/* 常见图标: */
/* ui-icon-gear 齿轮  ui-icon-search 搜索 */
/* ui-icon-closethick 关闭  ui-icon-check 对勾 */
✅ 提示
CSS 框架类是 jQuery UI 的「底层积木」:即使不用组件,也能用 ui-state-* + addClass 快速实现统一风格的交互元素。

jQuery UI 部件库

部件库(Widget Library)是 jQuery UI 的组件基础设施,提供一组现成的、可复用的交互组件,统称为「小部件(Widgets)」。

部件库组成

小部件功能
Accordion折叠面板
Autocomplete自动完成输入
Button按钮增强
Datepicker日期选择器
Dialog对话框
Menu菜单
Progressbar进度条
Slider滑块
Spinner数字微调器
Tabs标签页
Tooltip工具提示

部件的共同特征

  • 由 Widget Factory 创建(统一 API)
  • 支持 主题化(ui-* 类)
  • 支持 选项/事件/方法 三件套
  • 可扩展和组合

部件使用示例

// 折叠面板
$("#accordion").accordion({ collapsible: true });

// 自动完成
$("#tags").autocomplete({
  source: ["HTML", "CSS", "JavaScript", "Python"]
});

// 工具提示
$(document).tooltip();

// 进度条
$("#progressbar").progressbar({ value: 60 });

部件与交互的区别

维度交互(Interaction)小部件(Widget)
例子draggable、resizabledatepicker、dialog
有 UI 外观弱(增强行为)强(完整界面)
有选项/事件有有
✅ 理解
交互是「给元素加行为」,小部件是「生成完整组件」。两者都由部件工厂统一管理,API 风格一致。

jQuery UI 扩展小部件

通过 $.widget() 可以扩展已有小部件或创建全新部件。本教程演示扩展 dialog 增加自定义行为。

扩展已有小部件

// 基于 dialog 创建 myDialog,增加自动居中功能
$.widget("custom.myDialog", $.ui.dialog, {
  // 新增选项
  options: {
    autoCenter: true
  },

  // 覆盖创建逻辑
  _create: function () {
    this._super();          // 调用原 dialog 的 _create
    if (this.options.autoCenter) {
      this.element.addClass("auto-centered");
    }
  },

  // 新增方法
  showMessage: function (msg) {
    this.element.html("<p>" + msg + "</p>");
    this.open();
  },

  // 覆盖销毁逻辑
  _destroy: function () {
    this._super();          // 调用原销毁
    console.log("自定义 dialog 已销毁");
  }
});

// 使用
$("#dlg").myDialog({
  autoCenter: true,
  title: "自定义对话框"
});
$("#dlg").myDialog("showMessage", "你好!");

扩展 datepicker 增加快捷按钮

$.widget("custom.quickDatepicker", $.ui.datepicker, {
  _create: function () {
    this._super();
    var self = this;
    this.element.on("focus", function () {
      self.element.datepicker("setDate", new Date());
    });
  }
});
✅ 关键
扩展部件三步:$.widget("名字", 父类, {定义});覆盖方法里用 this._super() 调父类实现;新选项放 options 对象。

jQuery UI 小部件方法调用

小部件初始化后,通过字符串方法名调用其方法:$('#el').widgetName('methodName', args)。

方法调用规则

// 初始化(传对象)
$("#dialog").dialog({ modal: true });

// 调用方法(传字符串)
$("#dialog").dialog("open");
$("#dialog").dialog("close");
$("#dialog").dialog("isOpen");     // 返回布尔

// 带参数
$("#datepicker").datepicker("setDate", "2026-08-17");
$("#tabs").tabs("option", "active", 0);

// 返回值(可赋给变量)
var isOpen = $("#dialog").dialog("isOpen");
var date = $("#datepicker").datepicker("getDate");

option 方法(读写配置)

// 读
var w = $("#dialog").dialog("option", "width");

// 写(单个)
$("#dialog").dialog("option", "width", 600);

// 写(多个)
$("#dialog").dialog("option", {
  width: 600,
  height: 400,
  title: "新标题"
});

refresh / destroy / disable

// 刷新(数据或布局变化后重绘)
$("#accordion").accordion("refresh");
$("#slider").slider("refresh");

// 禁用/启用
$("#datepicker").datepicker("disable");
$("#datepicker").datepicker("enable");

// 销毁(移除所有行为与数据,回到初始)
$("#tabs").tabs("destroy");

实例访问(高级)

// 获取部件实例对象,直接访问内部
var instance = $("#slider").slider("instance");
instance.options.max = 200;        // 直接改选项
instance.refresh();

// 通过 data 获取
// $(el).data("ui-slider") 或 $(el).data("uiSlider")
⚠️ 注意
调用不存在的方法会抛错;对未初始化的元素调用方法同样报错。用 instance() 可判断是否已初始化(返回 undefined 则未初始化)。

jQuery UI 为什么使用部件库

为什么 jQuery UI 要专门维护一个「部件库」?因为组件开发有大量重复的通用问题,部件库把它们统一解决。

手写组件的痛点

// 每个组件都要重复处理:
// 1. 选项默认值与合并
// 2. 方法调用分发
// 3. 主题类添加/移除
// 4. 事件触发
// 5. 销毁时清理资源
// 6. 与 jQuery 链式调用兼容
$.fn.myWidget = function (options) {
  // 每个组件都要手写这一大坨……
};

部件库解决什么

问题部件库方案
选项管理默认值 + 实例选项自动合并
方法分发字符串方法名自动路由
生命周期_create / _init / _destroy 钩子
事件_trigger 统一触发回调+事件
继承扩展$.widget 支持继承
状态管理_setOption 统一响应选项变化

一致的 API 体验

// 所有组件都长这样,学习成本低
$("#a").accordion("option", "active", 1);
$("#b").datepicker("option", "minDate", 0);
$("#c").dialog("option", "modal", true);
//        ↑ 同一个 option 方法
✅ 启示
部件库的思想影响了后续无数组件框架(Backbone.View、jQuery Mobile、Angular 早期组件)。理解它 = 理解「组件化的通用解法」。

jQuery UI 如何使用部件库

从使用者的角度,掌握部件库的三种用法:直接使用、组合使用、扩展自定义。

1. 直接使用现成部件

<!-- HTML 结构 -->
<div id="tabs">
  <ul>
    <li><a href="#tabs-1">标签一</a></li>
    <li><a href="#tabs-2">标签二</a></li>
  </ul>
  <div id="tabs-1">内容一</div>
  <div id="tabs-2">内容二</div>
</div>
// 一行初始化
$("#tabs").tabs();

2. 组合多个部件

// 对话框里放日期选择器 + 滑块
$("#dlg").dialog({
  buttons: [{ text: "确定", click: close }]
});

$("#date").datepicker({
  onSelect: function (date) {
    $("#dlg").dialog("option", "title", "选择了 " + date);
  }
});

$("#range").slider({
  slide: function (e, ui) {
    $("#val").text(ui.value);
  }
});

3. 用部件库扩展自定义组件

$.widget("custom.starRating", {
  options: { max: 5, value: 0 },
  _create: function () {
    this._render();
  },
  _render: function () {
    var self = this, html = "";
    for (var i = 1; i <= this.options.max; i++) {
      html += "<span class='star" + (i <= this.options.value ? " on" : "") + "' data-v='" + i + "'>★</span>";
    }
    this.element.html(html).addClass("ui-widget");
    this.element.on("click", ".star", function () {
      self._setOption("value", $(this).data("v"));
    });
  },
  _setOption: function (key, value) {
    this._super(key, value);
    if (key === "value") this._render();
  }
});

// 使用
$("#rating").starRating({ value: 3 });
$("#rating").starRating("option", "value", 4);
✅ 建议
先用现成部件解决 80% 需求;遇到特殊组件,基于部件工厂扩展——既有统一 API 又省去重复劳动。

jQuery UI API 文档

jQuery UI 的官方 API 文档位于 api.jqueryui.com,按组件组织,每个组件有「选项 / 事件 / 方法」三部分。本教程教你高效查阅。

文档结构

api.jqueryui.com
├── datepicker/
│   ├── 选项(Options)     —— 配置项,含默认值
│   ├── 方法(Methods)     —— 可调用的方法
│   ├── 事件(Events)      —— 回调/触发的事件
│   └── 示例(Examples)
├── interactions/          —— 交互类组件
├── widgets/               —— 小部件类组件
└── effects/               —— 特效类

选项的约定

约定说明
默认值每个选项都标出默认值
类型string / number / boolean / function 等
支持变更标注是否可在初始化后修改
事件前缀选项名 + 回调,如 slide 对应事件 slidechange

查阅示例

// 查 datepicker 的 dateFormat 选项
// 文档显示: dateFormat (默认 "mm/dd/yy")
$("#datepicker").datepicker({
  dateFormat: "yy-mm-dd"
});

// 查 dialog 的 buttons 选项
// 文档显示: buttons (默认 [])
$("#dlg").dialog({
  buttons: [{ text: "OK", click: function () {} }]
});

// 查 slider 的 slide 事件
// 文档显示: slide(event, ui)  ui.value 为当前值
$("#slider").slider({
  slide: function (event, ui) { console.log(ui.value); }
});
✅ 高效技巧
不确定组件有哪些能力时:先看「选项」确认行为,再看「方法」确认能做什么操作,最后看「事件」确认如何响应。三个板块通常已覆盖全部需求。

API 类别 - 特效

jQuery UI 的特效(Effects)模块提供丰富的动画:显示/隐藏、颜色渐变、滑动、弹性等,比原生动画更丰富。

特效清单

特效说明
blind百叶窗
bounce弹跳
clip裁剪展开
drop下落
explode爆炸分裂
fade淡入淡出
fold折叠
highlight高亮闪烁
puff吹散
pulsate脉动
scale缩放
shake摇晃
size尺寸变化
slide滑动
transfer转移(移动到目标)

基本用法

// 应用特效(隐藏时)
$("#box").hide("explode", 600);
$("#box").show("bounce", { times: 3 }, 500);

// 通用 effect 方法
$("#box").effect("shake", { distance: 10 }, 300);
$("#box").effect("highlight", { color: "#ff0" }, 1000);

// 一次性多特效
$("#box").effect("pulsate", { times: 2 }, 800);

特效参数

// 每个特效有自己的参数对象
$("#box").effect("scale", {
  percent: 200,        // 放大到 200%
  origin: ["middle", "center"]
}, 500);

$("#box").effect("transfer", {
  to: "#target",       // 转移到目标元素
  className: "ui-effects-transfer"
}, 400);
✅ 提示
特效方法签名统一:$(el).effect("名字", 参数对象, 时长);show/hide/toggle 也接受特效名,如 $('#el').hide('drop', 400)。

API 类别 - 特效核心

特效核心(Effects Core)是特效模块的基础设施:提供 $.fn.effect、$.fx 等底层 API,以及类动画(addClass/removeClass 带动画)支持。

特效核心能力

  • $.fn.effect() —— 应用任意特效
  • $.fn.show/hide/toggle 扩展 —— 支持特效名与时长
  • $.fn.addClass/removeClass/toggleClass 扩展 —— 带过渡动画
  • $.fn.switchClass —— 类切换动画
  • $.fn.animate 扩展 —— 支持颜色动画
  • $.fx.interval / $.fx.off —— 帧率控制

启用/禁用动画

// 全局关闭动画(测试/低功耗模式)
$.fx.off = true;

// 调整动画帧率(默认 13ms)
$.fx.interval = 16;

颜色动画

// 原生 jQuery 不支持颜色渐变,特效核心让它支持
$("#box").animate({
  backgroundColor: "#ff6600",
  color: "#ffffff"
}, 800);

类动画

// addClass 带时长 = 平滑过渡
$("#btn").addClass("ui-state-hover", 300);

// removeClass 带时长
$("#btn").removeClass("ui-state-hover", 300);

// switchClass:从一个类切到另一个类
$("#box").switchClass("old-state", "new-state", 400);

自定义缓动(easing)

// 内置缓动: swing(默认) / linear
// 引入 jquery.easing 插件后可用的更多
$("#box").show("slide", { direction: "left" }, 500, "easeOutBounce");

// 回调
$("#box").hide("explode", 500, function () {
  console.log("隐藏完成");
});
✅ 说明
特效核心本身不含具体特效,具体特效(explode、shake 等)在独立的 effects 文件中。只用类动画/颜色动画时,可只引特效核心,体积更小。

API 类别 - 交互

交互(Interactions)是 jQuery UI 的五个行为类组件:拖放、放置、缩放、选择、排序。它们给元素添加交互行为而不生成 UI。

五个交互组件

组件行为关键选项
draggable元素可拖动axis、revert、handle
droppable接收拖放目标accept、hoverClass
resizable元素可缩放minWidth、handles
selectable元素可框选filter、selectedClass
sortable列表可排序axis、items、handle

交互事件模式

// 交互事件分三个阶段: start / (过程) / stop
$("#box").draggable({
  start: function (event, ui) {
    console.log("开始拖动");
  },
  drag: function (event, ui) {
    // 拖动中持续触发
    console.log(ui.position.left, ui.position.top);
  },
  stop: function (event, ui) {
    console.log("拖动结束");
  }
});

// droppable 事件: activate/deactivate/over/out/drop
$("#target").droppable({
  drop: function (event, ui) {
    // ui.draggable 是拖来的元素
    console.log("收到:", ui.draggable.text());
  }
});

ui 对象常用属性

属性含义
ui.position元素当前位置
ui.originalPosition拖动前位置
ui.size缩放后的尺寸
ui.originalSize缩放前尺寸
ui.item排序中拖动的项
ui.draggable被拖入的元素
ui.helper拖动时的辅助元素
✅ 组合价值
交互组件常组合使用:draggable + droppable 做拖拽上传区、sortable 做排序列表、resizable 做可调面板。后续教程逐个实战。

API 类别 - 方法重载

方法重载(Method Override)指 jQuery UI 中「同一方法名按参数不同做不同事情」的机制,常见于 option 与组件方法。

option 方法的重载

// 无参:返回整个选项对象
var all = $("#dlg").dialog("option");

// 一个字符串:返回该选项值
var w = $("#dlg").dialog("option", "width");

// 字符串+值:设置单个选项
$("#dlg").dialog("option", "width", 600);

// 对象:批量设置
$("#dlg").dialog("option", { width: 600, height: 400 });

组件方法的重载示例

// datepicker 的 setDate 重载
$("#dp").datepicker("setDate");                // 设为今天
$("#dp").datepicker("setDate", "2026-08-17");  // 指定日期
$("#dp").datepicker("setDate", new Date());    // Date 对象

// tabs 的 active 选项重载
$("#tabs").tabs("option", "active");        // 读当前索引
$("#tabs").tabs("option", "active", 2);     // 激活第 3 个
$("#tabs").tabs("option", "active", false); // 全部收起

方法返回值

// 无返回值的方法:返回 jQuery 对象,可链式
$("#box").draggable("enable").draggable("refresh");

// 有返回值的方法:返回结果,不可链式
var date = $("#dp").datepicker("getDate");
var open = $("#dlg").dialog("isOpen");
var val = $("#slider").slider("value");
✅ 规律
识别重载规律:无参=读全部、单参=读指定、双参=写、对象=批量写。所有 jQuery UI 组件都遵循这套约定。

API 类别 - 方法

jQuery UI 的方法(Methods)是组件初始化后可调用的操作。本教程按功能归纳常见方法。

生命周期方法

方法作用
destroy销毁组件,移除行为与数据
disable禁用组件
enable启用组件
refresh重新计算/重绘
instance获取组件实例对象
widget获取组件生成的主元素

状态与数据方法

// option:读写配置(见方法重载章)
$("#slider").slider("option", "value", 80);

// 值类方法(组件特有)
$("#slider").slider("value");            // 读值
$("#slider").slider("value", 60);        // 设值
$("#dp").datepicker("getDate");          // 读日期
$("#spinner").spinner("value");          // 读数字
$("#progressbar").progressbar("value");  // 读进度

行为方法(组件特有)

// dialog
$("#dlg").dialog("open");
$("#dlg").dialog("close");
$("#dlg").dialog("moveToTop");

// tabs / accordion
$("#tabs").tabs("select", 1);            // 老版本
$("#tabs").tabs("option", "active", 1);  // 新版本
$("#acc").accordion("option", "active", 0);

// autocomplete
$("#tags").autocomplete("search", "py"); // 触发搜索
$("#tags").autocomplete("close");
$("#tags").autocomplete("widget").hide();

组合使用示例

// 表单提交前统一校验并取值
function collectForm() {
  var result = {
    date: $("#dp").datepicker("getDate"),
    price: $("#spinner").spinner("value"),
    range: $("#slider").slider("value")
  };
  return result;
}
✅ 查阅方法
每个组件的完整方法列表在 api.jqueryui.com/组件名 的「Methods」板块,均标注返回类型与参数说明。

API 类别 - 选择器

jQuery UI 提供少量扩展选择器(基于 jQuery 选择器引擎),用于精确定位处于特定状态的元素。

内置扩展选择器

选择器匹配
:focusable可获得焦点的元素
:tabbable可通过 Tab 聚焦的元素

:focusable 用法

// 找出容器内所有可聚焦元素
var focusables = $("#panel").find(":focusable");
console.log(focusables.length);

// 实现 Tab 键循环焦点
$("#dlg").on("keydown", function (e) {
  if (e.key === "Tab") {
    var items = $(this).find(":focusable");
    var idx = items.index(document.activeElement);
    e.preventDefault();
    items.eq((idx + 1) % items.length).trigger("focus");
  }
});

:tabbable 用法

// 只匹配可通过 Tab 顺序聚焦的元素(排除 disabled)
$("#dlg").find(":tabbable").first().trigger("focus");

// 对话框打开时自动聚焦第一个输入框
$("#dlg").dialog({
  open: function () {
    $(this).find(":tabbable").first().trigger("focus");
  }
});

无障碍支持

<!-- 对话框/菜单等组件自动添加 ARIA 属性 -->
<div role="dialog" aria-labelledby="dlg-title" aria-modal="true">
  <div id="dlg-title">提示</div>
</div>

/* 使用 :focusable 等选择器实现键盘导航,
   提升无障碍体验(accessibility) */
✅ 场景
对话框打开聚焦、Tab 循环、表单焦点管理——用 :focusable / :tabbable 让键盘用户也能顺畅操作。

API 类别 - 主题

jQuery UI 的主题 API 指与主题相关的选项与方法:组件选项 classes、主题回调,以及如何动态换肤。

classes 选项(自定义类)

// 给组件结构的不同部分附加自定义类
$("#tabs").tabs({
  classes: {
    "ui-tabs": "my-tabs",
    "ui-tabs-tab": "my-tab",
    "ui-tabs-panel": "my-panel"
  }
});

// 效果:组件默认类与自定义类并存
// <div class="ui-tabs my-tabs">...