release v2.8.18-rc.3

release v2.8.18-rc.3
pull/1440/head v2.8.18-rc.3
贤心 2023-10-31 09:15:15 +08:00 committed by GitHub
commit 7d5d8ce8bc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 86 additions and 44 deletions

2
dist/css/layui.css vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2
dist/layui.js vendored

File diff suppressed because one or more lines are too long

2
dist/layui.js.map vendored

File diff suppressed because one or more lines are too long

View File

@ -5,8 +5,8 @@ toc: true
# 树表组件 <sup title="指在该版本新增的组件">2.8+</sup>
> 树表组件 `treeTable` 是基于 `table` 组件延伸的树形表格组件,支持常见的树组件功能。
> 注意:*该组件不支持 IE8*
> 树表组件 `treeTable` 是基于 `table` 组件延伸的树形表格组件,支持常见的树组件功能。<br>
> 注意:*该组件不支持 IE8,若要支持,可自行添加 <a href="https://github.com/inexorabletash/polyfill/blob/716a3f36ca10fad032083014faf1a47c638e2502/es5.js#L300-L345" rel="nofollow" target="_blank">polyfill</a>实现兼容。*
<h2 id="examples" lay-toc="{anchor: null}" style="margin-bottom: 0;">示例</h2>

View File

@ -13,8 +13,8 @@ toc: true
<h2 id="2.8.18" class="ws-anchor">
2.8.18-rc.2
<span class="layui-badge-rim">2023-10-25</span>
2.8.18-rc.3
<span class="layui-badge-rim">2023-10-31</span>
</h2>
- #### form
@ -23,15 +23,17 @@ toc: true
- 优化 `input` 数字输入框组件当值达到临界点时加减按钮的禁用视觉效果 # 1375
- 优化 `input` 数字输入框当表单验证失败时的边框颜色 # 1371
- #### nav
- 新增 垂直导航菜单展开和收缩时的过渡动画 # 1384
- 新增 垂直导航菜单展开和收缩时的过渡动画 # 1407
- 新增 `lay-accordion` 属性支持,用于开启手风琴,兼容旧版 `lay-shrink="all"` # 1384
- #### layer
- 新增 `photos` 层的鼠标滚轮缩放功能 # I7ZAE8
- 优化 移动端定位 # 1376
- #### table
- 新增 `complete` 属性,当数据接口请求完成后执行,无论成功还是失败均会触发 # 1379
- 修复 `ignoreExport` 表头属性值效果与文档不符的问题 # I86DBY
- 修复 `type:'radio'` 且为右侧固定列时,选择效果无效的问题 # 1406
- #### treeTable
- 修复 `treeTable.removeNode()` 在开启 `data` 模式时删除异常问题 # I7Z0A/I82E2S
- 修复 `treeTable.removeNode()` 在开启 `data` 模式时删除异常问题 # I7Z0AB/I82E2S
- 修复 `treeTable.setRowChecked()` 方法未逐层展开上级节点的问题 # 1385/I84RUT
- #### upload
- 修复 `unified: true` 时的报错问题 # 1391
@ -41,7 +43,8 @@ toc: true
- 新增 `accordion` 属性开启手风琴效果menu: 主容器设置 `lay-accordion` 属性) # 1397
- 新增 折叠展开动画效果 # 1397
- #### laydate
- 优化 开启 `rangeLinked` 属性后,点击目标元素可重新渲染的问题 # 1391
- 优化 `rangeLinked` 属性开启时,点击目标元素可重新渲染的问题 # 1391
- 优化 `type``time,datetime` 选择器时,「现在」按钮的禁用状态判断条件 # I828CD
- #### laypage
- 新增 `limitTemplet` 属性,用于自定义条目模板 # I80AHZ
- 新增 `skipText` 属性,用于自定义跳页区域文本 # I80AHZ
@ -58,7 +61,7 @@ toc: true
- 新增 lay 模块部分函数 JSDoc 注释和示例 #1401
- 优化 `<hr>` 全局样式优先级 # I86R6G
### 下载: [layui-v2.8.18.rc.2.zip](https://gitee.com/layui/layui/attach_files/1563717/download)
### 下载: [layui-v2.8.18.rc.3.zip](https://gitee.com/layui/layui/attach_files/1569050/download)
---

View File

