【发布时间】:2022-02-21 16:20:03
【问题描述】:
我有一个简单的 react 项目:
有一个水平菜单和内容。
通过单击菜单项 - 滚动到当前部分。
滚动内容时,切换活动菜单项。
导航:
<ul
className="nav list-unstyled d-flex flex-nowrap fixed-top"
ref={scrollNavRefs}
onScroll={handleScroll}
>
{list.map((item, i) => (
<li className="nav-item" key={i}>
<a
href={`#s-${i}`}
className={`nav-link text-nowrap ${
active === i ? "text-danger" : ""
}`}
onClick={scrollTo(i)}
>
{item}
</a>
</li>
))}
</ul>
部分:
<ul className="mb-100 list-unstyled">
{list.map((item, i) => (
<li id={`s-${i}`} ref={scrollRefs.current[i]} className="py-100 px-3">
<h3>{item}</h3>
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Nisi,
dicta.
</p>
</li>
))}
</ul>
>>>:
const scrollRefs = useRef([]);
const scrollNavRefs = useRef();
const [active, setActive] = useState(0);
const list = ["Item 1", "Item 2", "Item 3", "Item 4", "Item 5"];
scrollRefs.current = [...Array(list.length).keys()].map(
(_, i) => scrollRefs.current[i] ?? createRef()
);
const scrollTo = (index) => () => {
scrollRefs.current[index].current.scrollIntoView({ behavior: "smooth" });
setActive(index);
};
const scrollHandler = () => {
const scrollRefsElements = scrollRefs.current;
scrollRefsElements.forEach((el, i) => {
const rect = el.current.getBoundingClientRect();
const elemTop = rect.top;
const elemBottom = rect.bottom;
const isVisible = elemTop >= 0 && elemBottom <= window.innerHeight;
if (isVisible) {
setActive(i);
}
});
};
const onWheel = (e) => {
if (e.deltaY === 0) return;
e.preventDefault();
const scrollNavRefsElement = scrollNavRefs.current;
const scrollNavRefsElementLeft = scrollNavRefs.current.scrollLeft;
scrollNavRefsElement.scrollTo({
left: scrollNavRefsElementLeft + e.deltaY,
behavior: "smooth"
});
};
useEffect(() => {
window.addEventListener("scroll", scrollHandler, true);
return () => {
window.removeEventListener("scroll", scrollHandler, true);
};
}, []);
useEffect(() => {
scrollNavRefs.current.addEventListener("wheel", onWheel, true);
return () => {
scrollNavRefs.current.removeEventListener("wheel", onWheel, true);
};
}, []);
问题:如何链接菜单和内容,以便在滚动消费内容时,当菜单项的活动类别发生变化时,菜单滚动以使活动菜单项可见?类推example。
附注:
- 看看 320px 扩展
- 垂直滚动内容:
- 如果第 1 节 - 则活动菜单项 1,如果第 2 节 - 则活动菜单项 2,...
- 如果活动菜单项不可见 - 则菜单水平滚动以使菜单项可见
- 横向卷轴:
- 如果活动菜单项 1 - 垂直滚动到第 1 部分,如果活动菜单项 2 - 垂直滚动到第 2 部分,...如 example 或仅通过单击。
【问题讨论】:
-
你能分享更多的行为吗?例如,当我单击选项卡 3 时,应该激活哪个选项卡菜单?因为我可以看到这 3 个标签的内容。
-
我编辑我的问题 "P.S: ^"
-
回答如下。如果它对你有帮助。请点赞:D
标签: javascript reactjs mousewheel