程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了使用粘性导航栏自动滚动 Flexbox 列大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决使用粘性导航栏自动滚动 Flexbox 列?

开发过程中遇到使用粘性导航栏自动滚动 Flexbox 列的问题如何解决?下面主要结合日常开发的经验,给出你关于使用粘性导航栏自动滚动 Flexbox 列的解决方法建议,希望对你解决使用粘性导航栏自动滚动 Flexbox 列有所启发或帮助;

由于这个问题最容易用例子来解释,这里有一个 CodeSandBox 来说明:https://codesandbox.io/s/github/metal450/react-scroll-sticky。该项目使用 React、TailwindCSS 和 react-scroll 构建以实现平滑滚动。

我正在尝试使用粘性导航栏创建链接以在 flexBox 中滚动列/行。只要导航栏相对于 FlexBox 的主轴“粘性”,而不是它的横轴,它就可以很好地工作。在 CodeSandBox 中,如果输出适当宽(也就是在大型设备上),您会看到侧边栏出现在左侧,每个链接都会滚动右侧的列,将其对应的项目与容器顶部对齐.

但是,如果您稍微缩小输出直到看到“小型设备”布局,您将能够看到问题。现在“侧边栏”位于顶部,如果您单击导航按钮,它会滚动以便所选项目隐藏在导航栏后面。

这确实是有道理的:滚动条相对于一个容器滚动,并且该容器的顶部位于粘性导航栏的后面。但是,我想要的结果是单击“项目 1”并使其滚动,以便项目 1 位于可滚动区域的顶部(不隐藏在粘性导航栏下方)。

我对 flexBox 还很陌生,无论我尝试什么,我似乎都无法弄清楚所需的行为。任何帮助将不胜感激。

解决方法

扩展@YellowAfterlife 的答案,我会使用 refs 而不是 document.getElementById

此外,您只需要“移动”上的偏移量,因此您可以使用 react-responsive 之类的包。

import React,{ useRef,useState,useEffect } from "react";
import { Link } from "react-scroll";
import { useMediaQuery } from "react-responsive";

function App() {
  const items = ["item1","item2","item3","item4","item5","item6","item7"];
  const container = "scrollContainer";

  const menuRef = useRef(null);
  const [menuHeight,setMenuHeight] = useState(0);

  const isMobile = useMediaQuery({
    query: "(max-width: 767pX)"
  });

  useEffect(() => {
    setMenuHeight(menuRef.current.clientHeight);
  },[menuRef]);

  return (
    <main className="flex absolute right-0 bottom-0 left-0 top-0">
      <div
        id={Container}
        className="md:flex-row flex flex-col overflow-auto border border-box"
        style={{ flexBasis: "65%",flex: 2 }}
      >
        <div
          ref={menuRef}
          className="md:w-64 p-3 border sticky top-0 flex-shrink-0 bg-white border-box"
        >
          {items.map((item) => (
            <div className="cursor-pointer m-2 underline" key={item}>
              <Link
                to={item}
                smooth={truE}
                duration={500}
                spy={truE}
                containerId={Container}
                offset={isMobile ? -menuHeight : null}
              >
                {item}
              </Link>
            </div>
          ))}
        </div>

        <div style={{ flex: 1 }}>
          {items.map((item) => (
            <div key={item} id={item} className="h-64 border m-2 bg-gray-100">
              {item}
            </div>
          ))}
        </div>
      </div>
    </main>
  );
}

export default App;

这是Special Information Tone

,

react-scroll supports offset 参数,您可以使用它来动态计算菜单高度:

import { Link } from 'react-scroll';

function App() {

    const items = ['item1','item2','item3','item4','item5','item6','item7'];
    const container = "scrollContainer";
    const menu = "scrollMenu";

    function getScrollOffset() {
        if (true/* insert a condition for navbar being on top */) {
            return -document.getElementById(menu).offsetHeight;
        } else return 0;
    }

    return (
        <main className="flex absolute right-0 bottom-0 left-0 top-0">

            <div id={Container} className="md:flex-row flex flex-col overflow-auto border border-box" style={{ flexBasis: "65%",flex: 2}}>

                <div className="md:w-64 p-3 border sticky top-0 flex-shrink-0 bg-white border-box" id={menu}>
                    {items.map((item) => <div className="cursor-pointer m-2 underline" key={item}>
                        <Link to={item} smooth={truE} duration={500} spy={truE} offset={getScrollOffset()} containerId={Container}>{item}</Link>
                    </div>)}
                </div>

                <div style={{ flex: 1 }}>
                    {items.map((item) => <div key={item} id={item} className="h-64 border m-2 bg-gray-100" >{item}</div>)}
                </div>

            </div>

        </main>
    );
}

export default App;

虑到滚动已经由 JavaScript 端处理,仅使用 CSS 的解决方案将远没有那么优雅,并且不会提供任何特别的好处。

大佬总结

以上是大佬教程为你收集整理的使用粘性导航栏自动滚动 Flexbox 列全部内容,希望文章能够帮你解决使用粘性导航栏自动滚动 Flexbox 列所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。