release v2.8.18-rc.2

release v2.8.18-rc.2
pull/1410/head^2 v2.8.18-rc.2
贤心 2023-10-25 11:46:46 +08:00 committed by GitHub
commit 5ad35db868
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
32 changed files with 477 additions and 242 deletions

View File

@ -2,7 +2,7 @@ blank_issues_enabled: false
contact_links:
- name: 😇 问题反馈
url: https://gitee.com/layui/layui/issues
about: 使用 Layui 过程中遇到的 Bug、异常或其他困惑。
about: 使用 Layui 过程中遇到的 Bug、异常或其他功能困惑。
- name: 📄 官方文档
url: https://layui.dev/
about: 建议您在创建 Issue 之前,仔细查阅 Layui 开发文档,以便对其有更深入的了解,和更好地分析问题。

3
dist/css/layui.css vendored

File diff suppressed because one or more lines are too long

1
dist/css/layui.css.map vendored Normal file

File diff suppressed because one or more lines are too long

3
dist/layui.js vendored

File diff suppressed because one or more lines are too long

1
dist/layui.js.map vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -14,7 +14,7 @@ layui.use(function(){
// dropdown 在表格中的应用
table.render({
elem: '#ID-dropdown-demo-table',
url: '/static/2.8/json/table/demo5.json',
url: '/static/json/2/table/demo5.json',
title: '用户数据表',
cols: [[
{type: 'checkbox', fixed: 'left'},
@ -74,4 +74,4 @@ layui.use(function(){
}
});
});
</script>
</script>

View File

@ -175,6 +175,36 @@
</td>
</tr>
<tr>
<td>limitTemplet <sup>2.8.18+</sup></td>
<td>
用于自定义条目模板,如:
```
limitTemplet: function(item) {
return item + ' / page';
}
```
</td>
<td>function</td>
<td>-</td>
</tr>
<tr>
<td>skipText <sup>2.8.18+</sup></td>
<td>
用于自定义跳页区域文本,如:
```
skipText: ['Go to', '', 'Confirm']
```
</td>
<td>array</td>
<td>-</td>
</tr>
<tr>
<td>theme</td>
<td>

View File

@ -1,4 +1,4 @@
<table class="layui-table" lay-data="{height:315, url:'/static/2.8/json/table/user.json', page:true}" id="ID-table-demo-init">
<table class="layui-table" lay-data="{height:315, url:'/static/json/2/table/user.json', page:true}" id="ID-table-demo-init">
<thead>
<tr>
<th lay-data="{field:'id', width:80, sort: true}">ID</th>
@ -13,4 +13,4 @@
</thead>
</table>
<!-- import layui -->
<!-- import layui -->

View File

@ -49,7 +49,7 @@
// 创建渲染实例
table.render({
elem: '#ID-table-demo-css',
url:'/static/2.8/json/table/demo1.json', // 此处为静态模拟数据,实际使用时需换成真实接口
url:'/static/json/2/table/demo1.json', // 此处为静态模拟数据,实际使用时需换成真实接口
page: true,
height: 'full-35',
lineStyle: 'height: 151px;', // 定义表格的多行样式

View File

@ -55,7 +55,7 @@ layui.use(['table', 'dropdown'], function(){
// 创建渲染实例
table.render({
elem: '#test',
url: '/static/2.8/json/table/demo1.json', // 此处为静态模拟数据,实际使用时需换成真实接口
url: '/static/json/2/table/demo1.json', // 此处为静态模拟数据,实际使用时需换成真实接口
toolbar: '#toolbarDemo',
defaultToolbar: ['filter', 'exports', 'print', {
title: '提示',

View File

@ -49,7 +49,7 @@ layui.use(function(){
// 渲染
table.render({
elem: '#ID-table-demo-editmodes',
url: '/static/2.8/json/table/user.json', // 此处为静态模拟数据,实际使用时需换成真实接口
url: '/static/json/2/table/user.json', // 此处为静态模拟数据,实际使用时需换成真实接口
page: true,
css: [ // 设置单元格样式
// 取消默认的溢出隐藏,并设置适当高度
@ -178,4 +178,4 @@ layui.use(function(){
});
});
</script>
</script>

View File

@ -14,7 +14,7 @@ layui.use(function(){
// 创建表格实例
table.render({
elem: '#ID-table-demo-editable',
url: '/static/2.8/json/table/edit.json', // 此处为静态模拟数据,实际使用时需换成真实接口
url: '/static/json/2/table/edit.json', // 此处为静态模拟数据,实际使用时需换成真实接口
page: true,
//,editTrigger: 'dblclick' // 触发编辑的事件类型(默认 click )。 v2.7.0 新增,之前版本固定为单击触发
css: [
@ -55,4 +55,4 @@ layui.use(function(){
});
});
</script>
</script>

View File

@ -9,7 +9,7 @@ layui.use(function(){
// 渲染
table.render({
elem: '#ID-table-demo-filter',
url:'/static/2.8/json/table/user.json', // 此处为静态模拟数据,实际使用时需换成真实接口
url:'/static/json/2/table/user.json', // 此处为静态模拟数据,实际使用时需换成真实接口
toolbar: 'default',
height: 315,
cols: [function(){
@ -45,4 +45,4 @@ layui.use(function(){
}
});
});
</script>
</script>

View File

@ -11,7 +11,7 @@ layui.use(['table', 'dropdown', 'util'], function(){
table.render({
elem: '#ID-table-onrowContextmenu',
defaultContextmenu: false, // 是否在 table 行中允许默认的右键菜单
url: '/static/2.8/json/table/user.json', // 此处为静态模拟数据,实际使用时需换成真实接口
url: '/static/json/2/table/user.json', // 此处为静态模拟数据,实际使用时需换成真实接口
page: true,
cols: [[
{field:'id', title:'ID', width:80, fixed: 'left', unresize: true},
@ -53,4 +53,4 @@ layui.use(['table', 'dropdown', 'util'], function(){
obj.setRowChecked({selectedStyle: true}); // 标注行选中状态样式
});
});
</script>
</script>

View File

@ -14,7 +14,7 @@ layui.use('table', function(){
// 创建渲染实例
table.render({
elem: '#ID-table-demo-page',
url:'/static/2.8/json/table/user.json', // 此处为静态模拟数据,实际使用时需换成真实接口
url:'/static/json/2/table/user.json', // 此处为静态模拟数据,实际使用时需换成真实接口
page: { // 支持传入 laypage 组件的所有参数某些参数除外jump/elem - 详见文档
layout: ['limit', 'count', 'prev', 'page', 'next', 'skip'], //自定义分页布局
//curr: 5, //设定初始在第 5 页
@ -39,4 +39,4 @@ layui.use('table', function(){
layer.msg(eventValue);
});
});
</script>
</script>

View File

@ -1,4 +1,4 @@
> 假设这是一段数据源:<a href="/static/2.8/json/table/demo3.json" target="_blank">/static/2.8/json/table/demo3.json</a><br>
> 假设这是一段数据源:<a href="/static/json/2/table/demo3.json" target="_blank">/static/json/2/table/demo3.json</a><br>
尽管它并不符合 table 组件默认规定的数据格式([#详见](#options-async-data)),但可以通过 parseData 回调将其进行转换。
<table class="layui-hide" id="ID-table-demo-parse"></table>
@ -11,7 +11,7 @@ layui.use('table', function(){
// 渲染
table.render({
elem: '#ID-table-demo-parse',
url:'/static/2.8/json/table/demo3.json',
url:'/static/json/2/table/demo3.json',
page: true,
response: {
statusCode: 200 // 重新规定成功的状态码为 200table 组件默认为 0

View File

@ -38,7 +38,7 @@ layui.use(function(){
// 创建表格实例
table.render({
elem: '#ID-table-demo-search',
url: '/static/2.8/json/table/user.json', // 此处为静态模拟数据,实际使用时需换成真实接口
url: '/static/json/2/table/user.json', // 此处为静态模拟数据,实际使用时需换成真实接口
cols: [[
{type: 'radio', title: '😊', fixed: true}, // 单选框
{field:'id', title: 'ID', width:80, sort: true, fixed: true},
@ -74,4 +74,4 @@ layui.use(function(){
return false; // 阻止默认 form 跳转
});
});
</script>
</script>

View File

@ -13,7 +13,7 @@ layui.use('table', function(){
// 渲染
table.render({
elem: '#ID-table-demo-setRowChecked',
url: '/static/2.8/json/table/user.json', // 此处为静态模拟数据,实际使用时需换成真实接口
url: '/static/json/2/table/user.json', // 此处为静态模拟数据,实际使用时需换成真实接口
page: true,
cols: [[
// {type: 'radio', fixed: 'left'},
@ -58,4 +58,4 @@ layui.use('table', function(){
};
});
});
</script>
</script>

View File

@ -27,7 +27,7 @@ layui.use(['table'], function(){
// 创建渲染实例
table.render({
elem: '#ID-table-demo-templet',
url:'/static/2.8/json/table/user.json', // 此处为静态模拟数据,实际使用时需换成真实接口
url:'/static/json/2/table/user.json', // 此处为静态模拟数据,实际使用时需换成真实接口
page: true,
height: '315px',
cols: [[
@ -60,4 +60,4 @@ layui.use(['table'], function(){
});
});
</script>
</script>

View File

@ -1,6 +1,6 @@
常用两级表头:
<table class="layui-table" lay-data="{url:'/static/2.8/json/table/demo2.json?v=2', page: true, limit: 6, limits:[6]}" id="ID-table-demo-theads-1">
<table class="layui-table" lay-data="{url:'/static/json/2/table/demo2.json?v=2', page: true, limit: 6, limits:[6]}" id="ID-table-demo-theads-1">
<thead>
<tr>
<th lay-data="{checkbox:true}" rowspan="2"></th>
@ -19,7 +19,7 @@
更多级表头(支持无限极):
<table class="layui-table" lay-data="{url:'/static/2.8/json/table/demo2.json?v=3', cellMinWidth: 80, page: true}" id="ID-table-demo-theads-2">
<table class="layui-table" lay-data="{url:'/static/json/2/table/demo2.json?v=3', cellMinWidth: 80, page: true}" id="ID-table-demo-theads-2">
<thead>
<tr>
<th lay-data="{field:'username', fixed:'left', width:80}" rowspan="3">联系人</th>
@ -50,4 +50,4 @@
</div>
</script>
<!-- import layui -->
<!-- import layui -->

View File

@ -24,13 +24,13 @@ layui.use(function(){
// 渲染
var inst = treeTable.render({
elem: '#ID-treeTable-demo',
url: '/static/2.8/json/treeTable/demo-1.json', // 此处为静态模拟数据,实际使用时需换成真实接口
url: '/static/json/2/treeTable/demo-1.json', // 此处为静态模拟数据,实际使用时需换成真实接口
tree: {
/*
// 异步加载子节点
async: {
enable: true,
url: '/static/2.8/json/treeTable/demo-async.json', // 此处为静态模拟数据,实际使用时需换成真实接口
url: '/static/json/2/treeTable/demo-async.json', // 此处为静态模拟数据,实际使用时需换成真实接口
autoParam: ["parentId=id"]
}
*/
@ -117,4 +117,4 @@ layui.use(function(){
}
});
});
</script>
</script>

View File

@ -5,7 +5,7 @@ toc: true
# 更新日志
<h2 class="layui-hide" lay-toc="{href: '/docs/2.8/versions.html', title: '2.8.x', hot: true}">
<h2 class="layui-hide" lay-toc="{href: '/docs/2/versions.html', title: '2.8.x', hot: true}">
2.8.x
</h2>
@ -13,8 +13,8 @@ toc: true
<h2 id="2.8.18" class="ws-anchor">
2.8.18-rc.1
<span class="layui-badge-rim">2023-10-19</span>
2.8.18-rc.2
<span class="layui-badge-rim">2023-10-25</span>
</h2>
- #### form
@ -31,6 +31,7 @@ toc: true
- 新增 `complete` 属性,当数据接口请求完成后执行,无论成功还是失败均会触发 # 1379
- 修复 `ignoreExport` 表头属性值效果与文档不符的问题 # I86DBY
- #### treeTable
- 修复 `treeTable.removeNode()` 在开启 `data` 模式时删除异常问题 # I7Z0A/I82E2S
- 修复 `treeTable.setRowChecked()` 方法未逐层展开上级节点的问题 # 1385/I84RUT
- #### upload
- 修复 `unified: true` 时的报错问题 # 1391
@ -53,9 +54,11 @@ toc: true
- 优化 预览区域显示效果 # 1398
- 优化 其他若干小问题 # 1391
- #### 其他
- 新增 Source Maps 支持 # 1404/I89W5P
- 新增 lay 模块部分函数 JSDoc 注释和示例 #1401
- 优化 `<hr>` 全局样式优先级 # I86R6G
### 下载: [layui-v2.8.18.rc.1.zip](https://gitee.com/layui/layui/attach_files/1558085/download)
### 下载: [layui-v2.8.18.rc.2.zip](https://gitee.com/layui/layui/attach_files/1563717/download)
---
@ -488,7 +491,7 @@ toc: true
</h2>
`2.8.0-beta.1``rc.16`经二十个预览版的持续迭代Layui 终于迎来了:`2.8.0` 正式版。
<br>同时,新域名下的 [新文档站](https://layui.dev) 也正式上线(导读:[Layui 新版文档站上线初衷](./@note/2.8/news.html)),新版文档亦开源在 [Github](https://github.com/layui/layui/tree/main/docs) 以供协同维护。
<br>同时,新域名下的 [新文档站](https://layui.dev) 也正式上线(导读:[Layui 新版文档站上线初衷](/notes/2.8/news.html)),新版文档亦开源在 [Github](https://github.com/layui/layui/tree/main/docs) 以供协同维护。
正是开发者们依然坚持的热爱,促使了 `Layui` 这一朴实的归来。

View File

@ -154,25 +154,25 @@ body{padding:20px;}
<hr>
赤色分割线
<hr class="layui-bg-red">
<hr class="layui-border-red">
橙色分割线
<hr class="layui-bg-orange">
<hr class="layui-border-orange">
墨绿分割线
<hr class="layui-bg-green">
<hr class="layui-border-green">
青色分割线
<hr class="layui-bg-cyan">
<hr class="layui-border-cyan">
蓝色分割线
<hr class="layui-bg-blue">
<hr class="layui-border-blue">
黑色分割线
<hr class="layui-bg-black">
<hr class="layui-border-black">
灰色分割线
<hr class="layui-bg-gray">
<hr class="layui-border-gray">

View File

@ -127,103 +127,94 @@
<div class="demo-nav-tree">
<div class="layui-inline">
<ul class="layui-nav layui-nav-tree" lay-accordion lay-filter="test">
<li class="layui-nav-item">
<a class="" href="javascript:;">产品</a>
<a class="" href="javascript:;">菜单 1</a>
<dl class="layui-nav-child">
<dd><a href="javascript:;">移动模块</a></dd>
<dd>
<a href="javascript:;">后台模版</a>
<dl class="layui-nav-child">
<dd><a href="javascript:;">组件一</a></dd>
<dd>
<a href="javascript:;">组件二</a>
</dd>
<dd><a href="javascript:;">组件三</a></dd>
</dl>
</dd>
<dd><a href="javascript:;">电商平台</a></dd>
<dd><a href="">跳转菜单</a></dd>
<dd><a href="javascript:;">选项1</a></dd>
<dd><a href="javascript:;">选项2</a></dd>
<dd><a href="javascript:;">选项3</a></dd>
</dl>
</li>
<li class="layui-nav-item">
<a href="javascript:;">解决方案</a>
<a href="javascript:;">菜单 2</a>
<dl class="layui-nav-child">
<dd><a href="javascript:;">移动模块</a></dd>
<dd>
<a href="javascript:;">后台模版</a>
</dd>
<dd><a href="">电商平台</a></dd>
<dd><a href="javascript:;">选项1</a></dd>
<dd><a href="javascript:;">选项2</a></dd>
<dd><a href="javascript:;">选项3</a></dd>
</dl>
</li>
<li class="layui-nav-item"><a href="javascript:;">云市场</a></li>
<li class="layui-nav-item"><a href="">社区</a></li>
<li class="layui-nav-item">
<a href="javascript:;">菜单 3</a>
<dl class="layui-nav-child">
<dd><a href="javascript:;">选项1</a></dd>
<dd><a href="javascript:;">选项2</a></dd>
<dd><a href="javascript:;">选项3</a></dd>
</dl>
</li>
<li class="layui-nav-item"><a href="javascript:;">菜单 4</a></li>
<li class="layui-nav-item"><a href="javascript:;">菜单 5</a></li>
</ul>
</div>
<div class="layui-inline">
<ul class="layui-nav layui-nav-tree layui-bg-gray" lay-filter="test">
<ul class="layui-nav layui-nav-tree layui-bg-gray" lay-filter="test">
<li class="layui-nav-item">
<a class="" href="javascript:;">产品</a>
<a class="" href="javascript:;">菜单 1</a>
<dl class="layui-nav-child">
<dd><a href="javascript:;">移动模块</a></dd>
<dd>
<a href="javascript:;">后台模版</a>
<dl class="layui-nav-child">
<dd><a href="javascript:;">组件一</a></dd>
<dd>
<a href="javascript:;">组件二</a>
</dd>
<dd><a href="javascript:;">组件三</a></dd>
</dl>
</dd>
<dd><a href="javascript:;">电商平台</a></dd>
<dd><a href="">跳转菜单</a></dd>
<dd><a href="javascript:;">选项1</a></dd>
<dd><a href="javascript:;">选项2</a></dd>
<dd><a href="javascript:;">选项3</a></dd>
</dl>
</li>
<li class="layui-nav-item">
<a href="javascript:;">解决方案</a>
<a href="javascript:;">菜单 2</a>
<dl class="layui-nav-child">
<dd><a href="javascript:;">移动模块</a></dd>
<dd>
<a href="javascript:;">后台模版</a>
</dd>
<dd><a href="">电商平台</a></dd>
<dd><a href="javascript:;">选项1</a></dd>
<dd><a href="javascript:;">选项2</a></dd>
<dd><a href="javascript:;">选项3</a></dd>
</dl>
</li>
<li class="layui-nav-item"><a href="javascript:;">云市场</a></li>
<li class="layui-nav-item"><a href="">社区</a></li>
<li class="layui-nav-item">
<a href="javascript:;">菜单 3</a>
<dl class="layui-nav-child">
<dd><a href="javascript:;">选项1</a></dd>
<dd><a href="javascript:;">选项2</a></dd>
<dd><a href="javascript:;">选项3</a></dd>
</dl>
</li>
<li class="layui-nav-item"><a href="javascript:;">菜单 4</a></li>
<li class="layui-nav-item"><a href="javascript:;">菜单 5</a></li>
</ul>
</div>
<div class="layui-inline">
<ul class="layui-nav layui-bg-cyan layui-nav-tree" lay-filter="test">
<ul class="layui-nav layui-nav-tree layui-bg-black" lay-accordion lay-filter="test">
<li class="layui-nav-item layui-nav-itemed">
<a class="" href="javascript:;">产品</a>
<a class="" href="javascript:;">菜单 1</a>
<dl class="layui-nav-child">
<dd><a href="javascript:;">移动模块</a></dd>
<dd>
<a href="javascript:;">后台模版</a>
</dd>
<dd><a href="javascript:;">电商平台</a></dd>
<dd><a href="">跳转菜单</a></dd>
<dd><a href="javascript:;">选项1</a></dd>
<dd><a href="javascript:;">选项2</a></dd>
<dd><a href="javascript:;">选项3</a></dd>
</dl>
</li>
<li class="layui-nav-item">
<a href="javascript:;">解决方案</a>
<a href="javascript:;">菜单 2</a>
<dl class="layui-nav-child">
<dd><a href="javascript:;">移动模块</a></dd>
<dd><a href="javascript:;">后台模版</a></dd>
<dd><a href="">电商平台</a></dd>
<dd><a href="javascript:;">选项1</a></dd>
<dd><a href="javascript:;">选项2</a></dd>
<dd><a href="javascript:;">选项3</a></dd>
</dl>
</li>
<li class="layui-nav-item"><a href="">云市场</a></li>
<li class="layui-nav-item"><a href="">社区</a></li>
<li class="layui-nav-item">
<a href="javascript:;">菜单 3</a>
<dl class="layui-nav-child">
<dd><a href="javascript:;">选项1</a></dd>
<dd><a href="javascript:;">选项2</a></dd>
<dd><a href="javascript:;">选项3</a></dd>
</dl>
</li>
<li class="layui-nav-item"><a href="javascript:;">菜单 4</a></li>
<li class="layui-nav-item"><a href="javascript:;">菜单 5</a></li>
</ul>
</div>
</div>

View File

@ -26,7 +26,7 @@
<button class="layui-btn" lay-on="test9">Photo</button>
<button class="layui-btn" lay-on="test10">Drawer</button>
<button class="layui-btn" lay-on="testTime">自动关闭</button>
<a href="https://layui.dev/docs/2.8/layer/" target="_blank" class="layui-btn">更多例子</a>
<a href="https://layui.dev/docs/2/layer/" target="_blank" class="layui-btn">更多例子</a>
</div>
<div id="test11111" style="display: none; padding: 16px;">

View File

@ -1,5 +1,3 @@
'use strict';
const pkg = require('./package.json');
const gulp = require('gulp');
const uglify = require('gulp-uglify');
@ -9,6 +7,7 @@ const rename = require('gulp-rename');
const replace = require('gulp-replace');
const header = require('gulp-header');
const footer = require('gulp-footer');
const sourcemaps = require('gulp-sourcemaps');
const del = require('del');
const minimist = require('minimist');
const yargs = require('yargs');
@ -27,7 +26,7 @@ const config = {
// 获取参数
const argv = require('minimist')(process.argv.slice(2), {
default: {
version: pkg.version
version: pkg.version
}
});
@ -47,27 +46,32 @@ const js = () => {
let src = [
'./src/**/{layui,layui.all,'+ config.modules +'}.js'
];
return gulp.src(src).pipe(uglify({
return gulp.src(src)
.pipe(sourcemaps.init())
.pipe(uglify({
output: {
ascii_only: true // escape Unicode characters in strings and regexps
},
ie: true
})).pipe(concat('layui.js', {newLine: ''}))
}))
.pipe(concat('layui.js', {newLine: ''}))
.pipe(header.apply(null, config.comment))
.pipe(sourcemaps.write(''))
.pipe(gulp.dest(dest));
};
// css
const css = () => {
let src = [
'./src/css/layui.css',
'./src/css/modules/**/*.css',
'!./src/css/**/font.css'
'./src/css/**/{layui,*}.css'
];
return gulp.src(src).pipe(cleanCSS({
return gulp.src(src)
.pipe(sourcemaps.init())
.pipe(cleanCSS({
compatibility: 'ie8'
}))
.pipe(concat('layui.css', {newLine: ''}))
.pipe(sourcemaps.write(''))
.pipe(gulp.dest(dest +'/css'));
};
@ -80,7 +84,19 @@ const files = () => {
// cp
const cp = () => {
return gulp.src('./dist/**/*')
const basePath = './dist/**/*';
// 复制 css js
gulp.src(`${basePath}.{css,js}`)
.pipe(replace(/\n\/(\*|\/)\#[\s\S]+$/, '')) // 过滤 css 和 js 的 map 特定注释
.pipe(gulp.dest(dest));
// 复制其他文件
return gulp.src([
basePath,
`!${basePath}.{css,js,map}` // 过滤 map 文件
])
.pipe(replace(/\n\/(\*|\/)\#[\s\S]+$/, '')) // 过滤 css 和 js 的 map 特定注释
.pipe(gulp.dest(dest));
};

View File

@ -1,6 +1,6 @@
{
"name": "layui",
"version": "2.8.18-rc.1",
"version": "2.8.18-rc.2",
"description": "Classic modular Front-End UI library",
"main": "dist/layui.js",
"license": "MIT",
@ -19,6 +19,7 @@
"gulp-rename": "^2.0.0",
"gulp-header": "^2.0.9",
"gulp-footer": "^2.1.0",
"gulp-sourcemaps": "^3.0.0",
"del": "^2.2.2",
"minimist": "^1.2.8"
},

View File

@ -636,6 +636,15 @@ a cite{font-style: normal; *cursor:pointer;}
.layui-border-purple{border-width: 1px; border-style: solid; border-color: #a233c6!important; color: #a233c6!important;}
.layui-border-black{border-width: 1px; border-style: solid; border-color: #2f363c!important; color: #2f363c!important;}
/* 分割线边框 */
hr.layui-border-red,
hr.layui-border-orange,
hr.layui-border-green,
hr.layui-border-cyan,
hr.layui-border-blue,
hr.layui-border-purple,
hr.layui-border-black{border-width: 0 0 1px;}
/* 背景边框 */
.layui-timeline-item:before{background-color: #eee;}
@ -1276,7 +1285,6 @@ body .layui-table-tips .layui-layer-content{background: none; padding: 0; box-sh
.layui-nav .layui-nav-more{position: absolute; top: 0; right: 3px; left: auto !important; margin-top: 0; font-size: 12px; cursor: pointer; transition: all .2s; -webkit-transition: all .2s;}
.layui-nav .layui-nav-mored,
.layui-nav-expand > a .layui-nav-more,
.layui-nav-itemed > a .layui-nav-more{transform: rotate(180deg);}
@ -1324,12 +1332,9 @@ body .layui-table-tips .layui-layer-content{background: none; padding: 0; box-sh
/* 导航浅色背景 */
.layui-nav.layui-bg-gray .layui-nav-item a,
.layui-nav-tree.layui-bg-gray a{color: #373737; color: rgba(0,0,0,.8);}
.layui-nav-tree.layui-bg-gray{padding: 6px 0;}
.layui-nav-tree.layui-bg-gray .layui-nav-itemed>a{color: #000 !important;}
.layui-nav.layui-bg-gray .layui-this a{color: #16b777;}
.layui-nav-tree.layui-bg-gray .layui-nav-child{padding-left: 11px; background: none;}
.layui-nav-tree.layui-bg-gray .layui-nav-item>a{padding-top: 0; padding-bottom: 0;}
.layui-nav-tree.layui-bg-gray .layui-nav-item>a .layui-nav-more{padding: 0;}
.layui-nav-tree.layui-bg-gray .layui-this,
.layui-nav-tree.layui-bg-gray .layui-this>a,
.layui-nav-tree.layui-bg-gray .layui-nav-child dd.layui-this,

View File

@ -16,7 +16,7 @@
};
var Layui = function(){
this.v = '2.8.18-rc.1'; // Layui 版本号
this.v = '2.8.18-rc.2'; // Layui 版本号
};
// 识别预先可能定义的指定全局对象

View File

@ -273,45 +273,62 @@ layui.define('jquery', function(exports){
*/
// 点击菜单 - a 标签触发
,clickThis: function(){
,clickThis: function() {
var othis = $(this);
var parents = othis.parents(NAV_ELEM);
var parents = othis.closest(NAV_ELEM);
var filter = parents.attr('lay-filter');
var parent = othis.parent() ;
var child = othis.siblings('.'+NAV_CHILD);
var child = othis.siblings('.'+ NAV_CHILD);
var unselect = typeof parent.attr('lay-unselect') === 'string'; // 是否禁用选中
if(!(othis.attr('href') !== 'javascript:;' && othis.attr('target') === '_blank') && !unselect){
if(!child[0]){
parents.find('.'+THIS).removeClass(THIS);
// 满足点击选中的条件
if (!(othis.attr('href') !== 'javascript:;' && othis.attr('target') === '_blank') && !unselect) {
if (!child[0]) {
parents.find('.'+ THIS).removeClass(THIS);
parent.addClass(THIS);
}
}
// 若为垂直菜单
if (parents.hasClass(NAV_TREE)) {
var NAV_ITEMED = NAV_ITEM + 'ed';
var NAV_EXPAND = 'layui-nav-expand';
var needExpand = !(parent.hasClass(NAV_EXPAND) || parent.hasClass(NAV_ITEMED));
var NAV_ITEMED = NAV_ITEM + 'ed'; // 用于标注展开状态
var needExpand = !parent.hasClass(NAV_ITEMED); // 是否执行展开
var ANIM_MS = 200; // 动画过渡毫秒数
// 动画执行完成后的操作
var complete = function() {
$(this).css({
"display": "" // 剔除动画生成的 style display以适配外部样式的状态重置
});
// 避免导航滑块错位
parents.children('.'+ NAV_BAR).css({
opacity: 0
})
};
// 是否正处于动画中的状态
if (child.is(':animated')) return;
// 剔除可能存在的 CSS3 动画类
child.removeClass(NAV_ANIM);
// 若有子菜单,则展开
// 若有子菜单,则对其执行展开或收缩
if (child[0]) {
child.stop().slideToggle(200, function() {
needExpand || parent.removeClass(NAV_ITEMED);
});
parent[needExpand ? 'addClass': 'removeClass'](NAV_EXPAND);
// 手风琴
if(typeof parents.attr('lay-accordion') === 'string' || parents.attr('lay-shrink') === 'all'){
// 收缩兄弟项
parent.siblings().removeClass([
NAV_ITEMED,
NAV_EXPAND
].join(' ')).children('.'+NAV_CHILD).stop().slideUp(200);
if (needExpand) {
// 先执行 slideDown 动画,再标注展开状态样式,避免元素 `block` 状态导致动画无效
child.slideDown(ANIM_MS, complete);
parent.addClass(NAV_ITEMED);
} else {
// 先取消展开状态样式,再将元素临时显示,避免 `none` 状态导致 slideUp 动画无效
parent.removeClass(NAV_ITEMED);
child.show().slideUp(ANIM_MS, complete);
}
// 手风琴 --- 收缩兄弟展开项
if (typeof parents.attr('lay-accordion') === 'string' || parents.attr('lay-shrink') === 'all') {
var parentSibs = parent.siblings('.'+ NAV_ITEMED);
parentSibs.removeClass(NAV_ITEMED);
parentSibs.children('.'+ NAV_CHILD).show().stop().slideUp(ANIM_MS, complete);
}
}
}
@ -357,56 +374,65 @@ layui.define('jquery', function(exports){
call.tabAuto.call({});
}
//导航菜单
// 导航菜单
,nav: function(){
var TIME = 200, timer = {}, timerMore = {}, timeEnd = {}, NAV_TITLE = 'layui-nav-title'
var TIME = 200;
var timer = {};
var timerMore = {};
var timeEnd = {};
var NAV_TITLE = 'layui-nav-title';
//滑块跟随
,follow = function(bar, nav, index){
var othis = $(this), child = othis.find('.'+NAV_CHILD);
if(nav.hasClass(NAV_TREE)){
//无子菜单时跟随
if(!child[0]){
// 滑块跟随
var follow = function(bar, nav, index) {
var othis = $(this);
var child = othis.find('.'+NAV_CHILD);
// 是否垂直导航菜单
if (nav.hasClass(NAV_TREE)) {
// 无子菜单时跟随
if (!child[0]) {
var thisA = othis.children('.'+ NAV_TITLE);
bar.css({
top: othis.offset().top - nav.offset().top
,height: (thisA[0] ? thisA : othis).outerHeight()
,opacity: 1
top: othis.offset().top - nav.offset().top,
height: (thisA[0] ? thisA : othis).outerHeight(),
opacity: 1
});
}
} else {
child.addClass(NAV_ANIM);
//若居中对齐
if(child.hasClass(NAV_CHILD_C)) child.css({
left: -(child.outerWidth() - othis.width())/2
});
//滑块定位
if(child[0]){ //若有子菜单,则滑块消失
bar.css({
left: bar.position().left + bar.width()/2
,width: 0
,opacity: 0
});
} else { //bar 跟随
bar.css({
left: othis.position().left + parseFloat(othis.css('marginLeft'))
,top: othis.position().top + othis.height() - bar.height()
// 若居中对齐
if (child.hasClass(NAV_CHILD_C)) {
child.css({
left: -(child.outerWidth() - othis.width()) / 2
});
}
//渐显滑块并适配宽度
timer[index] = setTimeout(function(){
// 滑块定位
if (child[0]) { // 若有子菜单,则滑块消失
bar.css({
width: child[0] ? 0 : othis.width()
,opacity: child[0] ? 0 : 1
left: bar.position().left + bar.width() / 2,
width: 0,
opacity: 0
});
} else { // bar 跟随
bar.css({
left: othis.position().left + parseFloat(othis.css('marginLeft')),
top: othis.position().top + othis.height() - bar.height()
});
}
// 渐显滑块并适配宽度
timer[index] = setTimeout(function() {
bar.css({
width: child[0] ? 0 : othis.width(),
opacity: child[0] ? 0 : 1
});
}, device.ie && device.ie < 10 ? 0 : TIME);
//显示子菜单
// 显示子菜单
clearTimeout(timeEnd[index]);
if(child.css('display') === 'block'){
if (child.css('display') === 'block') {
clearTimeout(timerMore[index]);
}
timerMore[index] = setTimeout(function(){
@ -416,61 +442,64 @@ layui.define('jquery', function(exports){
}
};
//遍历导航
$(NAV_ELEM + elemFilter).each(function(index){
var othis = $(this)
,bar = $('<span class="'+ NAV_BAR +'"></span>')
,itemElem = othis.find('.'+NAV_ITEM);
// 遍历导航
$(NAV_ELEM + elemFilter).each(function(index) {
var othis = $(this);
var bar = $('<span class="'+ NAV_BAR +'"></span>');
var itemElem = othis.find('.'+NAV_ITEM);
//hover 滑动效果
if(!othis.find('.'+NAV_BAR)[0]){
// hover 滑动效果
if (!othis.find('.'+NAV_BAR)[0]) {
othis.append(bar);
(othis.hasClass(NAV_TREE)
( othis.hasClass(NAV_TREE)
? itemElem.find('dd,>.'+ NAV_TITLE)
: itemElem).on('mouseenter', function(){
: itemElem
).on('mouseenter', function() {
follow.call(this, bar, othis, index);
}).on('mouseleave', function(){ //鼠标移出
//是否为垂直导航
if(othis.hasClass(NAV_TREE)){
}).on('mouseleave', function() { // 鼠标移出
// 是否为垂直导航
if (othis.hasClass(NAV_TREE)) {
bar.css({
height: 0
,opacity: 0
height: 0,
opacity: 0
});
} else {
//隐藏子菜单
// 隐藏子菜单
clearTimeout(timerMore[index]);
timerMore[index] = setTimeout(function(){
othis.find('.'+NAV_CHILD).removeClass(SHOW);
othis.find('.'+NAV_MORE).removeClass(NAV_MORE+'d');
othis.find('.'+ NAV_CHILD).removeClass(SHOW);
othis.find('.'+ NAV_MORE).removeClass(NAV_MORE +'d');
}, 300);
}
});
othis.on('mouseleave', function(){
// 鼠标离开当前菜单时
othis.on('mouseleave', function() {
clearTimeout(timer[index])
timeEnd[index] = setTimeout(function(){
if(!othis.hasClass(NAV_TREE)){
timeEnd[index] = setTimeout(function() {
if (!othis.hasClass(NAV_TREE)) {
bar.css({
width: 0
,left: bar.position().left + bar.width()/2
,opacity: 0
width: 0,
left: bar.position().left + bar.width() / 2,
opacity: 0
});
}
}, TIME);
});
}
//展开子菜单
itemElem.find('a').each(function(){
var thisA = $(this)
,parent = thisA.parent()
,child = thisA.siblings('.'+NAV_CHILD);
// 展开子菜单
itemElem.find('a').each(function() {
var thisA = $(this);
var parent = thisA.parent();
var child = thisA.siblings('.'+ NAV_CHILD);
//输出小箭头
if(child[0] && !thisA.children('.'+NAV_MORE)[0]){
// 输出小箭头
if (child[0] && !thisA.children('.'+ NAV_MORE)[0]) {
thisA.append('<i class="layui-icon '+ NAV_DOWN +' '+ NAV_MORE +'"></i>');
}
thisA.off('click', call.clickThis).on('click', call.clickThis); //点击菜单
thisA.off('click', call.clickThis).on('click', call.clickThis); // 点击菜单
});
});
}

View File

@ -7,7 +7,10 @@
var MOD_NAME = 'lay'; // 模块名
var document = window.document;
// 元素查找
/**
* 元素查找
* @param {string | HTMLElement | JQuery} selector
*/
var lay = function(selector){
return new Class(selector);
};
@ -49,8 +52,15 @@
Class.fn = Class.prototype = [];
Class.fn.constructor = Class;
// 普通对象深度扩展
/**
* 将两个或多个对象的内容深度合并到第一个对象中
* @callback ExtendFunc
* @param {*} target - 一个对象
* @param {...*} objectN - 包含额外的属性合并到第一个参数
* @returns {*} 返回合并后的对象
*/
/** @type ExtendFunc*/
lay.extend = function(){
var ai = 1;
var length;
@ -77,7 +87,10 @@
return args[0];
};
// ie 版本
/**
* IE 版本
* @type {string | boolean} - 如果是 IE 返回版本字符串否则返回 false
*/
lay.ie = function(){
var agent = navigator.userAgent.toLowerCase();
return (!!window.ActiveXObject || "ActiveXObject" in window) ? (
@ -98,8 +111,18 @@
return this;
};
// 数字前置补零
/**
* 数字前置补零
* @param {number | string} num - 原始数字
* @param {number} [length=2] - 数字长度如果原始数字长度小于 length则前面补零
* @returns {string} 返回补 0 后的数字
* @example
* ```js
* lay.digit(6, 2); // "06"
* lay.digit('7', 3); // "007"
* ```
*/
lay.digit = function(num, length){
if(!(typeof num === 'string' || typeof num === 'number')) return '';
@ -112,7 +135,16 @@
return num < Math.pow(10, length) ? str + num : num;
};
// 创建元素
/**
* 创建元素
* @param {string} elemName - 元素的标签名
* @param {{attrName: string, attrValue:string}} [attr] - 添加到元素上的属性
* @returns {HTMLElement} 返回创建的 HTML 元素
* @example
* ```js
* lay.elem('div', {id: 'test'}) // <div id="test"></div>
* ```
*/
lay.elem = function(elemName, attr){
var elem = document.createElement(elemName);
lay.each(attr || {}, function(key, value){
@ -121,12 +153,43 @@
return elem;
};
// 当前页面是否存在滚动条
/**
* 当前页面是否存在滚动条
* @returns {boolean} 是否存在滚动条
* @example
* ```
* lay.hasScrollbar() // true 或 false
* ```
*/
lay.hasScrollbar = function(){
return document.body.scrollHeight > (window.innerHeight || document.documentElement.clientHeight);
};
// 获取 style rules
/**
* 获取 style rules
* @param {HTMLStyleElement} style - HTMLStyle 元素
* @param {(ruleItem: CSSStyleRule, index: number) => boolean} [callback] - 用来返回 style 元素中的每个 `style rule` 的函数返回 true 终止遍历
* @returns {CSSRuleList } 返回 `style rules`
* @example
* ```
* <style id="test">
* .lay-card{
* color: #000;
* }
* .lay-btn-success{
* color: green;
* }
* </style>
*
* lay.getStyleRules($('#test')[0], function(rule, index){
* if(rule.selectorText === '.lay-card'){
* console.log(index, rule.cssText) // 0 '.lay-card{color: #000}'
* rule.style.color = '#EEE';
* return true; // 终止遍历
* }
* }) // RuleList
* ```
*/
lay.getStyleRules = function(style, callback) {
if (!style) return;
@ -142,7 +205,26 @@
return rules;
};
// 创建 style 样式
/**
* 创建 style 样式
* @param {Object} options - 可配置的选项
* @param {string | HTMLElement | JQuery} [options.target] - 目标容器指定后会将样式追加到目标容器
* @param {string} [options.id] - 样式元素的 id默认自增
* @param {string} options.text - 样式内容
* @returns {HTMLStyleElement} 返回创建的样式元素
* @example
* ```html
* <div id="targetEl">
* <!-- 样式追加到目标容器 -->
* <style id="LAY-STYLE-DF-0">.card{color: #000}</style>
* </div>
*
* lay.style({
* target: '#targetEl',
* text: '.card{color: #000}'
* }) // <style id="LAY-STYLE-DF-0">.card{color: #000}</style>
* ```
*/
lay.style = function(options){
options = options || {};
@ -176,7 +258,37 @@
return style;
};
// 元素定位
/**
* 将元素定位到指定目标元素附近
* @param {HTMLElement} target - 目标元素
* @param {HTMLElement} elem - 定位元素
* @param {Object} [opts] - 可配置的选项
* @param {'absolute' | 'fixed'} [opts.position] - 元素的定位类型
* @param {'left' | 'right'} [opts.clickType="left"] - 点击类型默认为 'left'如果 {@link target} document body 元素则为 'right'
* @param {'left' | 'right' | 'center'} [opts.align="left"] - 对齐方式
* @param {boolean} [opts.allowBottomOut=false] - 顶部没有足够区域显示时是否允许底部溢出
* @param {string | number} [opts.margin=5] - 边距
* @param {Event} [opts.e] - 事件对象仅右键生效
* @param {boolean} [opts.SYSTEM_RELOAD] - 是否重载用于出现滚动条时重新计算位置
* @example
* ```js
* <button id="targetEl">dropdown</button>
* <ul id="contentEl" class="dropdown-menu">
* <li>菜单1</li>
* <li>菜单2</li>
* </ul>
*
* // 下拉菜单将被定位到按钮附近
* lay.position(
* $('#targetEl')[0],
* $('#contentEl')[0],
* {
* position: 'fixed',
* align: 'center'
* }
* )
* ```
*/
lay.position = function(target, elem, opts){
if(!elem) return;
opts = opts || {};
@ -276,7 +388,25 @@
}
};
// 获取元素上的属性配置项
/**
* 获取元素上的属性配置项
* @param {string | HTMLElement | JQuery} elem - HTML 元素
* @param {{attr: string} | string} [opts="lay-options"] - 可配置的选项string 类型指定属性名
* @returns {*} 返回元素上的属性配置项
* @example
* ```js
* <div id="testEl" lay-options="{color:red}" lay-toc="{hot: true}"></div>
*
* var elem = $('#testEl')
* lay.options(elem) // {color:red}
* lay.options(elem[0]) // {color:red}
* lay.options('#testEl') // {color:red}
* lay.options('#testEl', {attr: 'lay-toc'}) // {hot: true}
* lay.options('#testEl', 'lay-toc') // {hot: true}
*
* $('#testEl').attr('lay-toc') // '{hot: true}'
* ```
*/
lay.options = function(elem, opts){
opts = typeof opts === 'object' ? opts : {attr: opts};
@ -297,7 +427,16 @@
}
};
// 元素是否属于顶级元素document 或 body
/**
* 元素是否属于顶级元素document body
* @param {HTMLElement} elem - HTML 元素
* @returns {boolean} 是否属于顶级元素
* @example
* ```js
* lay.isTopElem(document) // true
* ```
*/
lay.isTopElem = function(elem){
var topElems = [document, lay('body')[0]]
,matched = false;
@ -311,7 +450,21 @@
// 剪切板
lay.clipboard = {
// 写入文本
/**
* 写入文本
* @param {Object} options - 可配置的选项
* @param {string} options.text - 写入剪贴板的文本
* @param {() => void} [options.done] - 写入成功/完成回调
* @param {(err?: any) => void} [options.error] - 写入失败回调
* @example
* ```js
* lay.clipboard.writeText({
* text: '测试文本',
* done: function(){ layer.msg('copied')},
* error: function(){ layer.msg('error')}
* })
* ```
*/
writeText: function(options) {
var text = String(options.text);

View File

@ -421,45 +421,48 @@ layui.define(['table'], function (exports) {
return;
}
// 用index
// 用 index
return that.getNodeByIndex(dataIndex);
}
// 通过index获取节点数据
// 通过 index 获取节点数据
Class.prototype.getNodeDataByIndex = function (index, clone, newValue) {
var that = this;
var options = that.getOptions();
var treeOptions = options.tree;
var tableId = options.id;
var tableCache = table.cache[tableId];
var dataCache = table.cache[tableId][index];
// 获取当前行中的数据
var dataCache = tableCache[index];
// 若非删除操作,则返回合并后的数据
if (newValue !== 'delete' && dataCache) {
$.extend(dataCache, newValue);
return clone ? $.extend({}, dataCache) : dataCache;
}
var tableData = that.getTableData();
index += '';
var indexArr = index.split('-');
// 删除操作
var dataRet = tableCache;
var indexArr = String(index).split('-');
var dataRet = tableData;
var tableCache = (options.url || indexArr.length > 1) ? null : table.cache[tableId]; // 只有在删除根节点的时候才需要处理
// if (options.url || indexArr.length > 1) tableCache = null // 只有在删除根节点的时候才需要处理
// 根据 index 进行数据处理
for (var i = 0, childrenKey = treeOptions.customName.children; i < indexArr.length; i++) {
if (newValue && i === indexArr.length - 1) {
if (newValue === 'delete') {
// 删除
if (tableCache) {
// 同步cache
if (newValue === 'delete') { // 删除并返回当前数据
// 同步 cache --- 此段代码注释缘由data 属性模式造成数据重复执行 splice (@Gitee: #I7Z0A/I82E2S)
/*if (tableCache) {
layui.each(tableCache, function (i1, item1) {
if (item1[LAY_DATA_INDEX] === index) {
tableCache.splice(i1, 1);
return true;
}
})
}
}*/
return (i ? dataRet[childrenKey] : dataRet).splice(indexArr[i], 1)[0];
} else {
// 更新值
} else { // 更新值
$.extend((i ? dataRet[childrenKey] : dataRet)[indexArr[i]], newValue);
}
}