|
|
@ -249,12 +249,14 @@ |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
_getLeftAlignPosition: function (combo, popup, extraWidth, container) { |
|
|
|
_getLeftAlignPosition: function (combo, popup, extraWidth, container) { |
|
|
|
var viewBounds = popup.element.bounds(), |
|
|
|
var comboRect = combo.element[0].getBoundingClientRect(), |
|
|
|
windowBounds = BI.Widget._renderEngine.createElement("body").bounds(); |
|
|
|
popupRect = popup.element.bounds(), |
|
|
|
var left = combo.element.offset().left - (container ? container.getBoundingClientRect().left : 0) + extraWidth; |
|
|
|
viewportRect = document.documentElement.getBoundingClientRect(), |
|
|
|
|
|
|
|
containerRect = container ? container.getBoundingClientRect() : { left: 0 }; |
|
|
|
|
|
|
|
var left = comboRect.left - containerRect.left + extraWidth; |
|
|
|
|
|
|
|
|
|
|
|
if (left + viewBounds.width > windowBounds.width) { |
|
|
|
if (left + popupRect.width - containerRect.left > viewportRect.width) { |
|
|
|
left = windowBounds.width - viewBounds.width; |
|
|
|
left = viewportRect.width - popupRect.width - containerRect.left; |
|
|
|
} |
|
|
|
} |
|
|
|
return left; |
|
|
|
return left; |
|
|
|
}, |
|
|
|
}, |
|
|
@ -285,17 +287,19 @@ |
|
|
|
}; |
|
|
|
}; |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
_getRightAlignPosition: function (combo, popup, extraWidth) { |
|
|
|
_getRightAlignPosition: function (combo, popup, extraWidth, container) { |
|
|
|
var comboBounds = combo.element.bounds(), viewBounds = popup.element.bounds(); |
|
|
|
var comboBounds = combo.element[0].getBoundingClientRect(), |
|
|
|
return combo.element.offset().left + comboBounds.width - viewBounds.width - extraWidth; |
|
|
|
viewBounds = popup.element[0].getBoundingClientRect(), |
|
|
|
|
|
|
|
containerRect = container ? container.getBoundingClientRect() : { left: 0 }; |
|
|
|
|
|
|
|
return comboBounds.left + comboBounds.width - viewBounds.width - extraWidth - containerRect.left; |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
getRightAlignPosition: function (combo, popup, extraWidth) { |
|
|
|
getRightAlignPosition: function (combo, popup, extraWidth, container) { |
|
|
|
var left = this._getRightAlignPosition(combo, popup, extraWidth); |
|
|
|
var left = this._getRightAlignPosition(combo, popup, extraWidth, container); |
|
|
|
var dir = ""; |
|
|
|
var dir = ""; |
|
|
|
// 如果放不下,优先使用LeftAlign, 如果LeftAlign也放不下, 再使用left=0
|
|
|
|
// 如果放不下,优先使用LeftAlign, 如果LeftAlign也放不下, 再使用left=0
|
|
|
|
if (left < 0) { |
|
|
|
if (left < 0) { |
|
|
|
left = this._getLeftAlignPosition(combo, popup, extraWidth); |
|
|
|
left = this._getLeftAlignPosition(combo, popup, extraWidth, container); |
|
|
|
dir = "right"; |
|
|
|
dir = "right"; |
|
|
|
} |
|
|
|
} |
|
|
|
if (left < 0) { |
|
|
|
if (left < 0) { |
|
|
@ -317,14 +321,13 @@ |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
getTopAlignPosition: function (combo, popup, extraHeight, needAdaptHeight, container) { |
|
|
|
getTopAlignPosition: function (combo, popup, extraHeight, needAdaptHeight, container) { |
|
|
|
var comboOffset = combo.element.offset(); |
|
|
|
|
|
|
|
var comboBounds = combo.element[0].getBoundingClientRect(), |
|
|
|
var comboBounds = combo.element[0].getBoundingClientRect(), |
|
|
|
popupBounds = popup.element[0].getBoundingClientRect(), |
|
|
|
popupBounds = popup.element[0].getBoundingClientRect(), |
|
|
|
viewportBounds = document.documentElement.getBoundingClientRect(), |
|
|
|
viewportBounds = document.documentElement.getBoundingClientRect(), |
|
|
|
containerBounds = container ? container.getBoundingClientRect() : { top: 0 }; |
|
|
|
containerBounds = container ? container.getBoundingClientRect() : { top: 0 }; |
|
|
|
var top, adaptHeight, dir; |
|
|
|
var top, adaptHeight, dir; |
|
|
|
if (BI.DOM.isBottomSpaceEnough(combo, popup, -1 * comboBounds.height + extraHeight)) { |
|
|
|
if (BI.DOM.isBottomSpaceEnough(combo, popup, -1 * comboBounds.height + extraHeight)) { |
|
|
|
top = comboOffset.top - containerBounds.top + extraHeight; |
|
|
|
top = comboBounds.top - containerBounds.top + extraHeight; |
|
|
|
} else if (needAdaptHeight) { |
|
|
|
} else if (needAdaptHeight) { |
|
|
|
top = comboBounds.top - containerBounds.top + extraHeight; |
|
|
|
top = comboBounds.top - containerBounds.top + extraHeight; |
|
|
|
adaptHeight = viewportBounds.height - comboBounds.top; |
|
|
|
adaptHeight = viewportBounds.height - comboBounds.top; |
|
|
@ -375,20 +378,19 @@ |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
getBottomAlignPosition: function (combo, popup, extraHeight, needAdaptHeight, container) { |
|
|
|
getBottomAlignPosition: function (combo, popup, extraHeight, needAdaptHeight, container) { |
|
|
|
var comboOffset = combo.element.offset(); |
|
|
|
|
|
|
|
var comboBounds = combo.element[0].getBoundingClientRect(), |
|
|
|
var comboBounds = combo.element[0].getBoundingClientRect(), |
|
|
|
popupBounds = popup.element[0].getBoundingClientRect(), |
|
|
|
popupBounds = popup.element[0].getBoundingClientRect(), |
|
|
|
windowBounds = BI.Widget._renderEngine.createElement("body").bounds(), |
|
|
|
windowBounds = BI.Widget._renderEngine.createElement("body").bounds(), |
|
|
|
containerBounds = container ? container.getBoundingClientRect() : { top: 0 }; |
|
|
|
containerBounds = container ? container.getBoundingClientRect() : { top: 0 }; |
|
|
|
var top, adaptHeight, dir; |
|
|
|
var top, adaptHeight, dir; |
|
|
|
if (BI.DOM.isTopSpaceEnough(combo, popup, -1 * comboBounds.height + extraHeight)) { |
|
|
|
if (BI.DOM.isTopSpaceEnough(combo, popup, -1 * comboBounds.height + extraHeight)) { |
|
|
|
top = comboOffset.top + comboBounds.height - containerBounds.top - popupBounds.height; |
|
|
|
top = comboBounds.top + comboBounds.height - containerBounds.top - popupBounds.height; |
|
|
|
} else if (needAdaptHeight) { |
|
|
|
} else if (needAdaptHeight) { |
|
|
|
top = 0 - containerBounds.top; |
|
|
|
top = 0 - containerBounds.top; |
|
|
|
adaptHeight = comboBounds.top + comboBounds.height - extraHeight; |
|
|
|
adaptHeight = comboBounds.top + comboBounds.height - extraHeight; |
|
|
|
} else if (BI.DOM.isBottomSpaceEnough(combo, popup, -1 * comboBounds.height + extraHeight)) { |
|
|
|
} else if (BI.DOM.isBottomSpaceEnough(combo, popup, -1 * comboBounds.height + extraHeight)) { |
|
|
|
// 上方空间不足且不允许调整高度的情况下,优先使用下对齐
|
|
|
|
// 上方空间不足且不允许调整高度的情况下,优先使用下对齐
|
|
|
|
top = comboOffset.top - containerBounds.top + extraHeight; |
|
|
|
top = comboBounds.top - containerBounds.top + extraHeight; |
|
|
|
dir = "bottom"; |
|
|
|
dir = "bottom"; |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
top = 0; |
|
|
|
top = 0; |
|
|
@ -410,7 +412,6 @@ |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
getBottomAdaptPosition: function (combo, popup, extraHeight, needAdaptHeight) { |
|
|
|
getBottomAdaptPosition: function (combo, popup, extraHeight, needAdaptHeight) { |
|
|
|
var comboOffset = combo.element.offset(); |
|
|
|
|
|
|
|
var comboBounds = combo.element.bounds(), popupBounds = popup.element.bounds(), |
|
|
|
var comboBounds = combo.element.bounds(), popupBounds = popup.element.bounds(), |
|
|
|
windowBounds = BI.Widget._renderEngine.createElement("body").bounds(); |
|
|
|
windowBounds = BI.Widget._renderEngine.createElement("body").bounds(); |
|
|
|
if (BI.DOM.isBottomSpaceEnough(combo, popup, extraHeight)) { |
|
|
|
if (BI.DOM.isBottomSpaceEnough(combo, popup, extraHeight)) { |
|
|
@ -418,8 +419,8 @@ |
|
|
|
} |
|
|
|
} |
|
|
|
if (needAdaptHeight) { |
|
|
|
if (needAdaptHeight) { |
|
|
|
return { |
|
|
|
return { |
|
|
|
top: comboOffset.top + comboBounds.height + extraHeight, |
|
|
|
top: comboBounds.top + comboBounds.height + extraHeight, |
|
|
|
adaptHeight: windowBounds.height - comboOffset.top - comboBounds.height - extraHeight |
|
|
|
adaptHeight: windowBounds.height - comboBounds.top - comboBounds.height - extraHeight |
|
|
|
}; |
|
|
|
}; |
|
|
|
} |
|
|
|
} |
|
|
|
if (popupBounds.height + extraHeight > windowBounds.height) { |
|
|
|
if (popupBounds.height + extraHeight > windowBounds.height) { |
|
|
@ -732,5 +733,19 @@ |
|
|
|
|
|
|
|
|
|
|
|
return BI.DOM.getPositionRelativeContainingBlock(element.parentNode); |
|
|
|
return BI.DOM.getPositionRelativeContainingBlock(element.parentNode); |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* 获取position:fixed相对定位的元素的clientRect |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
getPositionRelativeContainingBlockRect: function (element) { |
|
|
|
|
|
|
|
var positionRelativeElement = BI.DOM.getPositionRelativeContainingBlock(element); |
|
|
|
|
|
|
|
var rect = positionRelativeElement.getBoundingClientRect(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return { |
|
|
|
|
|
|
|
...rect.toJSON(), |
|
|
|
|
|
|
|
scaleX: rect.width / positionRelativeElement.offsetWidth, |
|
|
|
|
|
|
|
scaleY: rect.height / positionRelativeElement.offsetHeight |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
}, |
|
|
|
}); |
|
|
|
}); |
|
|
|
})(); |
|
|
|
})(); |
|
|
|