Add auto hide scrollbar to HideScrollbar #34
@@ -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 {
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user