improve partially overlaid scrollbars code

This commit is contained in:
Rene
2021-04-04 15:23:31 +02:00
parent 248dfc7264
commit 0b0291f3ab
@@ -15,6 +15,7 @@ import {
offsetSize, offsetSize,
getBoundingClientRect, getBoundingClientRect,
noop, noop,
each,
} from 'support'; } from 'support';
import { LifecycleHub, Lifecycle } from 'lifecycles/lifecycleHub'; import { LifecycleHub, Lifecycle } from 'lifecycles/lifecycleHub';
import { getEnvironment } from 'environment'; import { getEnvironment } from 'environment';
@@ -39,6 +40,11 @@ interface ViewportOverflowState {
_overflowScroll: XY<boolean>; _overflowScroll: XY<boolean>;
} }
interface UndoViewportArrangeResult {
_redoViewportArrange: () => void;
_viewportOverflowState?: ViewportOverflowState;
}
interface OverflowOption { interface OverflowOption {
x: OverflowBehavior; x: OverflowBehavior;
y: OverflowBehavior; y: OverflowBehavior;
@@ -198,6 +204,9 @@ export const createOverflowLifecycle = (lifecycleHub: LifecycleHub): Lifecycle =
h: hideOffsetX && arrangeX ? `${hideOffsetX + contentScrollSize.h - viewportArrangeVerticalPaddingValue}px` : '', h: hideOffsetX && arrangeX ? `${hideOffsetX + contentScrollSize.h - viewportArrangeVerticalPaddingValue}px` : '',
}; };
console.log(arrangeX);
console.log(arrangeY);
// adjust content arrange / before element // adjust content arrange / before element
if (_viewportArrange) { if (_viewportArrange) {
const { sheet } = _viewportArrange; const { sheet } = _viewportArrange;
@@ -275,30 +284,50 @@ export const createOverflowLifecycle = (lifecycleHub: LifecycleHub): Lifecycle =
/** /**
* Removes all styles applied because of the viewport arrange strategy. * Removes all styles applied because of the viewport arrange strategy.
* @returns A function which again applies all the removed styles. * @param showNativeOverlaidScrollbars Whether native overlaid scrollbars are shown instead of hidden.
* @param viewportOverflowState The currentviewport overflow state or undefined if it has to be determined.
* @returns A object with a function which applies all the removed styles and the determined viewport vverflow state.
*/ */
const undoViewportArrange = () => { const undoViewportArrange = (showNativeOverlaidScrollbars: boolean, viewportOverflowState?: ViewportOverflowState): UndoViewportArrangeResult => {
if (_doViewportArrange) { if (_doViewportArrange) {
const finalViewportOverflowState = viewportOverflowState || getViewportOverflowState(showNativeOverlaidScrollbars);
const paddingStyle = _getViewportPaddingStyle();
const { _flexboxGlue } = getEnvironment(); const { _flexboxGlue } = getEnvironment();
let paddingStyle = _getViewportPaddingStyle(); const { _scrollbarsHideOffsetArrange } = finalViewportOverflowState;
const { x: arrangeX, y: arrangeY } = _scrollbarsHideOffsetArrange;
const finalPaddingStyle: StyleObject = {};
const assignProps = (props: string) =>
each(props.split(' '), (prop) => {
finalPaddingStyle[prop] = paddingStyle[prop];
});
if (!_flexboxGlue) { if (!_flexboxGlue) {
paddingStyle = { finalPaddingStyle.height = '';
...paddingStyle,
height: '',
};
} }
const prevStyle = style(_viewport, keys(paddingStyle)); if (arrangeX) {
removeClass(_viewport, classNameViewportArrange); assignProps('marginTop marginBottom paddingTop paddingBottom');
style(_viewport, paddingStyle); }
return () => { if (arrangeY) {
style(_viewport, prevStyle); assignProps('marginLeft marginRight paddingLeft paddingRight');
addClass(_viewport, classNameViewportArrange); }
const prevStyle = style(_viewport, keys(finalPaddingStyle));
removeClass(_viewport, classNameViewportArrange);
style(_viewport, finalPaddingStyle);
return {
_redoViewportArrange: () => {
style(_viewport, prevStyle);
addClass(_viewport, classNameViewportArrange);
},
_viewportOverflowState: finalViewportOverflowState,
}; };
} }
return noop; return {
_redoViewportArrange: noop,
};
}; };
return (updateHints, checkOption, force) => { return (updateHints, checkOption, force) => {
@@ -330,7 +359,10 @@ export const createOverflowLifecycle = (lifecycleHub: LifecycleHub): Lifecycle =
} }
if (_sizeChanged || _paddingStyleChanged || _contentMutation || showNativeOverlaidScrollbarsChanged || directionChanged) { if (_sizeChanged || _paddingStyleChanged || _contentMutation || showNativeOverlaidScrollbarsChanged || directionChanged) {
const redoViewportArrange = undoViewportArrange(); const { _redoViewportArrange, _viewportOverflowState: undoViewportArrangeOverflowState } = undoViewportArrange(
showNativeOverlaidScrollbars,
preMeasureViewportOverflowState
);
const contentSize = clientSize(_viewport); const contentSize = clientSize(_viewport);
const viewportRect = getBoundingClientRect(_viewport); const viewportRect = getBoundingClientRect(_viewport);
const viewportOffsetSize = offsetSize(_viewport); const viewportOffsetSize = offsetSize(_viewport);
@@ -342,19 +374,17 @@ export const createOverflowLifecycle = (lifecycleHub: LifecycleHub): Lifecycle =
_viewportScrollSize: viewportScrollSize, _viewportScrollSize: viewportScrollSize,
})); }));
redoViewportArrange(); _redoViewportArrange();
if ((contentScrollSizeChanged || showNativeOverlaidScrollbarsChanged) && !showNativeOverlaidScrollbars) { // if re measure is required (only required if content arrange strategy is used)
const arranged = arrangeViewport( if (
preMeasureViewportOverflowState || getViewportOverflowState(showNativeOverlaidScrollbars), (contentScrollSizeChanged || showNativeOverlaidScrollbarsChanged) &&
contentScrollSize!, undoViewportArrangeOverflowState &&
directionIsRTL! !showNativeOverlaidScrollbars &&
); arrangeViewport(undoViewportArrangeOverflowState, contentScrollSize!, directionIsRTL!)
) {
if (arranged) { viewportClientSize = clientSize(_viewport);
viewportClientSize = clientSize(_viewport); viewportScrollSize = fixScrollSizeRounding(scrollSize(_viewport), offsetSize(_viewport), getBoundingClientRect(_viewport));
viewportScrollSize = fixScrollSizeRounding(scrollSize(_viewport), offsetSize(_viewport), getBoundingClientRect(_viewport));
}
} }
overflowAmuntCache = updateOverflowAmountCache(force, { overflowAmuntCache = updateOverflowAmountCache(force, {