Amit Sharma
Amit Sharma

Reputation: 61

How to get scroll Position in reactjs when click on button

As you can see it I am not able to scroll down the page when I click on the button, This all code running in one file in App.js
Even I tried with useRef() and UseState() also but not working
I need help in JavaScript logic only
Javascript:

const myFunction = () => {
        const element = document.getElementById("myDIV");
        element.scrollLeft = 50;
        element.scrollTop = 10;
    };

HTML:

<div
    id="myDiv"
    style={{ height: "250px", width: "250px", overflow: "auto" }}
>
        <div
                id="content"
                style={{
                height: "800px",
                width: "2000px",
                backgroundColor: "coral",
            }}
        >
        <button onClick={myFunction}>Scroll</button>
        <p>Some text inside a div element.</p>
        <p>Some text inside a div element.</p>
        <p>Some text inside a div element.</p>
        <p>Some text inside a div element.</p>
    </div>
</div>

Upvotes: 1

Views: 3252

Answers (2)

Maxim Vladimirovich
Maxim Vladimirovich

Reputation: 21

I think this is what you wanted. Since the "scroll" button dissapears after the scroll you can

import React, { useEffect, useState } from "react";
import "./App.css";

function App() {
const [scrollPos, setScrollPos] = useState(0);

useEffect(() => {
  setScrollPos(scrollPos + 100);
}, []);

function myFunction() {
// Get the scrollable element which is the parent div.
  let element = document.getElementById("myDiv");
  // Set this to whatever you need. Right now it will start at      100, then go to 200, 300...
  setScrollPos(scrollPos + 100);

  // Calls the scroll function.
  element.scroll({
    // Top is for the y position.
    top: scrollPos,
    //Use left for x position.
    //left: 100
    // It looks nicer if the scroll is smooth
    behavior: "smooth"
  });
}

return (
<>
  <div
    id="myDiv"
    style={{ height: "250px", width: "250px", overflow: "auto" }}
  >
    <div
      id="content"
      style={{
        height: "800px",
        width: "2000px",
        backgroundColor: "coral"
      }}
    >
      <button
        onClick={myFunction}
        //Add this is you want the button to stay in the corner.
        //style={{ position: "absolute" }}
      >
        Scroll
      </button>
      <br />
      <input onClick={myFunction} type="radio" name="s" id="s" />
      <label onClick={myFunction} htmlFor="">
        Salary Person
      </label>
      <br />
      <input onClick={myFunction} type="radio" name="s" id="s" />
      <label onClick={myFunction} htmlFor="">
        Salary Person
      </label>
      <br />
      <input onClick={myFunction} type="radio" name="s" id="s" />
      <label onClick={myFunction} htmlFor="">
        Salary Person
      </label>
      <p>Some text inside a div element.</p>
      <p>Some text inside a div element.</p>
      <p>Some text inside a div element.</p>
      <p>Some text inside a div element.</p>
    </div>
  </div>
</>

); }

export default App;

Upvotes: 1

User456
User456

Reputation: 1301

Here:

const element = document.getElementById("myDIV");

the ID is wrong. It should be myDiv because you set the div's ID to myDiv:

<div
    id="myDiv"
    style={{ height: "250px", width: "250px", overflow: "auto" }}
>

and also you can use the scroll function of Element instead of setting scrollLeft and scrollTop:

const myFunction = () => {
  const element = document.getElementById("myDiv");
  element.scroll(50, 10);
}

But I recommend using refs (I know you mentioned it but I'm not sure if you used it correctly).

Create a ref:

const divRef = useRef();

Assign the ref to the div:

<div
    id="myDiv"
    ref={divRef}
    style={{ height: "250px", width: "250px", overflow: "auto" }}
>

Then scroll it (you don't need the element variable anymore):

const myFunction = () => {
  divRef.current.scroll(50, 10);
};

Upvotes: 1

Related Questions