@aplus-frontend/antdv
Version:
Vue basic component library maintained based on ant-design-vue
46 lines (45 loc) • 1.51 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = useScrollLocker;
exports.isBodyOverflowing = isBodyOverflowing;
var _vue = require("vue");
var _dynamicCSS = require("../../vc-util/Dom/dynamicCSS");
var _getScrollBarSize = _interopRequireDefault(require("../../_util/getScrollBarSize"));
var _canUseDom = _interopRequireDefault(require("../../_util/canUseDom"));
const UNIQUE_ID = `vc-util-locker-${Date.now()}`;
let uuid = 0;
/**../vc-util/Dom/dynam
* Test usage export. Do not use in your production
*/
function isBodyOverflowing() {
return document.body.scrollHeight > (window.innerHeight || document.documentElement.clientHeight) && window.innerWidth > document.body.offsetWidth;
}
function useScrollLocker(lock) {
const mergedLock = (0, _vue.computed)(() => !!lock && !!lock.value);
uuid += 1;
const id = `${UNIQUE_ID}_${uuid}`;
(0, _vue.watchEffect)(onClear => {
if (!(0, _canUseDom.default)()) {
return;
}
if (mergedLock.value) {
const scrollbarSize = (0, _getScrollBarSize.default)();
const isOverflow = isBodyOverflowing();
(0, _dynamicCSS.updateCSS)(`
html body {
overflow-y: hidden;
${isOverflow ? `width: calc(100% - ${scrollbarSize}px);` : ''}
}`, id);
} else {
(0, _dynamicCSS.removeCSS)(id);
}
onClear(() => {
(0, _dynamicCSS.removeCSS)(id);
});
}, {
flush: 'post'
});
}
;