mirror of
https://github.com/tenrok/OverlayScrollbars.git
synced 2026-06-22 02:30:35 +03:00
improve partially overlaid scrollbars code
This commit is contained in:
@@ -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, {
|
||||||
|
|||||||
Reference in New Issue
Block a user