parent
e6de5f1c09
commit
50aa62e32f
1 changed files with 88 additions and 0 deletions
@ -0,0 +1,88 @@ |
||||
import React, { useState, useEffect } from "react"; |
||||
import _ from "lodash"; |
||||
|
||||
export default function Dots() { |
||||
const [scroll, setScroll] = useState(null); |
||||
const [active, setActive] = useState(null); |
||||
const height = window.innerHeight; |
||||
useEffect(() => { |
||||
window.addEventListener( |
||||
"scroll", |
||||
_.debounce(() => setScroll(window.scrollY), 20) |
||||
); |
||||
}, []); |
||||
|
||||
useEffect(() => { |
||||
if (window.scrollY < height) { |
||||
setActive(() => 0); |
||||
} |
||||
if (window.scrollY > height && window.scrollY < 2 * height) { |
||||
setActive(() => 1); |
||||
} |
||||
if (window.scrollY > height && window.scrollY < 2 * height) { |
||||
setActive(() => 2); |
||||
} |
||||
if (window.scrollY > 2 * height && window.scrollY < 2.3 * height) { |
||||
setActive(() => 3); |
||||
} |
||||
if (window.scrollY > 2.3 * height && window.scrollY < 2.5 * height) { |
||||
setActive(() => 4); |
||||
} |
||||
if (window.scrollY > 2.5 * height && window.scrollY < 3 * height) { |
||||
setActive(() => 5); |
||||
} |
||||
if (window.scrollY > 3 * height && window.scrollY < 4 * height) { |
||||
setActive(() => 6); |
||||
} |
||||
if (window.scrollY > 4 * height && window.scrollY < 4.99 * height) { |
||||
setActive(() => 7); |
||||
} |
||||
if (window.scrollY > 4.99 * height && window.scrollY < 5.5 * height) { |
||||
setActive(() => 8); |
||||
} |
||||
if (window.scrollY > 5.5 * height && window.scrollY < 7 * height) { |
||||
setActive(() => 9); |
||||
} |
||||
}, [scroll]); |
||||
|
||||
return ( |
||||
<div className="flex flex-col items-center fixed z-50 top-1/2 lg:right-3 xl:right-5 transform -translate-y-1/2"> |
||||
{[0, 1, 2, 2.35, 2.5, 3, 4, 4.99, 5.5, 7].map((position, index) => ( |
||||
<Dot |
||||
key={index} |
||||
value={position} |
||||
active={Number(index) === active} |
||||
setActive={setActive} |
||||
index={index} |
||||
/> |
||||
))} |
||||
</div> |
||||
); |
||||
} |
||||
|
||||
const Dot = ({ value, active, index, setActive }) => { |
||||
const click = () => { |
||||
setActive(() => index); |
||||
window.scrollTo(0, value * window.innerHeight); |
||||
}; |
||||
return ( |
||||
<div |
||||
className={_.join( |
||||
[ |
||||
"rounded-full mb-2 cursor-pointer transition-all", |
||||
active ? "p-0.5 border-2" : "p-0", |
||||
], |
||||
" " |
||||
)} |
||||
style={{ border: active ? "2px solid blue" : "" }} |
||||
onClick={() => click()} |
||||
> |
||||
<div |
||||
className={_.join( |
||||
["w-3.5 h-3.5 rounded-full", active ? "bg-blueC0" : "bg-blue90"], |
||||
" " |
||||
)} |
||||
></div> |
||||
</div> |
||||
); |
||||
}; |
Loading…
Reference in new issue