admin管理员组

文章数量:1356560

Im trying to use simple jquery offset() and animate to make my div scroll to the desired div when the user clicks on a link.

Basically, when the user clicks blog it will go to test1 user clicks Contact it will move to test2 user clicks Work it will move to test3.

I implemented some code I had used in a previous project (it had worked before) but the scrolls are not working correctly this time and I really don't know the reason why. I tried searching for a solution but web development has been an on and off thing for me and I don't understand some of the explanations :/ Any help would be appreciated.

EditOne: had to update the html, still not working.

The HTML:

<html>
<head>
<meta name="description" content="" />
<meta name="keywords" content="" />
<meta name="author" content="" />
<script type="text/javascript" src="jquery.js"></script>
<link rel="stylesheet" type="text/css" href="index.css"  />
<link rel="stylesheet" type="text/css" href="reset.css"  />


<title>Bryan the Lion</title>
</head>

<body>
    <script type="text/javascript">
    function go_One(){
    var divPosition = $('.test1').offset();
    $('#main_wrapper #main').animate({scrollTop: divPosition.top}, "fast");
    }
    </script>
    <script type="text/javascript">
    function go_Two(){
    var divPosition = $('.test2').offset();
    $('#main_wrapper #main').animate({scrollTop: divPosition.top}, "fast");
    }
    </script>
    <script type="text/javascript">
    function go_Three(){
    var divPosition = $('.test3').offset();
    $('#main_wrapper #main').animate({scrollTop: divPosition.top}, "fast");
    }
    </script>
    <div id = "header">
        <h1>Title</h1>
    </div>
    <div id = "main_box">
        <div id = "designHex">

        </div>
        <div id ="nav">
            <ul>
            <li id = "Blog"><a href="#" onclick= "go_One()"></a></li>
            <li id = "Contact"><a href="#"onclick= "go_Two()"></a></li>
            <li id = "Work"><a href="#" onclick= "go_Three()"></a></li> 
            </ul>
        </div>
        <div id = "main_wrapper">
            <div id ="main">
                <div class = "test1">
                    <p>some div</p>
                </div>
                <div class = "test2" >
                    <p>some div2</p>
                </div>  
                <div class = "test3" >
                    <p>some div3</p>
                </div>  
            </div>
        </div>

    </div>
</body>


</html>

The CSS: Of most importance here I think are main_wrapper, main, and test(1)(2)(3)

body{
height: 100% ;
background: url(images/gplaypattern.png); 
}
@font-face {
    font-family: "AlexBrush";
    src: url(fonts/AlexBrush-Regular.ttf) format("truetype");
}
#header{
height: 100px ;
margin-bottom: 20px ;
}
#main_box{   
margin: 0 auto ;
width: 80% ;
height: 52  0px ;

}
#main_wrapper{
margin-left: 45% ;      
width: 67%;
    overflow: hidden;
}
#main_wrapper #main{
   width: 103%;
    height: 500px ;
    overflow-y:scroll; 
}
.test1{
height: 500px ;
background: yellow;
}
.test2{
height: 500px ;
background: blue;
}
.test3{
height: 500px ;
background: gray;
}
#nav{
float: left;
width: 275px ;
height: 450px ;
margin-left: 3% ;
}
#nav ul li a{
display: block;
width: 100% ;
height: 150px ;
}
#nav ul li a:hover{
cursor: pointer;
}
#nav #Blog{
background: url(images/Blog.png);
}
#nav #Blog:hover{
background: url(images/Blog_hover.png);
}
#nav #Contact{
background: url(images/Contact.png);
}
#nav #Contact:hover{
background: url(images/Contact_hover.png);
}
#nav #Work{
background: url(images/Work.png);
}
#nav #Work:hover{
background: url(images/Work_hover.png);
}
#designHex{
background: rgba(255,255,255, 0.3);
height: 150px ;
width: 150px ;
position: absolute;
top: 50px ;
left: 5% ;
}

Im trying to use simple jquery offset() and animate to make my div scroll to the desired div when the user clicks on a link.

Basically, when the user clicks blog it will go to test1 user clicks Contact it will move to test2 user clicks Work it will move to test3.

I implemented some code I had used in a previous project (it had worked before) but the scrolls are not working correctly this time and I really don't know the reason why. I tried searching for a solution but web development has been an on and off thing for me and I don't understand some of the explanations :/ Any help would be appreciated.

EditOne: had to update the html, still not working.

The HTML:

<html>
<head>
<meta name="description" content="" />
<meta name="keywords" content="" />
<meta name="author" content="" />
<script type="text/javascript" src="jquery.js"></script>
<link rel="stylesheet" type="text/css" href="index.css"  />
<link rel="stylesheet" type="text/css" href="reset.css"  />


<title>Bryan the Lion</title>
</head>

