在Firefox中,scrollTop返回的div值要小得多

5

参考链接:http://old.crazyripples.com/?debug=1

我正在使用jQuery和jQuery fullPage插件,它可以帮助我实现逐帧滚动。

对于内部div,其垂直高度大于窗口高度的情况,我使用了一些函数来检查滚动条位置,并使用 stopPropagation 函数将其传递给插件,以便内部滚动条在不移动框架的情况下滚动。

在chrome中,所有的都运行良好,因为我是在chrome构建的,我使用了一些我在chrome上观察到的计算。但是Firefox显示的结果不同,特别是scrollTop

我知道高度可能会有所不同,但如果您查看引用链接中的日志,您将看到高度几乎相同(即使对您而言并非如此,也是scrollTop值存在问题)。

这是我用来决定是否停止传播的代码:

$(document).on("keydown",function(e){
    var story=$("#story"),
        story_con=story.find(".container"),
        story_top=story_con.scrollTop();

    if(story.hasClass("active")){
        // console.log(story_top,story_con.height(),story_con.innerHeight(),story_con.children("div").height(),story_con.children("div").innerHeight(),e.which);
        console.log("Div ScrollTop: "+story_top, "Container Height: "+story_con.height(), "Container InnerHeeight: "+story_con.innerHeight(),"Conatiner Div Height: "+story_con.children("div").height());

        //up arrow
        if(story_top==0 && e.which==38){
            console.log("prev frame")
        }

        //down arrow
        //chrome 280+432 >= 676 i.e. 712>=676 true
        //firefox 207+429 >= 676 i.e 636>=676 false
        else if(story_top + story_con.height() >=story_con.children("div").height() && e.which==40){
            console.log("next frame");
        }
        else{
            story_con.focus();
            console.log(story_con[0]);
            console.log("stopped propagation");
            e.stopImmediatePropagation();
        }
        return;
    }
});

这是我调用插件的方式:

$('#main').fullpage({
    sectionSelector:'.frame',
    scrollingSpeed:800,
    responsiveWidth:1025,
    normalScrollElements: '#story, #startups, #services',
});

复制: 前往参考链接。通过滚动、箭头键或菜单导航到第二个部分(我们的故事)。现在,只使用箭头键,框架应该正常滚动,但当滚动完成后,它应该转到下一个框架(在Chrome中这样做)。有关更多详细信息,请参阅js日志。

如果有人能以任何方式帮助我,我会非常感激。我已经尝试了一段时间来调试这个问题。也许我关注的是错误的问题?任何帮助将不胜感激。

P.S. 我知道插件提供了一个scrollOverflow选项。但那比这种方法还要引起更多问题。

更新:由于我找不到特定的解决方案,所以我改变了我的方法,检测框架滚动条是否已到达其末端。我使用了这个:

//down arrow
else if(container[0].offsetHeight + container[0].scrollTop >= container[0].scrollHeight){
    console.log("next frame");
}

好的,我没意识到,你可能是脚本的开发者 :P 感觉自己太蠢了!但我很高兴你能帮助我! - SuperNOVA
1
我会开一个不那么具体的新问题。只需询问如何在可滚动元素中获取Firefox和Chrome的相同值即可。提出一个简短而更通用的问题,您将获得更多答案。 - Alvaro
2
不使用Firefox?你一定在开玩笑吧,或者我漏掉了什么? - Terry
你使用的Firefox版本是什么?只是为了帮助我的调试。我正在使用49.0.1版本,你的keydown函数目前适用于任何屏幕尺寸,宽度大于1024。 - T.Okahara
另外,只是让您知道,您的 div#services 目前太高(即使在 iMac 显示器上),无法使用 1 个向下箭头按键进行过渡。 - T.Okahara
显示剩余7条评论
2个回答

0

*这是我在继续调试以便给您更好的细节的答案开始。

当前正在使用 Firefox 版本49.0.1,在小于1280px的窗口大小中,您在容器类中的内容太高了。

目前的证明: 在您的 div 中,#story#partners#services,如果您为每个主要部分直接子级的 div.container 给予一个 height: 200px,所有的箭头向下按键都将起作用。

编辑1 魔法.js 的第111行是您的问题开始的地方。

else if(story_top + story_con.height() >=story_con.children("div").height() && e.which==40){

每个容器内的内容story_con.children("div").height()有时大于story_top + story_con.height(),因此它不会进入您所期望的下一页路径。

当然,这完全取决于窗口的高度。

您的调试日志证明了我的观点:


首先非常感谢您的帮助。现在,我将窗口大小调整为1280,在Chrome中它可以正常工作。实际上,无论尺寸如何,它都可以在Chrome上运行。在Firefox(相同版本)中,我将div.container> div高度设置为200px,它可以工作,但原因很简单。对于小于窗口高度的高度,不会出现滚动条,并且第111行的条件计算为true,下一帧被加载。 - SuperNOVA
对于任何小于窗口高度的div高度都是正确的。现在,第111行的意思是,如果箭头键向下并且我们已经到达了滚动位置的末尾。如果story_top变量(scrollTop)的值与chrome相同,所有计算都将正常运行,但实际上它们不同。 - SuperNOVA
好的 :) 我会查看为什么在Chrome和Firefox中scrollTop不同。 - T.Okahara
似乎在Firefox中.scrollTop()不太好用。今天下班后我会尝试为您编写一个解决方法。 - T.Okahara

0
简单的答案是因为Chrome和Firefox以不同的方式呈现页面。要了解为什么会出现渲染差异,请查看此Explanation
希望这能澄清问题。

我其实知道这件事。但是在这个情境下,我不确定它是否有帮助。首先,我没有处理宽度,而是高度和scrollTop问题。也许,它可能以类似的方式处理高度,但我只给出了100vh的高度,并且只有一个子元素。即使我不知道那是真正的问题,5-10像素的差异会说得通,但如果你看日志,Chrome和Firefox值之间几乎有80像素的差异(对我来说)。所以,我想那不是原因。 - SuperNOVA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接