UNPKG

@nutui/nutui-react

Version:

京东风格的轻量级移动端 React 组件库,支持一套代码生成 H5 和小程序

86 lines (85 loc) 2.96 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "useLockScroll", { enumerable: true, get: function() { return useLockScroll; } }); var _react = require("react"); var _usetouch = require("./use-touch"); var _getscrollparent = require("../utils/get-scroll-parent"); var _supportspassive = require("../utils/supports-passive"); var totalLockCount = 0; var BODY_LOCK_CLASS = 'nut-overflow-hidden'; function getScrollableElement(el) { var current = el === null || el === void 0 ? void 0 : el.parentElement; while(current){ if (current.clientHeight < current.scrollHeight) { return current; } current = current.parentElement; } return null; } function useLockScroll(rootRef, shouldLock) { var touch = (0, _usetouch.useTouch)(); var onTouchMove = function onTouchMove(event) { touch.move(event); var direction = touch.deltaY.current > 0 ? '10' : '01'; var el = (0, _getscrollparent.getScrollParent)(event.target, rootRef.current); if (!el) return; // This has perf cost but we have to compatible with iOS 12 if (shouldLock === 'strict') { var scrollableParent = getScrollableElement(event.target); if (scrollableParent === document.body || scrollableParent === document.documentElement) { event.preventDefault(); return; } } var scrollHeight = el.scrollHeight, offsetHeight = el.offsetHeight, scrollTop = el.scrollTop; var status = '11'; if (scrollTop === 0) { status = offsetHeight >= scrollHeight ? '00' : '01'; } else if (scrollTop + offsetHeight >= scrollHeight) { status = '10'; } if (status !== '11' && touch.isVertical() && !(parseInt(status, 2) & parseInt(direction, 2))) { if (event.cancelable) { event.preventDefault(); } } }; var lock = function lock() { document.addEventListener('touchstart', touch.start); document.addEventListener('touchmove', onTouchMove, _supportspassive.passiveSupported ? { passive: false } : false); if (!totalLockCount) { document.body.classList.add(BODY_LOCK_CLASS); } totalLockCount++; }; var unlock = function unlock() { if (totalLockCount) { document.removeEventListener('touchstart', touch.start); document.removeEventListener('touchmove', onTouchMove); totalLockCount--; if (!totalLockCount) { document.body.classList.remove(BODY_LOCK_CLASS); } } }; (0, _react.useEffect)(function() { if (shouldLock) { lock(); return function() { unlock(); }; } }, [ shouldLock ]); }