| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- export interface VisibleDomRect {
- bottom: number;
- height: number;
- left: number;
- right: number;
- top: number;
- width: number;
- }
- /**
- * 获取元素可见信息
- * @param element
- */
- export function getElementVisibleRect(
- element?: HTMLElement | null | undefined,
- ): VisibleDomRect {
- if (!element) {
- return {
- bottom: 0,
- height: 0,
- left: 0,
- right: 0,
- top: 0,
- width: 0,
- };
- }
- const rect = element.getBoundingClientRect();
- const viewHeight = Math.max(
- document.documentElement.clientHeight,
- window.innerHeight,
- );
- const top = Math.max(rect.top, 0);
- const bottom = Math.min(rect.bottom, viewHeight);
- const viewWidth = Math.max(
- document.documentElement.clientWidth,
- window.innerWidth,
- );
- const left = Math.max(rect.left, 0);
- const right = Math.min(rect.right, viewWidth);
- return {
- bottom,
- height: Math.max(0, bottom - top),
- left,
- right,
- top,
- width: Math.max(0, right - left),
- };
- }
- export function getScrollbarWidth() {
- const scrollDiv = document.createElement('div');
- scrollDiv.style.visibility = 'hidden';
- scrollDiv.style.overflow = 'scroll';
- scrollDiv.style.position = 'absolute';
- scrollDiv.style.top = '-9999px';
- document.body.append(scrollDiv);
- const innerDiv = document.createElement('div');
- scrollDiv.append(innerDiv);
- const scrollbarWidth = scrollDiv.offsetWidth - innerDiv.offsetWidth;
- scrollDiv.remove();
- return scrollbarWidth;
- }
- export function needsScrollbar() {
- const doc = document.documentElement;
- const body = document.body;
- // 检查 body 的 overflow-y 样式
- const overflowY = window.getComputedStyle(body).overflowY;
- // 如果明确设置了需要滚动条的样式
- if (overflowY === 'scroll' || overflowY === 'auto') {
- return doc.scrollHeight > window.innerHeight;
- }
- // 在其他情况下,根据 scrollHeight 和 innerHeight 比较判断
- return doc.scrollHeight > window.innerHeight;
- }
- export function triggerWindowResize(): void {
- // 创建一个新的 resize 事件
- const resizeEvent = new Event('resize');
- // 触发 window 的 resize 事件
- window.dispatchEvent(resizeEvent);
- }
|