Add auto hide scrollbar to HideScrollbar #34

Merged
FatttSnake merged 1 commits from FatttSnake into dev 2023-10-14 19:56:22 +08:00
3 changed files with 54 additions and 2 deletions

View File

@@ -1,4 +1,5 @@
@use '@/assets/css/constants' as constants; @use '@/assets/css/constants' as constants;
@use '@/assets/css/mixins' as mixins;
.hide-scrollbar-mask { .hide-scrollbar-mask {
position: relative; position: relative;
@@ -44,10 +45,26 @@
background-color: constants.$font-secondary-color; background-color: constants.$font-secondary-color;
transition: background-color .2s; transition: background-color .2s;
} }
:hover { :hover {
background-color: constants.$font-main-color; background-color: constants.$font-main-color;
} }
} }
&.hide {
display: block;
opacity: 0;
animation: 0.4s linear;
@include mixins.unique-keyframes {
0% {
opacity: 0.5;
}
100% {
opacity: 0;
}
}
}
} }
.vertical-scrollbar { .vertical-scrollbar {

View File

@@ -14,6 +14,7 @@ interface HideScrollbarProps
minHeight?: string | number minHeight?: string | number
scrollbarWidth?: string | number scrollbarWidth?: string | number
animationTransitionTime?: number animationTransitionTime?: number
autoHideWaitingTime?: number
} }
export interface HideScrollbarElement { export interface HideScrollbarElement {
@@ -147,16 +148,20 @@ const HideScrollbar = forwardRef<HideScrollbarElement, HideScrollbarProps>((prop
const lastScrollbarTouchPositionRef = useRef({ x: -1, y: -1 }) const lastScrollbarTouchPositionRef = useRef({ x: -1, y: -1 })
const lastTouchPositionRef = useRef({ x: -1, y: -1 }) const lastTouchPositionRef = useRef({ x: -1, y: -1 })
const [refreshTime, setRefreshTime] = useState(0) const [refreshTime, setRefreshTime] = useState(0)
const [verticalScrollbarWidth, setVerticalScrollbarWidth] = useState(0) const [verticalScrollbarWidth, setVerticalScrollbarWidth] = useState(0)
const [verticalScrollbarLength, setVerticalScrollbarLength] = useState(100) const [verticalScrollbarLength, setVerticalScrollbarLength] = useState(100)
const [verticalScrollbarPosition, setVerticalScrollbarPosition] = useState(0) const [verticalScrollbarPosition, setVerticalScrollbarPosition] = useState(0)
const [verticalScrollbarOnClick, setVerticalScrollbarOnClick] = useState(false) const [verticalScrollbarOnClick, setVerticalScrollbarOnClick] = useState(false)
const [verticalScrollbarOnTouch, setVerticalScrollbarOnTouch] = useState(false) const [verticalScrollbarOnTouch, setVerticalScrollbarOnTouch] = useState(false)
const [verticalScrollbarAutoHide, setVerticalScrollbarAutoHide] = useState(false)
const [horizontalScrollbarWidth, setHorizontalScrollbarWidth] = useState(0) const [horizontalScrollbarWidth, setHorizontalScrollbarWidth] = useState(0)
const [horizontalScrollbarLength, setHorizontalScrollbarLength] = useState(100) const [horizontalScrollbarLength, setHorizontalScrollbarLength] = useState(100)
const [horizontalScrollbarPosition, setHorizontalScrollbarPosition] = useState(0) const [horizontalScrollbarPosition, setHorizontalScrollbarPosition] = useState(0)
const [horizontalScrollbarOnClick, setHorizontalScrollbarOnClick] = useState(false) const [horizontalScrollbarOnClick, setHorizontalScrollbarOnClick] = useState(false)
const [horizontalScrollbarOnTouch, setHorizontalScrollbarOnTouch] = useState(false) const [horizontalScrollbarOnTouch, setHorizontalScrollbarOnTouch] = useState(false)
const [horizontalScrollbarAutoHide, setHorizontalScrollbarAutoHide] = useState(false)
const { const {
isPreventScroll, isPreventScroll,
@@ -170,12 +175,37 @@ const HideScrollbar = forwardRef<HideScrollbarElement, HideScrollbarProps>((prop
minHeight, minHeight,
scrollbarWidth, scrollbarWidth,
animationTransitionTime, animationTransitionTime,
autoHideWaitingTime,
..._props ..._props
} = props } = props
const isPreventAnyScroll = const isPreventAnyScroll =
isPreventScroll || isPreventVerticalScroll || isPreventHorizontalScroll isPreventScroll || isPreventVerticalScroll || isPreventHorizontalScroll
useEffect(() => {
if (autoHideWaitingTime === undefined) {
return
}
setVerticalScrollbarAutoHide(false)
if (autoHideWaitingTime > 0) {
setTimeout(() => {
setVerticalScrollbarAutoHide(true)
}, autoHideWaitingTime)
}
}, [autoHideWaitingTime, verticalScrollbarPosition])
useEffect(() => {
if (autoHideWaitingTime === undefined) {
return
}
setHorizontalScrollbarAutoHide(false)
if (autoHideWaitingTime > 0) {
setTimeout(() => {
setHorizontalScrollbarAutoHide(true)
}, autoHideWaitingTime)
}
}, [autoHideWaitingTime, horizontalScrollbarPosition])
const handleDefaultTouchStart = useCallback( const handleDefaultTouchStart = useCallback(
(event: React.TouchEvent) => { (event: React.TouchEvent) => {
if (event.touches.length !== 1 || isPreventScroll) { if (event.touches.length !== 1 || isPreventScroll) {
@@ -506,7 +536,9 @@ const HideScrollbar = forwardRef<HideScrollbarElement, HideScrollbarProps>((prop
((isHiddenVerticalScrollbarWhenFull ?? true) && ((isHiddenVerticalScrollbarWhenFull ?? true) &&
verticalScrollbarLength >= 100) verticalScrollbarLength >= 100)
} }
className={'scrollbar vertical-scrollbar'} className={`scrollbar vertical-scrollbar${
verticalScrollbarAutoHide ? ' hide' : ''
}`}
style={{ style={{
height: maskRef.current ? maskRef.current?.clientHeight - 1 : undefined, height: maskRef.current ? maskRef.current?.clientHeight - 1 : undefined,
top: maskRef.current?.clientTop, top: maskRef.current?.clientTop,
@@ -543,7 +575,9 @@ const HideScrollbar = forwardRef<HideScrollbarElement, HideScrollbarProps>((prop
((isHiddenHorizontalScrollbarWhenFull ?? true) && ((isHiddenHorizontalScrollbarWhenFull ?? true) &&
horizontalScrollbarLength >= 100) horizontalScrollbarLength >= 100)
} }
className={'scrollbar horizontal-scrollbar'} className={`scrollbar horizontal-scrollbar${
horizontalScrollbarAutoHide ? ' hide' : ''
}`}
style={{ style={{
width: maskRef.current ? maskRef.current?.clientWidth - 1 : undefined, width: maskRef.current ? maskRef.current?.clientWidth - 1 : undefined,
left: maskRef.current?.clientLeft, left: maskRef.current?.clientLeft,

View File

@@ -100,6 +100,7 @@ const ToolsFramework: React.FC = () => {
isShowVerticalScrollbar={true} isShowVerticalScrollbar={true}
scrollbarWidth={2} scrollbarWidth={2}
animationTransitionTime={300} animationTransitionTime={300}
autoHideWaitingTime={800}
ref={hideScrollbarRef} ref={hideScrollbarRef}
> >
<ul> <ul>