diff --git a/docs/.layui/examples/demo.md b/docs/.layui/examples/demo.md index f6eebb5e..30e2a9fd 100644 --- a/docs/.layui/examples/demo.md +++ b/docs/.layui/examples/demo.md @@ -1,5 +1,3 @@ -
-  
-
- -

示例标题

- -
-  
-
\ No newline at end of file diff --git a/docs/tabs/detail/demo.md b/docs/tabs/detail/demo.md new file mode 100644 index 00000000..a46dd138 --- /dev/null +++ b/docs/tabs/detail/demo.md @@ -0,0 +1,51 @@ +
+  
+
+ +

方法渲染

+ +即通过方法设置 tabs 标签,而非默认的自动渲染页面中的 `class="layui-tabs"` 的容器模板。 + +
+  
+
+ +

卡片风格

+ +
+  
+
+ +

HASH 状态匹配

+ +切换 tabs 标签项后,地址栏同步 `hash` 值,当页面刷新时,tabs 仍保持对应的切换状态。 + +
+  
+
+ +

标签嵌套

+ +
+  
+
+ +

给任意元素添加 Tab 功能

+ +
+  
+
diff --git a/docs/tabs/detail/options.md b/docs/tabs/detail/options.md new file mode 100644 index 00000000..45401761 --- /dev/null +++ b/docs/tabs/detail/options.md @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
属性名描述类型默认值
elem + +绑定元素选择器或 DOM 对象 + +string/DOM-
header + +选项卡的标题列表,可以是一个包含标题文本的数组,也可以是一个包含标题对象的数组。标题对象支持以下属性: +- `title` 标题文本 +- `id` 标题唯一索引 +- `disabled` 是否禁用 + +array-
body + +选项卡的内容列表,可以是一个包含内容文本的数组,也可以是一个包含内容对象的数组。内容对象支持以下属性: +- `content` 内容文本 +- `id` 内容唯一索引 + +array-
index + +初始选中的选项卡索引 + +number + +`0` + +
closable + +是否允许选项卡被关闭 + +boolean + +`false` + +
headerMode + +选项卡标题栏的展现模式。可选值: +- `default` 默认模式 +- `brief` 简约模式 +- `card` 卡片模式 + +string + +`default` + +
\ No newline at end of file diff --git a/docs/tabs/examples/card.md b/docs/tabs/examples/card.md new file mode 100644 index 00000000..ba3545cb --- /dev/null +++ b/docs/tabs/examples/card.md @@ -0,0 +1,54 @@ +

普通卡片:

+ +
+ +
+
内容-1
+
内容-2
+
内容-3
+
内容-4
+
内容-5
+
内容-6
+
+
+ +

边框卡片:

+ +
+ +
+
+
+ +
+
+
2
+
3
+
4
+
5
+
6
+
+
+ + diff --git a/docs/tabs/examples/custom.md b/docs/tabs/examples/custom.md new file mode 100644 index 00000000..c18ba0f2 --- /dev/null +++ b/docs/tabs/examples/custom.md @@ -0,0 +1,33 @@ +
+ +
+ + + +
+
+
内容 111
+
内容 222
+
内容 333
+
+
+ + + diff --git a/docs/tabs/examples/demo.md b/docs/tabs/examples/demo.md new file mode 100644 index 00000000..7e8e9e22 --- /dev/null +++ b/docs/tabs/examples/demo.md @@ -0,0 +1,51 @@ +
+ +
+
Tab Content-1
+
Tab Content-2
+
Tab Content-3
+
Tab Content-4
+
Tab Content-5
+
Tab Content-6
+
+
+ +
+ + + + + +
+ + + diff --git a/docs/tabs/examples/method.md b/docs/tabs/examples/method.md new file mode 100644 index 00000000..8743753b --- /dev/null +++ b/docs/tabs/examples/method.md @@ -0,0 +1,26 @@ +
+ + + diff --git a/docs/tabs/examples/nest.md b/docs/tabs/examples/nest.md new file mode 100644 index 00000000..95f501a6 --- /dev/null +++ b/docs/tabs/examples/nest.md @@ -0,0 +1,40 @@ +
+ +
+
+
+
    +
  • 标题 1-1
  • +
  • 标题 1-2
  • +
+
+
1-1
+
1-2
+
+
+
+
+
+
    +
  • 标题 2-1
  • +
  • 标题 2-2
  • +
  • 标题 2-3
  • +
