jQuery scrollTop - 错误哈希问题

时间:2015-04-04 18:38:23

标签: javascript jquery

我正在尝试将scrollTop动画设置为驻留在全屏<section>内的锚点,但在第一次点击时不会滚动到右锚点。这是我的代码。

<nav id="scroller"> <a href="#subBox1">Scroll me to sub 1</a>
 <a href="#subBox2">Scroll me to sub 2</a>
 <a href="#subBox3">Scroll me to sub 3</a>

</nav>
<section id="boxTop"></section>
<section id="boxMaster">
    <section id="subBox1">
        <p>Hello. I am the Sub 1!</p>
    </section>
    <section id="subBox2">
        <p>Hello. I am the Sub 2!</p>
    </section>
    <section id="subBox3">
        <p>Hello. I am the Sub 3!</p>
    </section>
</section>

$("#scroller a").click(function () {
    $('#boxMaster').animate({
        scrollTop: $(this.hash).offset().top
    }, 700);
    $("#scroller a").removeClass("active");
    $(this).addClass("active");
});

fiddle

&#13;
&#13;
$("#scroller a").click(function() {
  $('#boxMaster').animate({
    scrollTop: $(this.hash).offset().top
  }, 700);
  $("#scroller a").removeClass("active");
  $(this).addClass("active");
});
&#13;
html,
body {
  margin: 0;
  padding: 0;
  width: 100%;
  height: 100%;
  overflow: hidden;
}
#scroller {
  position: fixed;
  top: 0;
  height: 30px;
  text-align: center;
}
#scroller a {
  color: #fff;
  margin: 0 20px;
  text-decoration: none;
}
#scroller a.active {
  font-weight: bold;
  text-decoration: underline;
}
#boxTop {
  width: 100%;
  height: 100%;
  background: red;
}
#boxMaster {
  width: 100%;
  height: 100%;
  background: blue;
  overflow: hidden;
}
#boxMaster #subBox1,
#boxMaster #subBox2,
#boxMaster #subBox3 {
  width: 100%;
  height: 100%;
  display: table;
}
p {
  color: #fff;
  text-align: center;
  display: table-cell;
  vertical-align: middle;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<nav id="scroller"> <a href="#subBox1">Scroll me to sub 1</a>
  <a href="#subBox2">Scroll me to sub 2</a>
  <a href="#subBox3">Scroll me to sub 3</a>

</nav>
<section id="boxTop"></section>
<section id="boxMaster">
  <section id="subBox1">
    <p>Hello. I am the Sub 1!</p>
  </section>
  <section id="subBox2">
    <p>Hello. I am the Sub 2!</p>
  </section>
  <section id="subBox3">
    <p>Hello. I am the Sub 3!</p>
  </section>
</section>
&#13;
&#13;
&#13;

3 个答案:

答案 0 :(得分:3)

将当前滚动值添加到offset().top(),后者相对于帧的顶部,并删除this.hash。请改用this.href

$("#scroller a").click(function () {
    var y=$('#boxMaster').scrollTop()
    $('#boxMaster').animate({
        scrollTop: $(this.href).offset().top + y
    }, 100);
});

答案 1 :(得分:1)

您需要将#boxMaster元素 relative 滚动到元素中相对于#boxMaster元素{{1}的链接位置位于top元素内的位置。

您可以通过添加body元素的#boxMaster值及其scrollTop()位置,然后从链接的偏移top值中减去该值来实现此目的:

top

Updated Example

$(this.hash).offset().top - $('#boxMaster').position().top + $('#boxMaster').scrollTop()

您可能还需要使用var $boxMaster = $('#boxMaster'); $boxMaster.animate({ scrollTop: $(this.hash).offset().top - $boxMaster.position().top + $boxMaster.scrollTop() }, 700); 阻止链接元素的默认行为,然后手动将e.preventDefault() / html元素滚动到body元素:

Updated Example

#boxMaster

答案 2 :(得分:0)

我有一个固定的标题。我从w3school's code开始。但是,我一直在努力解决同样的问题,终于找到了“首次点击不正确”问题的解决方法:

在我的点击事件之前(外部),我只是创建了一个变量“x”,初始化:

var x=1;

然后我在点击事件中检查x:

的条件语句
    if (x==1) {
        console.log("x is now: " + x);
        x=0;
        console.log("x is now: " + x);
        jQuery("html, body").animate({ 
            scrollTop: jQuery("div.class-of-element-i-am-scrolling-to" + hash).position().top - jQuery("div.header-container").outerHeight(true) - jQuery("h3.another-element-in-my-way").outerHeight(true)
            }, 2000, function(){
            return false;
        });
    } else {
        jQuery("html, body").animate({ 
            scrollTop: jQuery("div.class-of-element-i-am-scrolling-to" + hash).position().top
            }, 2000, function(){
            return false;
        });
    }

换句话说,使用“x”作为标志来检查它是否是第一次运行代码。

如果是,那么我通过减去固定的标题和其他正在拉动我想要的div的元素来作弊。记得让“x = 0”来“掉落”旗帜。

如果不是,那么无论如何它都能正常工作。