rabbit-design
Version:
A lightweight UI plugin library written in TypeScript and based on JavaScript
83 lines (73 loc) • 2.3 kB
text/typescript
import { createPopper } from '@popperjs/core';
import { bind, unbind } from '../dom-utils';
import { type } from '../utils';
export function _newCreatePopper(
reference: Element,
popper: HTMLElement,
placement: string | any,
offset: number
): any {
return createPopper(reference, popper, {
placement: placement, // 设置位置
modifiers: [
{
name: 'computeStyles',
options: {
gpuAcceleration: false // 使用top/left属性。否则会和弹出器动画冲突
}
},
{
name: 'computeStyles',
options: {
adaptive: false // 避免重新计算弹出器位置从而造成位置牛头不对马嘴
}
},
{
name: 'offset',
options: {
offset: [offset] // 自定义弹出器出现位置的偏移量
}
}
]
});
}
interface handleOptions {
reference: Element;
popper: Element | any;
datasetVal: string;
showCb: any;
hideCb: any;
delay: number;
timer: any;
}
export function handleHoverShowAndHideEvents({
reference,
popper,
datasetVal,
showCb,
hideCb,
delay,
timer
}: handleOptions): void {
bind(reference, 'mouseenter', () => {
timer = setTimeout(() => {
showEv();
}, delay);
});
bind(reference, 'mouseleave', hideEv);
// 通过设置 popper.dataset.tooltipShow 的方式可以判断提示框是否显示,
// 并根据设置的值 "true" 和 "false" 来判断是否执行对应回调事件,
// 避免出现鼠标快速经过但没有显示提示框,却依然执行了提示框消失时触发的回调
function showEv(): void {
popper.dataset[datasetVal] = 'show';
showCb && type.isFn(showCb);
}
function hideEv(): void {
clearTimeout(timer);
if (popper.dataset[datasetVal] === 'show') {
popper.dataset[datasetVal] = 'hide';
hideCb && type.isFn(hideCb);
}
unbind(reference, 'mouseenter', showEv);
}
}