+
+
2-1
+
2-2
+
2-3
+
+
+
+
3
+
4
+
5
+
+
+ + diff --git a/docs/tabs/index.md b/docs/tabs/index.md new file mode 100644 index 00000000..b22fd784 --- /dev/null +++ b/docs/tabs/index.md @@ -0,0 +1,127 @@ +--- +title: 标签页组件 tabs +toc: true +--- + +# 标签页组件 2.10+ + +> `tabs` 是 2.10 版本新增的加强型组件,用于替代原 `element` 模块中的 `tab` 组件。tabs 广泛应用于 Web 页面。 + +

示例

+ +
+{{- d.include("/tabs/detail/demo.md") }} +
+ +

API

+ +该组件继承 `component` 提供的[基础接口](../component/#inherit),并在此基础上为组件专门扩展了以下接口: + +| API | 描述 | +| --- | --- | +| var tabs = layui.tabs | 获得 `tabs` 模块。| +| [tabs.render(options)](#render) | tabs 组件渲染,核心方法。| +| [tabs.add(id, options)](#add) | 新增一个标签项。| +| [tabs.close(id, index)](#close) | 关闭指定的标签项。| +| [tabs.closeMore(id, type, index)](#closeMore) | 批量关闭标签项。| +| [tabs.change(id, index)](#change) | 切换到指定的标签项。| +| [tabs.data(id)](#data) | 获取当前标签页信息。| +| [tabs.headerItem(id, index)](#headerItem) | 获取指定的标签头部项。| +| [tabs.bodyItem(id, index)](#bodyItem) | 获取指定的标签内容项。| +| [tabs.setView(id)](#setView) | 重新调整标签视图结构。| + +

渲染

+ +`tabs.render(options);` + +- 参数 `options` : 基础属性配置项。[#详见属性](#options) + +tabs 组件会在元素加载完毕后,默认自动对 `class="layui-tabs"` 目标元素完成一次渲染,如果无法找到默认的目标元素,可使用该方法完成标签的初始化渲染。 + +

属性

+ +
+{{- d.include("/tabs/detail/options.md") }} +
+ +

新增标签

+ +`tabs.add(id, options);` + +- 参数 `id` : tabs 容器的唯一 id 标识 +- 参数 `options` : 标签配置项 + ```js + { + title: '标题', // 标签标题 + content: '内容', // 标签内容 + id: 'xxx', // 标签的 lay-id 属性值 + mode: 'append', // 插入模式。可选值: append/prepend/curr + unclosed: true, // 是否禁止关闭。默认 false + done: function(obj){} // 标签添加完毕的回调 + } + ``` + +

关闭标签

+ +`tabs.close(id, index);` + +- 参数 `id` : tabs 容器的唯一 id 标识 +- 参数 `index` : 标签项的索引或 lay-id 属性值 + +

批量关闭标签

+ +`tabs.closeMore(id, type, index);` + +- 参数 `id` : tabs 容器的唯一 id 标识 +- 参数 `type` : 关闭类型。可选值: + - `'all'` : 关闭所有标签 + - `'other'` : 关闭其他标签 + - `'left'` : 关闭左侧标签 + - `'right'` : 关闭右侧标签 +- 参数 `index` : 标签项的索引或 lay-id 属性值,用于定位基准点 + +

切换标签

+ +`tabs.change(id, index);` + +- 参数 `id` : tabs 容器的唯一 id 标识 +- 参数 `index` : 标签项的索引或 lay-id 属性值 + +

获取标签信息

+ +`tabs.data(id);` + +- 参数 `id` : tabs 容器的唯一 id 标识 +- 返回值:包含当前标签页信息的对象 + ```js + { + index: 0, // 当前标签项的索引 + prevIndex: -1, // 上一个标签项的索引 + headerElem: {}, // 当前标签头部元素 + bodyElem: {} // 当前标签内容元素 + } + ``` + +

获取标签头部项

+ +`tabs.headerItem(id, index);` + +- 参数 `id` : tabs 容器的唯一 id 标识 +- 参数 `index` : 标签项的索引或 lay-id 属性值 +- 返回值:标签头部项的 DOM 元素 + +

获取标签内容项

+ +`tabs.bodyItem(id, index);` + +- 参数 `id` : tabs 容器的唯一 id 标识 +- 参数 `index` : 标签项的索引或 lay-id 属性值 +- 返回值:标签内容项的 DOM 元素 + +

重新调整视图

+ +`tabs.setView(id);` + +- 参数 `id` : tabs 容器的唯一 id 标识 +- 描述:用于重新调整标签视图结构,如在容器尺寸变化时调用 + diff --git a/src/css/layui.css b/src/css/layui.css index 536e2863..a2ac0fab 100644 --- a/src/css/layui.css +++ b/src/css/layui.css @@ -1328,7 +1328,7 @@ body .layui-table-tips .layui-layer-content{background: none; padding: 0; box-sh .layui-tabs-header{position: relative; left: 0; height: 40px; white-space: nowrap; font-size: 0; transition: all .16s; -webkit-transition: all .16s;} .layui-tabs-header:after, .layui-tabs-scroll:after{content: ""; position: absolute; left: 0; bottom: 0; z-index: 0; width: 100%; border-bottom: 1px solid #eee;} -.layui-tabs-header li{position: relative; display: inline-block; vertical-align: middle; line-height: 40px; padding: 0 16px; text-align: center; cursor: pointer; font-size: 14px; transition: all .16s; -webkit-transition: all .16s;} +.layui-tabs-header li{position: relative; display: inline-block; vertical-align: middle; line-height: 40px; margin: 0 !important; padding: 0 16px; text-align: center; cursor: pointer; font-size: 14px; transition: all .16s; -webkit-transition: all .16s;} .layui-tabs-header li:first-child{margin-left: 0;} .layui-tabs-header li a{display: block; padding: 0 16px; margin: 0 -16px;} .layui-tabs-header .layui-this{color: #16baaa;} diff --git a/src/modules/code.js b/src/modules/code.js index dc4a795a..93f3e84b 100644 --- a/src/modules/code.js +++ b/src/modules/code.js @@ -3,12 +3,13 @@ * Code 预览组件 */ -layui.define(['lay', 'util', 'element', 'form'], function(exports){ +layui.define(['lay', 'util', 'element', 'tabs', 'form'], function(exports){ "use strict"; var $ = layui.$; var util = layui.util; var element = layui.element; + var tabs = layui.tabs; var form = layui.form; var layer = layui.layer; var hint = layui.hint(); @@ -403,6 +404,7 @@ layui.define(['lay', 'util', 'element', 'form'], function(exports){ render: function(){ form.render(thisItemBody.find('.layui-form')); element.render(); + tabs.render(); } }); },3); diff --git a/src/modules/tabs.js b/src/modules/tabs.js index 37e07394..7869fb54 100644 --- a/src/modules/tabs.js +++ b/src/modules/tabs.js @@ -564,14 +564,24 @@ layui.define('component', function(exports) { // 扩展组件接口 $.extend(component, { - // 增加标签 + /** + * 增加标签 + * @param {string} id - 标签 ID + * @param {object} obj - 标签配置信息 + * @returns + */ add: function(id, obj) { var that = component.getThis(id); if(!that) return this; that.add(obj); }, - // 关闭单个标签 + /** + * 关闭标签 + * @param {string} id - 标签 ID + * @param {number} index - 标签下标 + * @returns + */ close: function(id, index) { var that = component.getThis(id); if(!that) return this; @@ -579,39 +589,68 @@ layui.define('component', function(exports) { that.close(that.findHeaderItem(index)); }, - // 关闭多个标签。若传 index,则按 index 所在标签为事件执行关闭操作 + /** + * 关闭多个标签 + * @param {string} id - 标签 ID + * @param {string} type - 关闭类型,可选值:left、right、other、all + * @param {number} index - 标签下标。若传入,则按 index 所在标签为事件执行关闭操作 + * @returns + */ closeMore: function(id, type, index) { var that = component.getThis(id); if(!that) return this; that.closeMore(type, index); }, - // 切换标签 + /** + * 切换标签 + * @param {string} id - 标签 ID + * @param {number} index - 标签下标 + * @returns + */ change: function(id, index) { var that = component.getThis(id); if(!that) return this; that.change(that.findHeaderItem(index)); }, - // 获取标签信息 + /** + * 获取标签信息 + * @param {string} id - 标签 ID + * @returns + */ data: function(id) { var that = component.getThis(id); return that ? that.data() : {}; }, - // 获取标签指定头部项 + /** + * 获取标签指定头部项 + * @param {string} id - 标签 ID + * @param {number} index - 标签下标 + * @returns + */ headerItem: function(id, index) { var that = component.getThis(id); return that ? that.findHeaderItem(index) : this; }, - // 获取标签指定头部项 + /** + * 获取标签指定内容项 + * @param {string} id - 标签 ID + * @param {number} index - 标签下标 + * @returns + */ bodyItem: function(id, index) { var that = component.getThis(id); return that ? that.findBodyItem(index) : this; }, - // 调整视图结构 + /** + * 调整视图结构 + * @param {string} id - 标签 ID + * @returns + */ setView: function(id) { var that = component.getThis(id); if (!that) return this;