UNPKG

element-plus

Version:

A Component Library for Vue 3

1 lines 9.53 kB
{"version":3,"file":"affix.vue2.mjs","sources":["../../../../../../packages/components/affix/src/affix.vue"],"sourcesContent":["<template>\n <div ref=\"root\" :class=\"ns.b()\" :style=\"rootStyle\">\n <el-teleport :disabled=\"teleportDisabled\" :to=\"appendTo\">\n <div :class=\"{ [ns.m('fixed')]: fixed }\" :style=\"affixStyle\">\n <slot />\n </div>\n </el-teleport>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport {\n computed,\n nextTick,\n onActivated,\n onDeactivated,\n onMounted,\n ref,\n shallowRef,\n watch,\n watchEffect,\n} from 'vue'\nimport {\n useElementBounding,\n useEventListener,\n useWindowSize,\n} from '@vueuse/core'\nimport ElTeleport from '@element-plus/components/teleport'\nimport { addUnit, getScrollContainer, throwError } from '@element-plus/utils'\nimport { useNamespace } from '@element-plus/hooks'\nimport { CHANGE_EVENT } from '@element-plus/constants'\nimport { affixEmits } from './affix'\n\nimport type { CSSProperties } from 'vue'\nimport type { AffixProps } from './affix'\n\nconst COMPONENT_NAME = 'ElAffix'\ndefineOptions({\n name: COMPONENT_NAME,\n})\nconst props = withDefaults(defineProps<AffixProps>(), {\n zIndex: 100,\n target: '',\n offset: 0,\n position: 'top',\n appendTo: 'body',\n})\nconst emit = defineEmits(affixEmits)\n\nconst ns = useNamespace('affix')\n\nconst target = shallowRef<HTMLElement>()\nconst root = shallowRef<HTMLDivElement>()\nconst scrollContainer = shallowRef<HTMLElement | Window>()\nconst { height: windowHeight } = useWindowSize()\nconst {\n height: rootHeight,\n width: rootWidth,\n top: rootTop,\n bottom: rootBottom,\n left: rootLeft,\n update: updateRoot,\n} = useElementBounding(root, { windowScroll: false })\nconst targetRect = useElementBounding(target)\n\nconst fixed = ref(false)\nconst scrollTop = ref(0)\nconst transform = ref(0)\n\nconst teleportDisabled = computed(() => {\n return !props.teleported || !fixed.value\n})\n\nconst rootStyle = computed<CSSProperties>(() => {\n return {\n height: fixed.value ? `${rootHeight.value}px` : '',\n width: fixed.value ? `${rootWidth.value}px` : '',\n }\n})\n\nconst affixStyle = computed<CSSProperties>(() => {\n if (!fixed.value) return {}\n\n const offset = addUnit(props.offset)\n return {\n height: `${rootHeight.value}px`,\n width: `${rootWidth.value}px`,\n top: props.position === 'top' ? offset : '',\n bottom: props.position === 'bottom' ? offset : '',\n left: props.teleported ? `${rootLeft.value}px` : '',\n transform: transform.value ? `translateY(${transform.value}px)` : '',\n zIndex: props.zIndex,\n }\n})\n\nconst update = () => {\n if (!scrollContainer.value) return\n\n scrollTop.value =\n scrollContainer.value instanceof Window\n ? document.documentElement.scrollTop\n : scrollContainer.value.scrollTop || 0\n\n const { position, target, offset } = props\n const rootHeightOffset = offset + rootHeight.value\n\n if (position === 'top') {\n if (target) {\n const difference = targetRect.bottom.value - rootHeightOffset\n fixed.value = offset > rootTop.value && targetRect.bottom.value > 0\n transform.value = difference < 0 ? difference : 0\n } else {\n fixed.value = offset > rootTop.value\n }\n } else if (target) {\n const difference =\n windowHeight.value - targetRect.top.value - rootHeightOffset\n fixed.value =\n windowHeight.value - offset < rootBottom.value &&\n windowHeight.value > targetRect.top.value\n transform.value = difference < 0 ? -difference : 0\n } else {\n fixed.value = windowHeight.value - offset < rootBottom.value\n }\n}\n\nconst updateRootRect = async () => {\n if (!fixed.value) {\n updateRoot()\n return\n }\n\n fixed.value = false\n await nextTick()\n updateRoot()\n fixed.value = true\n}\n\nconst handleScroll = async () => {\n updateRoot()\n await nextTick()\n emit('scroll', {\n scrollTop: scrollTop.value,\n fixed: fixed.value,\n })\n}\n\nwatch(fixed, (val) => emit(CHANGE_EVENT, val))\n\nonMounted(() => {\n if (props.target) {\n target.value =\n document.querySelector<HTMLElement>(props.target) ?? undefined\n if (!target.value)\n throwError(COMPONENT_NAME, `Target does not exist: ${props.target}`)\n } else {\n target.value = document.documentElement\n }\n scrollContainer.value = getScrollContainer(root.value!, true)\n updateRoot()\n})\n\nonActivated(() => {\n nextTick(updateRootRect)\n})\n\nonDeactivated(() => {\n fixed.value = false\n})\n\nuseEventListener(scrollContainer, 'scroll', handleScroll)\nwatchEffect(update)\n\ndefineExpose({\n /** @description update affix status */\n update,\n /** @description update rootRect info */\n updateRoot: updateRootRect,\n})\n</script>\n"],"names":["target","_createElementBlock","_normalizeClass","_unref","_createVNode","_createElementVNode","_renderSlot"],"mappings":"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"}