@ -1,6 +1,6 @@
{
"name": "layui",
"version": "2.8.18-rc.2",
"version": "2.8.18-rc.3",
"description": "Classic modular Front-End UI library",
"main": "dist/layui.js",
"license": "MIT",

View File

@ -834,6 +834,7 @@ hr.layui-border-black{border-width: 0 0 1px;}
.layui-input-wrap .layui-input[type="number"]::-webkit-outer-spin-button,
.layui-input-wrap .layui-input[type="number"]::-webkit-inner-spin-button{-webkit-appearance: none !important;}
.layui-input-wrap .layui-input[type="number"]{-moz-appearance: textfield;}
.layui-input-wrap .layui-input[type="number"].layui-input-number-out-of-range{color:#ff5722;}

View File

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

View File

@ -444,31 +444,33 @@ layui.define(['jquery', 'laytpl', 'lay', 'util'], function(exports){
// 设置菜单组展开和收缩状态
thisModule.spread = function(othis, isAccordion){
var contentElem = othis.children('ul');
var needSpread = othis.hasClass(STR_ITEM_UP);
var ANIM_MS = 200;
var toggle = function (groupElem, isOpen) {
var contentElem = groupElem.children('ul');
var contentHeight = contentElem[0].scrollHeight;
// 动画执行完成后的操作
var complete = function() {
$(this).css({'display': ''}); // 剔除临时 style以适配外部样式的状态重置;
};
if(contentElem.is(':animated')) return;
// 动画是否正在执行
if (contentElem.is(':animated')) return;
groupElem.removeClass(isOpen ? STR_ITEM_UP : STR_ITEM_DOWN).addClass(isOpen ? STR_ITEM_DOWN : STR_ITEM_UP);
contentElem.height(isOpen ? 0 : contentHeight)
.stop()
.animate({
opacity: isOpen ? 1 : 0,
height: isOpen ? contentHeight : 0
}, 200, function(){
contentElem.css({ height: '', opacity: '' })
})
// 展开
if (needSpread) {
othis.removeClass(STR_ITEM_UP).addClass(STR_ITEM_DOWN);
contentElem.hide().stop().slideDown(ANIM_MS, complete);
} else { // 收缩
contentElem.stop().slideUp(ANIM_MS, complete);
othis.removeClass(STR_ITEM_DOWN).addClass(STR_ITEM_UP);
}
toggle(othis, needSpread);
if (!needSpread || !isAccordion) return;
layui.each(othis.siblings('.' + STR_ITEM_DOWN), function(index, item){
toggle($(item), false);
})
// 手风琴
if (needSpread && isAccordion) {
var groupSibs = othis.siblings('.' + STR_ITEM_DOWN);
groupSibs.children('ul').stop().slideUp(ANIM_MS, complete);
groupSibs.removeClass(STR_ITEM_DOWN).addClass(STR_ITEM_UP);
}
};
// 全局事件

View File

@ -17,6 +17,7 @@ layui.define(['lay', 'layer', 'util'], function(exports){
var SHOW = 'layui-show';
var HIDE = 'layui-hide';
var DISABLED = 'layui-disabled';
var OUT_OF_RANGE = 'layui-input-number-out-of-range';
var Form = function(){
this.config = {
@ -174,7 +175,7 @@ layui.define(['lay', 'layer', 'util'], function(exports){
// 初始化全局的 autocomplete
options.autocomplete && inputs.attr('autocomplete', options.autocomplete);
var handleInputNumberEvents = function(elem, eventType){
var handleInputNumber = function(elem, eventType){
var that = this;
var rawValue = elem.val();
var value = Number(rawValue);
@ -182,7 +183,8 @@ layui.define(['lay', 'layer', 'util'], function(exports){
var min = Number(elem.attr('min'));
var max = Number(elem.attr('max'));
var precision = Number(elem.attr('lay-precision'));
var noAction = eventType === 'blur' && rawValue === '' // 失焦时空值不作处理
var noAction = eventType !== 'click' && rawValue === ''; // 初始渲染和失焦时空值不作处理
var isInit = eventType === 'init';
if(isNaN(value)) return; // 若非数字,则不作处理
@ -200,13 +202,21 @@ layui.define(['lay', 'layer', 'util'], function(exports){
precision = precision >= 0 ? precision : Math.max(decimals(step), decimals(rawValue));
if(!noAction){
if(value <= min) value = min;
if(value >= max) value = max;
// 初始渲染时只处理数字精度
if(!isInit){
if(value <= min) value = min;
if(value >= max) value = max;
}
if(precision) value = value.toFixed(precision);
elem.val(value)
elem.val(value);
}
// 超出范围的样式
var outOfRange = value < min || value > max;
elem[outOfRange && !noAction ? 'addClass' : 'removeClass'](OUT_OF_RANGE);
if(isInit) return;
// 更新按钮状态
var controlBtn = {
increment: elem.next().find('.layui-icon-up'),
@ -285,6 +295,8 @@ layui.define(['lay', 'layer', 'util'], function(exports){
opts.show === 'auto' && showAffix(elemAffix, othis.val());
typeof opts.init === 'function' && opts.init.call(this, othis, opts);
// 输入事件
othis.on('input propertychange', function(){
var value = this.value;
@ -341,11 +353,14 @@ layui.define(['lay', 'layer', 'util'], function(exports){
split: true,
className: 'layui-input-number',
disabled: othis.is('[disabled]'), // 跟随输入框禁用状态
init: function(elem){
handleInputNumber.call(this, elem, 'init')
},
click: function(elem){
handleInputNumberEvents.call(this, elem, 'click')
handleInputNumber.call(this, elem, 'click')
},
blur: function(elem){
handleInputNumberEvents.call(this, elem, 'blur')
handleInputNumber.call(this, elem, 'blur')
},
}
};

View File

@ -1245,7 +1245,7 @@
// 现在按钮
that.limit({
elem: lay(that.footer).find(ELEM_NOW),
date: that.systemDate(),
date: that.systemDate(/^(datetime|time)$/.test(options.type) ? new Date() : null),
index: 0,
time: timeParams
});

View File

@ -1531,11 +1531,13 @@ layer.photos = function(options, loop, key){
// 一些动作
dict.event = function(layero, index, that){
// 上一张
dict.main.find('.layui-layer-photos-prev').on('click', function(event){
event.preventDefault();
dict.imgprev(true);
});
// 下一张
dict.main.find('.layui-layer-photos-next').on('click', function(event){
event.preventDefault();
dict.imgnext(true);
@ -1545,7 +1547,8 @@ layer.photos = function(options, loop, key){
// 头部工具栏事件
layero.off('click').on('click','*[toolbar-event]', function () {
var othis = $(this), event = othis.attr('toolbar-event');
var othis = $(this);
var event = othis.attr('toolbar-event');
switch (event) {
case 'rotate':
dict.image.rotate = ((dict.image.rotate || 0) + Number(othis.attr('data-option'))) % 360;
@ -1586,6 +1589,17 @@ layer.photos = function(options, loop, key){
that.auto(index);
});
// 鼠标滚轮缩放图片事件
dict.main.children('img').on('mousewheel DOMMouseScroll', function(e) {
var delta = e.originalEvent.wheelDelta || -e.originalEvent.detail;
var zoomElem = dict.main.find('[toolbar-event="zoom"]');
if (delta > 0) {
zoomElem.eq(0).trigger('click');
} else {
zoomElem.eq(1).trigger('click');
}
});
};
// 图片预加载

View File

@ -896,6 +896,9 @@ layui.define(['lay', 'laytpl', 'laypage', 'form', 'util'], function(exports){
// 重置表格尺寸/结构
Class.prototype.resize = function(){
var that = this;
if (!that.layMain) return;
that.fullSize(); // 让表格铺满
that.setColsWidth(); // 自适应列宽
that.scrollPatch(); // 滚动条补丁
@ -1593,8 +1596,12 @@ layui.define(['lay', 'laytpl', 'laypage', 'form', 'util'], function(exports){
radio: 'layTableRadio',
checkbox: 'layTableCheckbox'
}[opts.type] || 'checkbox') +'"]:not(:disabled)');
var checkedSameElem = checkedElem.last();
var fixRElem = checkedSameElem.closest(ELEM_FIXR);
checkedElem.prop('checked', getChecked(checkedElem.last().prop('checked')));
( opts.type === 'radio' && fixRElem.hasClass(HIDE)
? checkedElem.first()
: checkedElem ).prop('checked', getChecked(checkedSameElem.prop('checked')));
that.syncCheckAll();
that.renderForm(opts.type);