繁体   English   中英

如何在 div 中获取滚动位置并在 React 中设置状态

[英]How to get scroll position in a div and set state in React

我有一个可以在里面滚动的 div。 我想获取该 div 的滚动位置并将其设置为一个状态(然后通过 css 控制我的菜单及其动画)。 我尝试使用浏览器窗口获取滚动位置,但这在我正在使用的 div 中不起作用。 目前,我的菜单确实在 div 内正确滚动,但是当我使用鼠标在 div 内手动滚动时,它不会更改菜单。

我该怎么做?

应用程序.js:

import "./App.scss";

import { useState, useEffect } from 'react';



function App() {

  const [menuIndex, setMenuIndex] = useState(0);
  
  const menuIndexHandler = (index) => {
    setMenuIndex(index)
  }

  return (
    <div className="App">
      <div className="innerBox">
        <div className="menu">
          <div className="spaceHorizontal">

          </div>
   
          <a href="#summery">
          <div className={`menuItem  ${(menuIndex == 0) ? ' menuOpen' : ' menuClosed'} `} onClick={() =>menuIndexHandler(0)} >
            <label htmlFor="Summery Menu Label">             
             <div className="menuOpenAnimation"><a className="menuLabel">Summery</a></div>
            </label>
          </div>
          </a>
          <a href="#workhistory">
          <div className={`menuItem  ${(menuIndex == 1) ? ' menuOpen' : ' menuClosed'} `} onClick={() =>menuIndexHandler(1)}>
            <label htmlFor="Work History Menu Label">
              
              <div className="menuOpenAnimation"><a className="menuLabel">Work History </a></div>
            </label>
          </div>
          </a>
          <a href="#certifications">
          <div className={`menuItem  ${(menuIndex == 2) ? ' menuOpen' : ' menuClosed'} `} onClick={() =>menuIndexHandler(2)}>
            <label htmlFor="Certification Menu Label">
              
              <div className="menuOpenAnimation"><a className="menuLabel">Certifications</a></div>
            </label>
          </div>
          </a>
          <a href="#education">
          <div className={`menuItem  ${(menuIndex == 3) ? ' menuOpen' : ' menuClosed'} `} onClick={() =>menuIndexHandler(3)}>
            <label htmlFor="Education Menu Label">
              
              <div className="menuOpenAnimation"><a className="menuLabel">Education</a></div>
            </label>
          </div>
          </a>
        </div>
        <div className="content">
        
        <div className="spaceHorizontal">
            <h1>Digital Resume</h1>
       
        </div>
 
          <div className="contentScrollDiv">
            <div id="summery" className="contentSubSection">
            <p> Placeholder Text </p>
            <p> Placeholder Text </p>
            <p> Placeholder Text </p>
            <p> Placeholder Text </p>
            <p> Placeholder Text </p>
            <p> Placeholder Text </p>
            </div>
            <div className="contentSubSection">
              <p> Placeholder Text </p>
            <p> Placeholder Text </p>
            <p> Placeholder Text </p>
            <p> Placeholder Text </p>
            <p> Placeholder Text </p>
            <p> Placeholder Text </p>
            </div>
            <div className="contentSubSection">
              <p> Placeholder Text </p>
            <p> Placeholder Text </p>
            <p> Placeholder Text </p>
            <p> Placeholder Text </p>
            <p> Placeholder Text </p>
            <p> Placeholder Text </p>
            </div>
            <div className="contentSubSection">
            <p> Placeholder Text </p>
            <p> Placeholder Text </p>
            <p> Placeholder Text </p>
            <p> Placeholder Text </p>
            <p> Placeholder Text </p>
            <p> Placeholder Text </p>
            </div>
          </div>
        </div>
      </div>
 
    </div>
  );
}

export default App;

应用程序.scss:

@import url('https://fonts.googleapis.com/css2?family=Raleway&display=swap');

.App {
  background-color: #202020;
  height: 100vh;
  width: 100vw;
  display: flex;
  font-family: 'Raleway', sans-serif;
}

.backgroundParticles{
  z-index: 1;
}

.innerBox {
  width: 900px;
  height: 700px; 
  margin: auto;
  display: flex;
  flex-direction: row;
  z-index: 2;
}

.spaceHorizontal{
  height: 50px;
  padding-bottom: 25px;
}



.menu {
  background-color: #3F485F;
  height: 600px;
  width: 200px;
  display: flex;
  flex-direction: column;
  border-radius: 25px 0px 0px 25px;  
  
}

.menuItem {
  height: 40px;
  width: 164px;

  border-bottom: 1px solid white;
  
 
}

.menuLabel{
  z-index: 3;
  color: white;
  margin-top: 15px;
  padding-left: 5px;
}

.menuOpenAnimation{
  z-index: 2;
  width: 164px;
  height: 40px;
  position: absolute;
}

@keyframes menuOpenAnimation{
  from {background-color: rgb(131, 197, 190);
        width: 0px;}
  to {background-color: #BC7528;
       width: 164px;}
}

.menuOpen {
  animation-name: menuOpenAnimation;
  animation-duration: 0.5s;
  animation-fill-mode: forwards;  
  animation-timing-function: ease-out;
  background-color: #49B095;
}




.content {
  background-color: #F8F7F1;
  height: 600px;
  width: 100%;
  display: flex;
  flex-direction: column;
  border-radius: 0px 25px 25px 0px; 
}

h1 {
  text-align: center;
}

hr {
  width: 100%;
}





.contentScrollDiv {
  height: 100%;
  overflow-y: scroll;
  scroll-behavior: smooth;
  padding-inline: 25px;
  -ms-overflow-style: none;  /* IE and Edge */
  scrollbar-width: none;  /* Firefox */
}

.contentScrollDiv::-webkit-scrollbar {
  display: none;
}

a {
  color: black;
  text-decoration: none;
}



谢谢您的帮助。

我希望这个包会有所帮助react-perfect-scrollbar https://www.npmjs.com/package/react-perfect-scrollbar谢谢:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM