多次滚动到一个锚点
Scrolling To An Anchor Point Multiple Times
我正在尝试编写一个小函数,它使用 GSAP 在另一个动画完成后滚动到锚点。
我遇到的问题是脚本第一次运行完美,滚动到正确的位置,但是当第二次调用该函数时,溢出会滚动回页面顶部。
据我了解,这是因为在第二次调用该函数时,溢出元素顶部的 offSet 为 0,因为它已经滚动,所以这是它现在滚动到的值。
但是,我想不出一个优雅的方法来实现我正在寻找的功能,即无论溢出在哪里,只要调用滚动函数,溢出就会滚动到锚点。
我在下面创建了一个简化示例。在最后一个例子中,滚动之前的动画会移动锚点的相对位置,这就是为什么我在调用函数时设置距离变量的原因:
var body = $(document.body);
var e = window.event || e;
function scroll(e) {
var distance = $("#test").offset().top - $(".wrap").offset().top
TweenMax.to($(".wrap"), 1, {
scrollTo: {y:distance, autoKill: true},
force3D: true
})
};
$(body).on('click', '.click', function (e) {
scroll();
});
我还创建了一个快速 CodePen,以便人们可以看到实际问题:
http://codepen.io/OneManLaptop/pen/YNbXBX
(点击底部滚动,它应该滚动到 H2 标签)
(演示行为是您单击滚动按钮并且溢出滚动到锚点,但是当您第二次单击它时它会滚动回页面顶部。所需的行为是,无论您单击按钮多少次或锚点相对于溢出 window 的位置,溢出将不会移动 - 因为它已经在锚点 - 或者将滚动以查找锚点的新位置。
感谢您提供的帮助。 :)
Pete 的示例很容易修改为 GSAP 友好:
http://codepen.io/OneManLaptop/pen/NdVRGJ
function scroll(e) {
var test = $("#test"),
wrap = $(".wrap"),
distance = test.offset().top - parseInt(test.css('margin-top')) + wrap.scrollTop();
TweenMax.to($(".wrap"), 1, {
scrollTo: {y:distance, autoKill: true},
force3D: true
})
};
干杯皮特。 :)
我正在尝试编写一个小函数,它使用 GSAP 在另一个动画完成后滚动到锚点。
我遇到的问题是脚本第一次运行完美,滚动到正确的位置,但是当第二次调用该函数时,溢出会滚动回页面顶部。
据我了解,这是因为在第二次调用该函数时,溢出元素顶部的 offSet 为 0,因为它已经滚动,所以这是它现在滚动到的值。
但是,我想不出一个优雅的方法来实现我正在寻找的功能,即无论溢出在哪里,只要调用滚动函数,溢出就会滚动到锚点。
我在下面创建了一个简化示例。在最后一个例子中,滚动之前的动画会移动锚点的相对位置,这就是为什么我在调用函数时设置距离变量的原因:
var body = $(document.body);
var e = window.event || e;
function scroll(e) {
var distance = $("#test").offset().top - $(".wrap").offset().top
TweenMax.to($(".wrap"), 1, {
scrollTo: {y:distance, autoKill: true},
force3D: true
})
};
$(body).on('click', '.click', function (e) {
scroll();
});
我还创建了一个快速 CodePen,以便人们可以看到实际问题:
http://codepen.io/OneManLaptop/pen/YNbXBX
(点击底部滚动,它应该滚动到 H2 标签)
(演示行为是您单击滚动按钮并且溢出滚动到锚点,但是当您第二次单击它时它会滚动回页面顶部。所需的行为是,无论您单击按钮多少次或锚点相对于溢出 window 的位置,溢出将不会移动 - 因为它已经在锚点 - 或者将滚动以查找锚点的新位置。
感谢您提供的帮助。 :)
Pete 的示例很容易修改为 GSAP 友好:
http://codepen.io/OneManLaptop/pen/NdVRGJ
function scroll(e) {
var test = $("#test"),
wrap = $(".wrap"),
distance = test.offset().top - parseInt(test.css('margin-top')) + wrap.scrollTop();
TweenMax.to($(".wrap"), 1, {
scrollTo: {y:distance, autoKill: true},
force3D: true
})
};
干杯皮特。 :)