飞立(plui)JS API

交互层只有一个文件 src/plui.js,只依赖你上传的 src/common.js(sx 函数库),不引入 jQuery。

全局对象是 window.plui,版本号 plui.version。


1. 两种用法

一、data 属性自动接管(data-api)

页面里写好 data-plui-*,脚本在 DOM 就绪后自动绑定,不用写一行 JS。

<button data-plui-toggle="modal" data-plui-target="#my-modal">打开</button>
<div class="plui-modal" id="my-modal" tabindex="-1">
  <div class="plui-modal-dialog">
    <div class="plui-modal-header"><h5 class="plui-modal-title">标题</h5>
      <button data-plui-dismiss="modal" aria-label="关闭">×</button></div>
    <div class="plui-modal-body">内容</div>
  </div>
</div>

二、实例化

每个组件都是构造函数,可以 new,也可以走静态方法。

var modal = new plui.Modal(document.getElementById('my-modal'), { backdrop: true, keyboard: true });
modal.show();

plui.Modal.getInstance(el);        // 取已有实例,没有返回 null
plui.Modal.getOrCreateInstance(el); // 有就取,没有就建

2. 通用约定

约定说明
方法show() hide() toggle() dispose();返回实例自身,可链式调用
事件show.bs.plui shown.bs.plui hide.bs.plui hidden.bs.plui,全部冒泡
组件专属事件额外发一份 show.bs.plui.modal、hide.bs.plui.toast 这样的精确事件
可取消show 与 hide 事件 cancelable,在监听器里 e.preventDefault() 即可中止
事件对象e.detail 带 relatedTarget(触发元素)等上下文
事件细节e.target 是组件元素,e.currentTarget 是监听器所在的元素
销毁dispose() 会解绑事件、移除遮罩、归还焦点、恢复滚动条
document.addEventListener('show.bs.plui', function (e) {
  if (e.target.id === 'my-modal') { e.preventDefault(); }  // 拦下这一次打开
});

3. 组件 API 一览

组件构造函数特有方法配置项(默认值)data 属性
模态框 Modalnew plui.Modal(el, cfg)show/hide/togglebackdrop:true focus:true keyboard:truedata-plui-toggle="modal" data-plui-target data-plui-dismiss="modal"
离屏面板 Offcanvasnew plui.Offcanvas(el, cfg)show/hide/togglebackdrop:true focus:true keyboard:truedata-plui-toggle="offcanvas" data-plui-dismiss="offcanvas"
下拉菜单 Dropdownnew plui.Dropdown(el, cfg)show/hide/toggleautoClose:truedata-plui-toggle="dropdown"
折叠面板 Collapsenew plui.Collapse(el, cfg)show/hide/toggletoggle:truedata-plui-toggle="collapse" data-plui-target data-plui-parent
标签页 Tabnew plui.Tab(el, cfg)show—data-plui-toggle="tab" / "pill" data-plui-target
轮播 Carouselnew plui.Carousel(el, cfg)to/next/prev/cycle/pauseinterval:5000 ride:false wrap:truedata-plui-ride="carousel" `data-plui-slide="nextprev"`
吐司 Toastnew plui.Toast(el, cfg)show/hide/isShownautohide:true delay:3000data-plui-dismiss="toast" data-plui-autohide
工具提示 Tooltipnew plui.Tooltip(el, cfg)show/hide/toggleplacement:'top' offset:8 trigger:'hover focus'data-plui-toggle="tooltip" data-plui-title
弹出框 Popovernew plui.Popover(el, cfg)show/hide/toggleplacement:'top' offset:8data-plui-toggle="popover" data-plui-title data-plui-content
滚动监听 ScrollSpynew plui.ScrollSpy(el, cfg)refreshoffset:100data-plui-spy data-plui-target
提示框 Alertnew plui.Alert(el, cfg)closedismissible:truedata-plui-dismiss="alert"
按钮 Buttonnew plui.Button(el, cfg)toggle—data-plui-toggle="button"

4. 逐组件说明

4.1 模态框 Modal

var m = plui.Modal.getOrCreateInstance('#my-modal');
m.show();      // 打开:加 .plui-show、插遮罩、锁滚动条、焦点进面板
m.hide();      // 关闭:移遮罩、解锁滚动条、焦点还给触发按钮
m.toggle();
m.dispose();

4.2 离屏面板 Offcanvas

与模态框同一套骨架,差别是:面板从四边滑入(.plui-offcanvas-start/-end/-top/-bottom),遮罩类是 .plui-offcanvas-backdrop,滚动条锁定同样生效。

4.3 折叠面板 Collapse / 手风琴

<div class="plui-accordion" id="acc">
  <div class="plui-accordion-item">
    <h3><button class="plui-accordion-button" data-plui-toggle="collapse" data-plui-target="#p1">一</button></h3>
    <div class="plui-accordion-collapse" id="p1">
      <div class="plui-accordion-body">…</div>
    </div>
  </div>
</div>

同一 data-plui-parent 下的面板互斥:展开一个会自动收起同组的其它面板,并同步 aria-expanded。

4.4 轮播 Carousel

var c = plui.Carousel.getOrCreateInstance('#hero');
c.next(); c.prev(); c.to(2); c.pause(); c.cycle();

4.5 吐司 Toast

plui.toast.notify({ title: '已保存', body: '内容已写入', delay: 3000 });

自动在页面里找 .plui-toast-container;没有就新建一个。返回 Toast 实例,可以继续 hide()。

4.6 工具提示与弹出框

定位引擎会按可用空间自动翻转(顶部放不下就翻到下方),并写 data-plui-placement 标明最终位置。

<button data-plui-toggle="popover" data-plui-title="标题" data-plui-content="正文">点我</button>

鼠标悬停与键盘聚焦都会触发,Esc 关闭。

4.7 滚动监听 ScrollSpy

<nav class="plui-scrollspy-nav" data-plui-spy="#spy">
  <a class="plui-scrollspy-link" href="#a">A</a>
</nav>

滚动时命中项加 .active 并写 aria-current="true",其余项清掉。offset 用来抵消吸顶导航的高度。


5. 无障碍约定

项目做法
焦点管理模态框 / 离屏面板打开时焦点进入面板,关闭后归还触发元素
焦点陷阱面板内 Tab / Shift+Tab 循环,不会跑到背景内容
Esc浮层(模态框、离屏面板、工具提示、弹出框)一律可 Esc 关闭
键盘轮播支持左右方向键;下拉菜单支持上下方向键;标签页用 Tab 进入后用方向键切换
ARIA标签页 aria-selected,折叠 aria-expanded,滚动监听 aria-current,吐司 role="status" aria-live="polite"
隐藏隐藏内容用 display:none(读屏不读),仅给读屏的文本用 .plui-sr-only
对比度文字色板按 WCAG AA 校准(正文 21:1,次级 7.5:1,弱化 4.8:1)

6. 与 Bootstrap 的差异

本页由 build/build-docs.mjs 从同名 Markdown 生成,请修改 .md 后重新生成,不要手工编辑本文件。