scrollLeft 不适用于 useRef 访问的元素

问题描述 投票:0回答:1

所以我有一个元素容器,每当我添加新元素时,我希望它使用

scrollLeft
一直滚动到右侧。我通过 u
seRef
访问容器 div 并将其类名设置为
overflow-x-scroll
但无论我动态计算滚动距离还是设置固定距离,它似乎都不起作用。

以下是我的实现:

const thumbnailContainer = useRef<HTMLDivElement>(null)
const addPage = () => {
        editor?.setPageContainer(prev => [...prev, editor?.pageContainer.length])
        editor?.setCurrentPage(editor?.pageContainer.length)
        if (thumbnailContainer.current) {
            const maxScrollLeft =
                thumbnailContainer.current.scrollWidth - thumbnailContainer.current.clientWidth;
            thumbnailContainer.current.scrollLeft += maxScrollLeft;
        }
    }
return (
        <div
            className='h-[130px] top-[calc(100%-170px)] items-center absolute z-50 bg-gray-200 flex p-2 gap-5 overflow-x-scroll'
            style={style} ref={thumbnailContainer}>
            {editor?.pageContainer?.map((i) => {
                return <TooltipProvider key={i}>
                    <Tooltip delayDuration={200}>
                        <TooltipTrigger className={`h-[80%] min-w-[140px] flex justify-center items-center`}>
                            <Button  variant='outline'
                                     className={`h-full min-w-[100%] ${editor?.currentPage === i && 'border border-black'}`}
                                    onClick={() => handleChangePage(i)}>
                            </Button>
                        </TooltipTrigger>
                        <TooltipContent side="top" sideOffset={10}>
                            <p>Page {i + 1}</p>
                        </TooltipContent>
                    </Tooltip>
                </TooltipProvider>
            })}
            <Button variant='outline' className='h-[80%] min-w-[140px] shrink-0 grow-0 flex justify-center items-center text-5xl' onClick={addPage}>+</Button>
        </div>
    );
reactjs tailwind-css
1个回答
0
投票

import { useEffect, useRef, useState } from "react";
import "./styles.css";

const App = () => {
  const scrollToDiv = useRef(null);
  const [items, setItems] = useState(["hi", "hello", "master"]);
  const generateRandomWord = () => {
    const word = "demo";
    setItems((prev) => {
      return [...prev, word];
    });
  };

  useEffect(() => {
    if (scrollToDiv.current) {
      scrollToDiv.current.scrollIntoView({
        behavior: "smooth",
        block: "nearest",
      });
    }
  }, [items]);

  return (
    <div className="container">
      <div className="x_container">
        {items?.map((a, i) => {
          return (
            <span key={i}>
              {i + 1}. {a}
            </span>
          );
        })}
        <div ref={scrollToDiv}></div>
      </div>
      <button onClick={generateRandomWord}>Add random word</button>
    </div>
  );
};

export default App;
.container {
  display: flex;
  flex-direction: column;
  gap: 1rem;
  justify-content: center;
  align-items: center;
}

.x_container {
  display: flex;
  gap: 8px;
  border: 1px solid grey;
  width: 300px;
  overflow-x: scroll;
  padding: 1rem 0.5rem;
}

.x_container span {
  text-wrap: nowrap;
}
.x_container::-webkit-scrollbar {
  /* display: none; */
}

嘿,如果你正在寻找这样的东西:每次新项目添加到列表中时,它应该滚动到最后一个项目,你可以使用这个

https://codesandbox.io/p/sandbox/gy9qrg

© www.soinside.com 2019 - 2024. All rights reserved.