全新popiart网站 react项目重构
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

53 lines
2.0 KiB

/** 主布局内容区:滚动层 + 全屏详情弹窗遮罩层(方案 A,二者为兄弟节点) */
let layoutContentScrollEl: HTMLElement | null = null;
let layoutContentModalMountEl: HTMLElement | null = null;
export const LAYOUT_CONTENT_SCROLL_LOCK_CLASS = "layoutShell__contentScroll_scrollLocked";
let layoutContentScrollLockCount = 0;
export function setLayoutContentScrollRoot(el: HTMLElement | null): void {
layoutContentScrollEl = el;
}
export function getLayoutContentScrollRoot(): HTMLElement | null {
return layoutContentScrollEl;
}
export function setLayoutContentModalMount(el: HTMLElement | null): void {
layoutContentModalMountEl = el;
}
export function getLayoutContentModalMount(): HTMLElement | null {
return layoutContentModalMountEl;
}
/** 全屏详情弹窗打开时锁住背后滚动层(保留 scrollTop,仅禁止滚动) */
export function lockLayoutContentScroll(): void {
layoutContentScrollLockCount += 1;
layoutContentScrollEl?.classList.add(LAYOUT_CONTENT_SCROLL_LOCK_CLASS);
}
export function unlockLayoutContentScroll(): void {
layoutContentScrollLockCount = Math.max(0, layoutContentScrollLockCount - 1);
if (layoutContentScrollLockCount === 0) {
layoutContentScrollEl?.classList.remove(LAYOUT_CONTENT_SCROLL_LOCK_CLASS);
}
}
export function isLayoutContentScrollLocked(): boolean {
return layoutContentScrollLockCount > 0;
}
/** 滚动事件是否来自弹窗遮罩层(应忽略,避免误触发 composer 收起) */
export function isScrollEventFromLayoutModalMount(target: EventTarget | null): boolean {
if (layoutContentModalMountEl == null || target == null) return false;
return layoutContentModalMountEl.contains(target as Node);
}
/** 滚动是否发生在内容滚动层及其子树内 */
export function isScrollEventInLayoutContentScroll(target: EventTarget | null): boolean {
if (layoutContentScrollEl == null || !(target instanceof HTMLElement)) return false;
return target === layoutContentScrollEl || layoutContentScrollEl.contains(target);
}