ivue-material-plus
Version:
A high quality UI components Library with Vue.js
1 lines • 11.1 kB
Source Map (JSON)
{"version":3,"file":"loading.mjs","sources":["../../../../../src/components/ivue-loading/loading.ts"],"sourcesContent":["import { nextTick } from 'vue';\r\nimport { isString } from '@vue/shared';\r\n\r\nimport { getStyle, addClass, removeClass } from '../../utils/assist';\r\nimport {\r\n createLoadingComponent,\r\n LoadingInstance,\r\n} from './createLoadingComponent';\r\nimport { useZIndex } from '../../utils/helpers';\r\nimport isServer from '../../utils/isServer';\r\n\r\n// ts\r\nimport type { CSSProperties } from 'vue';\r\nimport type { LoadingOptions, LoadingOptionsResolved } from './types/loading';\r\n\r\n// 全屏展示实例\r\nlet fullscreenInstance: LoadingInstance | undefined = undefined;\r\n\r\n// 添加样式\r\nconst addStyle = async (\r\n options: LoadingOptionsResolved,\r\n parent: HTMLElement,\r\n instance: LoadingInstance\r\n) => {\r\n const { nextZIndex } = useZIndex();\r\n\r\n // css\r\n const maskStyle: CSSProperties = {};\r\n\r\n // 开启全屏\r\n if (options.fullscreen) {\r\n // 定位\r\n instance.originalPosition.value = getStyle(document.body, 'position');\r\n // 隐藏\r\n instance.originalOverflow.value = getStyle(document.body, 'overflow');\r\n // zIndex\r\n maskStyle.zIndex = nextZIndex();\r\n }\r\n // 渲染 body\r\n else if (options.parent === document.body) {\r\n instance.originalPosition.value = getStyle(document.body, 'position');\r\n\r\n /**\r\n * await dom render when visible is true in init,\r\n * because some component's height maybe 0.\r\n * e.g. table.\r\n */\r\n await nextTick();\r\n\r\n // 偏移位置\r\n for (const property of ['top', 'left']) {\r\n const scroll = property === 'top' ? 'scrollTop' : 'scrollLeft';\r\n\r\n const position =\r\n // 元素相对于视窗 top/left\r\n (options.target as HTMLElement).getBoundingClientRect()[property] +\r\n // 滚动条位置 scrollTop/scrollLeft\r\n document.body[scroll] +\r\n // 滚动条位置 scrollTop/scrollLeft\r\n document.documentElement[scroll] -\r\n // body margin\r\n Number.parseInt(getStyle(document.body, `margin-${property}`), 10);\r\n\r\n // 偏移位置\r\n maskStyle[property] = `${position}px`;\r\n }\r\n\r\n // 设置高度\r\n for (const property of ['height', 'width']) {\r\n // 元素高度/width\r\n maskStyle[property] = `${\r\n (options.target as HTMLElement).getBoundingClientRect()[property]\r\n }px`;\r\n }\r\n }\r\n // 设置定位\r\n else {\r\n instance.originalPosition.value = getStyle(parent, 'position');\r\n }\r\n\r\n // 设置样式\r\n for (const [key, value] of Object.entries(maskStyle)) {\r\n instance.$el.style[key] = value;\r\n }\r\n};\r\n\r\n// 添加 class\r\nconst addClassList = (\r\n options: LoadingOptionsResolved,\r\n parent: HTMLElement,\r\n instance: LoadingInstance\r\n) => {\r\n // 没有定位\r\n if (\r\n instance.originalPosition.value !== 'absolute' &&\r\n instance.originalPosition.value !== 'fixed'\r\n ) {\r\n addClass(parent, 'ivue-loading-parent--relative');\r\n }\r\n // 删除相对定位\r\n else {\r\n removeClass(parent, 'ivue-loading-parent--relative');\r\n }\r\n\r\n // 全屏 锁定屏幕的滚动 lock\r\n if (options.fullscreen && options.lock) {\r\n addClass(parent, 'ivue-loading-parent--hidden');\r\n }\r\n // 删除隐藏\r\n else {\r\n removeClass(parent, 'ivue-loading-parent--hidden');\r\n }\r\n};\r\n\r\n// 获取选项\r\nconst resolveOptions = (options: LoadingOptions): LoadingOptionsResolved => {\r\n let target: HTMLElement;\r\n\r\n // 获取 document.body\r\n if (isString(options.target)) {\r\n target =\r\n document.querySelector<HTMLElement>(options.target) ?? document.body;\r\n }\r\n // 获取 options.target || document.body\r\n else {\r\n target = options.target || document.body;\r\n }\r\n\r\n return {\r\n parent: target === document.body || options.body ? document.body : target,\r\n // 遮罩背景色\r\n background: options.background || '',\r\n // 显示在加载图标下方的加载文案\r\n text: options.text || '',\r\n // 全屏遮罩\r\n fullscreen: target === document.body && (options.fullscreen ?? true),\r\n // 锁定屏幕的滚动\r\n lock: options.lock ?? false,\r\n // Loading 的自定义类名\r\n customClass: options.customClass || '',\r\n // 显示/隐藏\r\n visible: options.visible ?? true,\r\n // 自定义加载图标类名\r\n iconClass: options.iconClass,\r\n // 自定义加载图标内容\r\n iconText: options.iconText,\r\n // 获取当前 target\r\n target,\r\n // 自定义旋转图标\r\n loadingSpinner: options.loadingSpinner,\r\n };\r\n};\r\n\r\n// loading\r\nconst Loading = function (options: LoadingOptions = {}): LoadingInstance {\r\n if (isServer) {\r\n return undefined;\r\n }\r\n\r\n // 获取选项\r\n const resolved = resolveOptions(options);\r\n\r\n // 有全屏\r\n if (resolved.fullscreen && fullscreenInstance) {\r\n return fullscreenInstance;\r\n }\r\n\r\n // 创建组件实例\r\n const instance = createLoadingComponent({\r\n ...resolved,\r\n close: () => {\r\n // 外部掉用的关闭\r\n resolved.close?.();\r\n\r\n // 销毁全屏实例\r\n if (resolved.fullscreen) {\r\n fullscreenInstance = undefined;\r\n }\r\n },\r\n });\r\n\r\n // 添加样式\r\n addStyle(resolved, resolved.parent, instance);\r\n // 添加 class\r\n addClassList(resolved, resolved.parent, instance);\r\n\r\n // 父级加载样式\r\n resolved.parent.LoadingAddClassList = () =>\r\n addClassList(resolved, resolved.parent, instance);\r\n\r\n /**\r\n * add loading-number to parent.\r\n * because if a fullscreen loading is triggered when somewhere\r\n * a v-loading.body was triggered before and it's parent is\r\n * document.body which with a margin , the fullscreen loading's\r\n * destroySelf function will remove 'ivue-loading-parent--relative',\r\n * and then the position of v-loading.body will be error.\r\n */\r\n let loadingNumber: string = resolved.parent.getAttribute('loading-number');\r\n\r\n if (!loadingNumber) {\r\n loadingNumber = '1';\r\n } else {\r\n loadingNumber = `${Number.parseInt(loadingNumber) + 1}`;\r\n }\r\n\r\n resolved.parent.setAttribute('loading-number', loadingNumber);\r\n\r\n // 添加子节点\r\n resolved.parent.appendChild(instance.$el);\r\n\r\n // 在实例渲染之后,然后修改可见以触发过渡\r\n nextTick(() => (instance.visible.value = resolved.visible));\r\n\r\n // 开启了全屏\r\n if (resolved.fullscreen) {\r\n fullscreenInstance = instance;\r\n }\r\n\r\n // 返回实例\r\n return instance;\r\n};\r\n\r\nexport default Loading;\r\n"],"names":[],"mappings":"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"}