JavaScript getBoundingClientRect Returns 0

205 views Asked by At

html,body{
    height: 100%;
}

body{
    margin: 0;
    background-color: #0f0f0f;
    color: white;
    font-family: 'Ubuntu', sans-serif;
    display: grid;
    grid-template-columns: 1fr 8fr;
    


}

header{
    height: 5vh;
    grid-column: 1/3;
    grid-row:1/2 ;
    background-color: black;
    z-index: 2;
    display: block;
}



section{
    position: relative;
    display: flex;
    flex-direction: column;
    min-height: 300px;
    
    
    
}
.TopContent{
    height: 70vh;
    grid-column: 1/3;
    grid-row:2/3 ;
    background-color: white;
    z-index: 1;
}

.Content{
    grid-column: 1/3;
    
}


.TopNavigation{
    display: flex;
    flex-direction: column;
    
    
}


.TopNavBtn{
    background-color: #000000;
    text-align: center;
    vertical-align: middle;
    color: white;
    margin: 0px;
    border: 0px;
    height: 5vh;
    width: 90px;
    font-size: 25px;

    transition-duration: 0.3s;

}


.TopNavBtn:hover{
    height: 7vh;
    font-size: 27px;
    background-color: #272727;
    font-weight: bold;
}



.Navigation{
    grid-column: 1/2;
    background-color: #0f0f0f;
}






.Divider{
    aspect-ratio: 900/300;
    width: 100%;
    background-position: center;
    background-repeat: no-repeat;
    background-size: cover;
}

.Grad1
{
    
    background-image: url("img/svg/Grad1.svg");
}

.Grad2
{
    
    background-image: url("img/svg/Grad2.svg");
}

.Grad3
{
    
    background-image: url("img/svg/Grad3.svg");
}

.Grad4
{
    
    background-image: url("img/svg/Grad4.svg");
}

.RGrad1
{
    
    background-image: url("img/svg/RGrad1.svg");
}

.RGrad2
{
    
    background-image: url("img/svg/RGrad2.svg");
}

.RGrad3
{
    
    background-image: url("img/svg/RGrad3.svg");
}

.RGrad4
{
    
    background-image: url("img/svg/RGrad4.svg");
}




.b{
    background-color: #015657;
}





.g{
    background-color: #303030;
}



.w{
    background-color: white;
}









@keyframes logo {
    0%{background-image: url("img/grass.png");}
    25% {background-image: url("img/dia.png");}
    50%{background-image: url("img/spawner1.png");}
    75%{background-image: url("img/oak1.png");}
    100%{background-image: url("img/grass.png");}
}

.logo{
    background-image: url("grass.png");
    background-repeat: no-repeat;
    width: 200px;
    height: 200px;
    animation-name:logo;
    animation-duration: 10s;
    animation-play-state:paused ;
    animation-iteration-count:infinite ;
    align-items: center;
    align-content: center;
    margin: auto;
    
    
}

