12345678910111213141516171819202122232425262728293031323334353637383940414243 |
- import { onUnmounted } from 'vue'
- import { isClient } from '@vueuse/core'
- import { addClass, getScrollBarWidth, getStyle, hasClass, removeClass } from '@kankan/utils'
- export const useLockScreen = () => {
- let scrollBarWidth = 0
- let withoutHiddenClass = false
- let bodyPaddingRight = '0'
- let computedBodyPaddingRight = 0
- onUnmounted(() => {
- cleanup()
- })
- const cleanup = () => {
- if (!isClient) return
- removeClass(document.body, 'el-popup-parent--hidden')
- if (withoutHiddenClass) {
- document.body.style.paddingRight = bodyPaddingRight
- }
- }
- const lock = () => {
- if (!isClient) return
- withoutHiddenClass = !hasClass(document.body, 'el-popup-parent--hidden')
- if (withoutHiddenClass) {
- bodyPaddingRight = document.body.style.paddingRight
- computedBodyPaddingRight = Number.parseInt(getStyle(document.body, 'paddingRight'), 10)
- }
- scrollBarWidth = getScrollBarWidth()
- const bodyHasOverflow = document.documentElement.clientHeight < document.body.scrollHeight
- const bodyOverflowY = getStyle(document.body, 'overflowY')
- if (scrollBarWidth > 0 && (bodyHasOverflow || bodyOverflowY === 'scroll') && withoutHiddenClass) {
- document.body.style.paddingRight = `${computedBodyPaddingRight + scrollBarWidth}px`
- }
- addClass(document.body, 'el-popup-parent--hidden')
- }
- return {
- lock,
- cleanup,
- }
- }
|