【问题标题】:ScrollTo animation on div with variable offset top not working correctly具有可变偏移顶部的 div 上的 ScrollTo 动画无法正常工作
【发布时间】:2014-05-05 12:10:08
【问题描述】:

单击右键导航菜单时,我很难滚动到正确的幻灯片。单击菜单按钮时,它会显示一个链接列表。第一次单击其中一个链接会将您滚动到正确的幻灯片。如果您尝试单击其他链接,它将中断。如果您刷新页面并单击一个链接,它将带您到正确的幻灯片,如果您再次单击相同的链接,它将动画到第一张幻灯片,现在如果您单击任何其他链接,它将滑动到正确的幻灯片。

我不确定它为什么这样做,它几乎就像它需要再次转到第一张幻灯片才能找到正确的幻灯片一样。我将一个变量传递给从菜单项设置的幻灯片动画并找到元素偏移量。当 console.logging 这些变量似乎没有正确设置变量,但是当删除动画时,变量似乎设置正确。我完全不知道它为什么这样做。请帮忙。 http://projects.fireworkx.com/pc/index.html

    var appWindowWidth;
    var appWindowHeight;
    var htmlbody = $('#slidesContainer');
    var htmlbodyScroll;
    var iconPreloader = $('.iconPreloader');
    var globalButton = $('#globalMenu');
    var globalMenu = globalButton.next();
    var globalLinks = globalMenu.find('li');
    var homeLinks = $('#homeSlideNavigation').find('li');
    var subLinks = $('.slideContainer').find('.sectionNavigation');
    var iconLinks = $('.slideContainer').find('.iconNavigation');
    var currentSlide = 1;

    var slideElement;
    var slideElementOffset = 0;


    var totalVerticalSlides = $('#slidesContainer').children('.mainSlide').length;
    var slideContainerWidth;
    var slideCount;
    var platformOSTimeout;
    var currentTouchMove;
    var lastTouchMove;
    var swipeDirection;

clickToSlide = function(dataslide,scrollDirection) {
    if(scrollDirection === 'vertical') {
        slideElement = $('.mainSlide[data-slide="' + dataslide + '"]');
        slideElementOffset = slideElement.offset().top;

        console.log('currentSlide ' + dataslide);
        console.log('slideElementOffset ' + slideElementOffset);

        slideElement.addClass('animate');

        htmlbody.animate({
            scrollTop: slideElementOffset,
            scrollLeft: 0
        }, 500, function() {
            htmlbody.clearQueue().finish();
        });
    }
},



globalSlideNavigation = function() {
        globalButton.on('click', function(e) {
            e.preventDefault();
            e.stopPropagation();
            globalMenu.toggleClass('active');
        });

        globalLinks.on('click', function(e) {
            e.preventDefault();
            dataslide = $(this).attr('data-slide');
            clickToSlide(dataslide, 'vertical');
        });

        htmlbody.on('click', function(e) {
            if(globalMenu.hasClass('active')) {
                globalMenu.removeClass('active');
            }
        });
    },

【问题讨论】:

  • 看来如果我改变 var htmlbody = $('#slidesContainer');到 var htmlbody = $('html, body');并更改 var totalVerticalSlides = $('#slidesContainer').children('.mainSlide').length;到 var totalVerticalSlides = $('#body').children('.mainSlide').length;并在 index.html 中删除
    div 包装它的幻灯片。但动画不适用于 iPad 上的 html 和 body。我需要滚动来处理 div 元素。
  • 顺便说一下,我会小心地将客户工作发布到 stackoverflow,可能一切都很好,但你永远不知道,有些客户可能过度保护,不想让任何人知道他们是为他们完成工作。如果你可以在 jsfiddle 或类似的地方,最好快速模拟你的问题并发布。

标签: javascript jquery animation var scrolltop


【解决方案1】:

之所以这样跳动是因为 .offset() 获取元素相对于文档 [https://api.jquery.com/offset/] 的位置,因此当您使用 scrollTop 设置页面位置时,您正在重置 .offset()将该元素的值设置为 0,因为它现在位于文档的顶部。如果你使用 .position()

因此,当您再次单击导航时,您会告诉页面将 scrollTop 设置为 0,因此它会转到页面顶部。如果您单击另一个元素,那么它将从 0 获取它的位置,所以工作,或者如果您在页面下方,它将根据当前位置相对于滚动位置获得它的偏移量,因此它可能是负数或小于从 0 开始的位置的数字。希望这有点道理,不确定我是否解释得很好。

要获取您要前往的元素的值,您需要获取当前滚动位置,然后将该位置添加到您接下来要查看的部分,然后将其用作 scrollTop() 值。

这是一个工作演示:http://jsfiddle.net/andyface/LrG59/ 您可以在控制台中看到您当前正在使用的偏移位置以及基于当前 scrollTop() 值的位置的值。从本质上讲,这是您应该做出的唯一改变。

scrollPosition = htmlbody.scrollTop() + slideElementOffset = slideElement.offset().top;

htmlbody.scrollTop(scrollPosition);

希望有帮助

【讨论】:

  • 谢谢andyface,我会试一试,告诉你进展如何。
  • 非常感谢 andyface 对我的帮助。有用!我会投票给你,但我是堆栈溢出的新手,我的评分很低,但我真的非常感谢你的帮助。保持健康。
  • 没有问题,我认为应该仍然可以将我的答案标记为正确:) 谢谢:D
猜你喜欢
相关资源
最近更新 更多
热门标签