<body>
    <script type="text/javascript">
    function go_One(){
    var divPosition = $('.test1').offset();
    $('#main_wrapper #main').animate({scrollTop: divPosition.top}, "fast");
    }
    </script>
    <script type="text/javascript">
    function go_Two(){
    var divPosition = $('.test2').offset();
    $('#main_wrapper #main').animate({scrollTop: divPosition.top}, "fast");
    }
    </script>
    <script type="text/javascript">
    function go_Three(){
    var divPosition = $('.test3').offset();
    $('#main_wrapper #main').animate({scrollTop: divPosition.top}, "fast");
    }
    </script>
    <div id = "header">
        <h1>Title</h1>
    </div>
    <div id = "main_box">
        <div id = "designHex">

        </div>
        <div id ="nav">
            <ul>
            <li id = "Blog"><a href="#" onclick= "go_One()"></a></li>
            <li id = "Contact"><a href="#"onclick= "go_Two()"></a></li>
            <li id = "Work"><a href="#" onclick= "go_Three()"></a></li> 
            </ul>
        </div>
        <div id = "main_wrapper">
            <div id ="main">
                <div class = "test1">
                    <p>some div</p>
                </div>
                <div class = "test2" >
                    <p>some div2</p>
                </div>  
                <div class = "test3" >
                    <p>some div3</p>
                </div>  
            </div>
        </div>

    </div>
</body>


</html>

The CSS: Of most importance here I think are main_wrapper, main, and test(1)(2)(3)

body{
height: 100% ;
background: url(images/gplaypattern.png); 
}
@font-face {
    font-family: "AlexBrush";
    src: url(fonts/AlexBrush-Regular.ttf) format("truetype");
}
#header{
height: 100px ;
margin-bottom: 20px ;
}
#main_box{   
margin: 0 auto ;
width: 80% ;
height: 52  0px ;

}
#main_wrapper{
margin-left: 45% ;      
width: 67%;
    overflow: hidden;
}
#main_wrapper #main{
   width: 103%;
    height: 500px ;
    overflow-y:scroll; 
}
.test1{
height: 500px ;
background: yellow;
}
.test2{
height: 500px ;
background: blue;
}
.test3{
height: 500px ;
background: gray;
}
#nav{
float: left;
width: 275px ;
height: 450px ;
margin-left: 3% ;
}
#nav ul li a{
display: block;
width: 100% ;
height: 150px ;
}
#nav ul li a:hover{
cursor: pointer;
}
#nav #Blog{
background: url(images/Blog.png);
}
#nav #Blog:hover{
background: url(images/Blog_hover.png);
}
#nav #Contact{
background: url(images/Contact.png);
}
#nav #Contact:hover{
background: url(images/Contact_hover.png);
}
#nav #Work{
background: url(images/Work.png);
}
#nav #Work:hover{
background: url(images/Work_hover.png);
}
#designHex{
background: rgba(255,255,255, 0.3);
height: 150px ;
width: 150px ;
position: absolute;
top: 50px ;
left: 5% ;
}
Share Improve this question asked May 21, 2014 at 8:15 Bryan FajardoBryan Fajardo 1611 gold badge3 silver badges15 bronze badges 8
  • Does the console return any error when you load the page / click on the link ? By the way, your code contains a lot of errors. – enguerranws Commented May 21, 2014 at 8:30
  • It says uncaught syntax error: Unexpected token ILLEGAL – Bryan Fajardo Commented May 21, 2014 at 8:32
  • So correct your code, and that will be fine :) – enguerranws Commented May 21, 2014 at 8:34
  • actually, nvm, I had changed something in the index.php. But I reverted it and the console is not showing any errors. srry. but its not working – Bryan Fajardo Commented May 21, 2014 at 8:34
  • Would you be so kind as to point the errors to me? I mean, there is a reason I am posting this on stack overflow, if I knew how to correct the errors myself I would have done it. – Bryan Fajardo Commented May 21, 2014 at 8:39
 |  Show 3 more ments

2 Answers 2

Reset to default 9

You need to take into account the scrollTop AND offset of the parent div:

JSFiddle: http://jsfiddle/TrueBlueAussie/Uafxz/2/

function scrollTo(selector) {
    var offset = $(selector).offset();
    var $main = $('#main');
    $main.animate({
        scrollTop: offset.top - ($main.offset().top - $main.scrollTop())
    }, "fast");
}

I changed your code to use a single function (passing the target selector). I removed the second id selector as ids are unique and id lookup is the fastest type of lookup anyway (no point slowing it down with a second search).

Note: I had to hide your designHex element for the JSFiddle as it overlapped the first link.

You actually don't target the good element to animate scrollTop :

$('html,body').animate({scrollTop: divPosition.top}, "fast"); // instead of #main_wrapper #main

And as said in ment, your code contains a lot of errors or non-standard notation. For example, you use 3 script tag and 3 function that do the same job. That could be done with only one.

本文标签: javascriptscrollTop offset() not animatingworking correctly with divs inside of containerStack Overflow