mirror of https://github.com/layui/layui
fix(layer): 修复 iframe 高度较大时,使用 layer.iframeAuto 可能导致 layer 顶部超出浏览器的问题 (#2839)
* fix(layer): 修复 layer.iframeAuto 在某些情况可能会超出浏览器的问题 * update code * docs(layer): 更新文档示例 * update --------- Co-authored-by: 贤心 <3277200+sentsim@users.noreply.github.com>main
parent
58dccaada4
commit
3940c45654
|
@ -22,7 +22,7 @@ layui.use(function(){
|
||||||
type: 2,
|
type: 2,
|
||||||
area: ['680px', '520px'],
|
area: ['680px', '520px'],
|
||||||
content: '/layer/test/iframe.html',
|
content: '/layer/test/iframe.html',
|
||||||
fixed: false, // 不固定
|
// fixed: false, // 不固定
|
||||||
maxmin: true,
|
maxmin: true,
|
||||||
shadeClose: true,
|
shadeClose: true,
|
||||||
btn: ['获取表单值', '取消'],
|
btn: ['获取表单值', '取消'],
|
||||||
|
|
|
@ -667,64 +667,10 @@ Class.pt.auto = function(index){
|
||||||
// 计算坐标
|
// 计算坐标
|
||||||
Class.pt.offset = function(){
|
Class.pt.offset = function(){
|
||||||
var that = this, config = that.config, layero = that.layero;
|
var that = this, config = that.config, layero = that.layero;
|
||||||
var area = [layero.outerWidth(), layero.outerHeight()];
|
var coords = ready.updatePosition(layero, config);
|
||||||
var type = typeof config.offset === 'object';
|
|
||||||
that.offsetTop = (win.height() - area[1])/2;
|
|
||||||
that.offsetLeft = (win.width() - area[0])/2;
|
|
||||||
|
|
||||||
if(type){
|
that.offsetTop = coords.offsetTop;
|
||||||
that.offsetTop = config.offset[0];
|
that.offsetLeft = coords.offsetLeft;
|
||||||
that.offsetLeft = config.offset[1]||that.offsetLeft;
|
|
||||||
} else if(config.offset !== 'auto'){
|
|
||||||
|
|
||||||
if(config.offset === 't'){ // 上
|
|
||||||
that.offsetTop = 0;
|
|
||||||
} else if(config.offset === 'r'){ // 右
|
|
||||||
that.offsetLeft = win.width() - area[0];
|
|
||||||
} else if(config.offset === 'b'){ // 下
|
|
||||||
that.offsetTop = win.height() - area[1];
|
|
||||||
} else if(config.offset === 'l'){ // 左
|
|
||||||
that.offsetLeft = 0;
|
|
||||||
} else if(config.offset === 'lt'){ // 左上
|
|
||||||
that.offsetTop = 0;
|
|
||||||
that.offsetLeft = 0;
|
|
||||||
} else if(config.offset === 'lb'){ // 左下
|
|
||||||
that.offsetTop = win.height() - area[1];
|
|
||||||
that.offsetLeft = 0;
|
|
||||||
} else if(config.offset === 'rt'){ // 右上
|
|
||||||
that.offsetTop = 0;
|
|
||||||
that.offsetLeft = win.width() - area[0];
|
|
||||||
} else if(config.offset === 'rb'){ // 右下
|
|
||||||
that.offsetTop = win.height() - area[1];
|
|
||||||
that.offsetLeft = win.width() - area[0];
|
|
||||||
} else {
|
|
||||||
that.offsetTop = config.offset;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!config.fixed){
|
|
||||||
that.offsetTop = /%$/.test(that.offsetTop) ?
|
|
||||||
win.height()*parseFloat(that.offsetTop)/100
|
|
||||||
: parseFloat(that.offsetTop);
|
|
||||||
that.offsetLeft = /%$/.test(that.offsetLeft) ?
|
|
||||||
win.width()*parseFloat(that.offsetLeft)/100
|
|
||||||
: parseFloat(that.offsetLeft);
|
|
||||||
that.offsetTop += win.scrollTop();
|
|
||||||
that.offsetLeft += win.scrollLeft();
|
|
||||||
}
|
|
||||||
|
|
||||||
// 最小化窗口时的自适应
|
|
||||||
if(layero.data('maxminStatus') === 'min'){
|
|
||||||
that.offsetTop = win.height() - (layero.find(doms[1]).outerHeight() || 0);
|
|
||||||
that.offsetLeft = layero.css('left');
|
|
||||||
}
|
|
||||||
|
|
||||||
// 设置坐标
|
|
||||||
layero.css({
|
|
||||||
top: that.offsetTop,
|
|
||||||
left: that.offsetLeft
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Tips
|
// Tips
|
||||||
|
@ -1121,6 +1067,70 @@ ready.promiseLikeResolve = function(value){
|
||||||
return deferred.promise();
|
return deferred.promise();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ready.updatePosition = function(layero, config){
|
||||||
|
var area = [layero.outerWidth(), layero.outerHeight()];
|
||||||
|
var coords = {
|
||||||
|
offsetTop: (win.height() - area[1])/2,
|
||||||
|
offsetLeft: (win.width() - area[0])/2
|
||||||
|
};
|
||||||
|
|
||||||
|
if(typeof config.offset === 'object'){
|
||||||
|
coords.offsetTop = config.offset[0];
|
||||||
|
coords.offsetLeft = config.offset[1] || coords.offsetLeft;
|
||||||
|
} else if(config.offset !== 'auto'){
|
||||||
|
|
||||||
|
if(config.offset === 't'){ // 上
|
||||||
|
coords.offsetTop = 0;
|
||||||
|
} else if(config.offset === 'r'){ // 右
|
||||||
|
coords.offsetLeft = win.width() - area[0];
|
||||||
|
} else if(config.offset === 'b'){ // 下
|
||||||
|
coords.offsetTop = win.height() - area[1];
|
||||||
|
} else if(config.offset === 'l'){ // 左
|
||||||
|
coords.offsetLeft = 0;
|
||||||
|
} else if(config.offset === 'lt'){ // 左上
|
||||||
|
coords.offsetTop = 0;
|
||||||
|
coords.offsetLeft = 0;
|
||||||
|
} else if(config.offset === 'lb'){ // 左下
|
||||||
|
coords.offsetTop = win.height() - area[1];
|
||||||
|
coords.offsetLeft = 0;
|
||||||
|
} else if(config.offset === 'rt'){ // 右上
|
||||||
|
coords.offsetTop = 0;
|
||||||
|
coords.offsetLeft = win.width() - area[0];
|
||||||
|
} else if(config.offset === 'rb'){ // 右下
|
||||||
|
coords.offsetTop = win.height() - area[1];
|
||||||
|
coords.offsetLeft = win.width() - area[0];
|
||||||
|
} else {
|
||||||
|
coords.offsetTop = config.offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!config.fixed){
|
||||||
|
coords.offsetTop = /%$/.test(coords.offsetTop) ?
|
||||||
|
win.height()*parseFloat(coords.offsetTop)/100
|
||||||
|
: parseFloat(coords.offsetTop);
|
||||||
|
coords.offsetLeft = /%$/.test(coords.offsetLeft) ?
|
||||||
|
win.width()*parseFloat(coords.offsetLeft)/100
|
||||||
|
: parseFloat(coords.offsetLeft);
|
||||||
|
coords.offsetTop += win.scrollTop();
|
||||||
|
coords.offsetLeft += win.scrollLeft();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 最小化窗口时的自适应
|
||||||
|
if(layero.data('maxminStatus') === 'min'){
|
||||||
|
coords.offsetTop = win.height() - (layero.find(doms[1]).outerHeight() || 0);
|
||||||
|
coords.offsetLeft = layero.css('left');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置坐标
|
||||||
|
layero.css({
|
||||||
|
top: coords.offsetTop,
|
||||||
|
left: coords.offsetLeft
|
||||||
|
});
|
||||||
|
|
||||||
|
return coords;
|
||||||
|
};
|
||||||
|
|
||||||
/** 内置成员 */
|
/** 内置成员 */
|
||||||
|
|
||||||
window.layer = layer;
|
window.layer = layer;
|
||||||
|
@ -1140,12 +1150,19 @@ layer.getFrameIndex = function(name){
|
||||||
// iframe 层自适应宽高
|
// iframe 层自适应宽高
|
||||||
layer.iframeAuto = function(index){
|
layer.iframeAuto = function(index){
|
||||||
if(!index) return;
|
if(!index) return;
|
||||||
var heg = layer.getChildFrame('html', index).outerHeight();
|
|
||||||
var layero = $('#'+ doms[0] + index);
|
var layero = $('#'+ doms[0] + index);
|
||||||
var titHeight = layero.find(doms[1]).outerHeight() || 0;
|
var options = layero.data('config');
|
||||||
|
var iframeHeight = layer.getChildFrame('html', index).outerHeight();
|
||||||
|
var titleHeight = layero.find(doms[1]).outerHeight() || 0;
|
||||||
var btnHeight = layero.find('.'+doms[6]).outerHeight() || 0;
|
var btnHeight = layero.find('.'+doms[6]).outerHeight() || 0;
|
||||||
layero.css({height: heg + titHeight + btnHeight});
|
var maxHeight = 'maxHeight' in options ? options.maxHeight : win.height();
|
||||||
layero.find('iframe').css({height: heg});
|
if(maxHeight){
|
||||||
|
iframeHeight = Math.min(iframeHeight, maxHeight - titleHeight - btnHeight);
|
||||||
|
}
|
||||||
|
layero.css({height: iframeHeight + titleHeight + btnHeight});
|
||||||
|
layero.find('iframe').css({height: iframeHeight});
|
||||||
|
|
||||||
|
ready.updatePosition(layero, options);
|
||||||
};
|
};
|
||||||
|
|
||||||
// 重置 iframe url
|
// 重置 iframe url
|
||||||
|
|
Loading…
Reference in New Issue