.logo:hover{
    animation-play-state:running ;
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" type="text/css" href="Project.css"/>
    <title>Document</title>
    
</head>
<body >
    <header id="TNav">
        <nav class="TopNavigation" id="xdd">
            <button class="TopNavBtn">xd</button>
        </nav>
        
    </header>
    
    <article class="TopContent">
        <div class="logo"></div>
    </article>






    <nav class="Navigation">

    </nav>
    


    <article class="Content"> 
        <section class=" b" >
            <p>Aliquid, ab? Quod nulla aliquam libero placeat et distinctio fugit maiores quisquam odit illo repellat, provident modi. Placeat, maiores facere, ut dolorem assumenda amet alias natus, expedita sit mollitia minima?</p>
        </section>

        <div class="Divider Grad1" ></div>

        <section class=" g">
            <p>Aliquid, ab? Quod nulla aliquam libero placeat et distinctio fugit maiores quisquam odit illo repellat, provident modi. Placeat, maiores facere, ut dolorem assumenda amet alias natus, expedita sit mollitia minima?</p>
        </section>

        <div class="Divider RGrad1" ></div>

        <section class="b">
            <p>Tenetur mollitia esse omnis rem voluptatum, quaerat, delectus nulla quasi similique deleniti tempora a libero ducimus, sit asperiores fugiat temporibus error. Alias consectetur sit odio? Praesentium, reiciendis dicta. Ducimus, consequatur.</p>
        </section>

        <div class="Divider Grad2" ></div>

        <section class="g">
            <p>Debitis sed ullam assumenda quasi! Quibusdam, laudantium minus cum delectus quasi facilis, quam amet alias ex, voluptatibus cumque ratione praesentium laborum sint nemo eaque sunt tempora qui ad odio consequatur!</p>
        </section >

        <div class="Divider RGrad2" ></div>

        <section class="b">
            <p>Autem ratione tempora officiis reprehenderit, voluptatem rem sit quas veritatis! Aspernatur rerum nam architecto ex voluptates earum illo rem quia, culpa quaerat fuga voluptatibus impedit eaque iste sint nostrum facilis!</p>
        </section>

        <div class="Divider Grad3" ></div>

        <section class="g">
            <p>Autem ratione tempora officiis reprehenderit, voluptatem rem sit quas veritatis! Aspernatur rerum nam architecto ex voluptates earum illo rem quia, culpa quaerat fuga voluptatibus impedit eaque iste sint nostrum facilis!</p>
        </section>

        <div class="Divider RGrad3" ></div>

        <section class="b">
            <p>Autem ratione tempora officiis reprehenderit, voluptatem rem sit quas veritatis! Aspernatur rerum nam architecto ex voluptates earum illo rem quia, culpa quaerat fuga voluptatibus impedit eaque iste sint nostrum facilis!</p>
        </section>
    </article>
       

    








    <script>
        let NavBar = document.getElementById("xdd");
        let bound = NavBar.getBoundingClientRect();

        window.onscroll= function (){
            console.log("scrolled")
            console.log(bound)

            if(bound.top >=0)
            {
                
            }
            else
            {
                console.log("isnt")
            }

            
        }
        // to check if the DOM is loaded
        document.addEventListener("DOMContentLoaded", (event) =>{
            console.log("ready");
        })
    </script>


</body>
</html>

I am trying to detected whether an Elemnt is inside the Viewport. When i looked this up, i was directed to usimg getBoundingClientRect to get its location relative to the Viewport.

However, when i tried implementing this solution, it didnt work, as this always returned a DOMRect with the x,y, top and left values being 0 and the others staying constant no matter where i scroll.

The html element(s) i want to get the location of:

<header id="TNav">
        <nav class="TopNavigation" id="xdd">
            <button class="TopNavBtn">xd</button>
        </nav>
        
    </header>

Its CSS:

header{
    height: 5vh;
    grid-column: 1/3;
    grid-row:1/2 ;
    background-color: black;
    z-index: 2;
    display: block;
}

.TopNavigation{
    display: flex;
    flex-direction: column;
    
    
}

The JS code:

let NavBar = document.getElementById("xdd");
        let bound = NavBar.getBoundingClientRect();

        window.onscroll= function (){
            console.log("scrolled")
            console.log(bound)

            if(bound.top >=0)
            {
                
            }
            else
            {
                console.log("isnt")
            }

            
        }
        // to check if the DOM is loaded
        document.addEventListener("DOMContentLoaded", (event) =>{
            console.log("ready");
        })

the code is implemented at the very bottom of the <body>.

I tried testing if the DOM is loaded and changing which element i read the location of.

Here is what the the getBoundingClientRect() returns: returned values

1

There are 1 answers

0
SpeedLight1221 On

Thanks to user Unmitigated, i now have the answer:

The let bound = NavBar.getBoundingClientRect had to be moved inside the window.onscroll event handler, like so:

<script>
        let NavBar = document.getElementById("xdd");
        

        window.onscroll= function (){
            let bound = NavBar.getBoundingClientRect();
            console.log("scrolled")
            console.log(bound)

            if(bound.top >=0)
            {
                
            }
            else
            {
                console.log("isnt")
            }

            
        }
        // to check if the DOM is loaded
        document.addEventListener("DOMContentLoaded", (event) =>{
            console.log("ready");
        })
    </script>