当视口尚未调整大小时,jQuery $(window).width()和$(window).height()返回不同的值


105

我正在编写一个使用jquery的站点,该站点反复调用$(window).width()$(window).height()根据视口大小来定位和调整元素的大小。

在故障排除中,我发现在不调整视口大小的情况下,重复调用上述jquery函数会得到不同的视口大小报告。

想知道是否有人会在什么情况下知道这种特殊情况,或者仅仅是这样。出现的报告大小差异为20px或更小。它发生在Mac OS X 10.6.2上的Safari 4.0.4,Firefox 3.6.2和Chrome 5.0.342.7 beta中。我尚未测试其他浏览器,因为它似乎并不是特定于该浏览器的。我也无法弄清差异取决于什么,如果不是视口大小,是否还有其他因素会使结果有所不同?

任何见识将不胜感激。


更新:

这不是值$(window).width(),并$(window).height()正在改变。这是我用来存储上述值的变量的值。

影响值的不是滚动条,变量值更改时也不会出现滚动条。这是我的代码,用于将值存储在变量中(我这样做是为了使它们更短)。

(所有这些都在$(document).ready()

//初始声明变量对其中的其他函数可见 .ready()

var windowWidth = $(window).width(); //retrieve current window width
var windowHeight = $(window).height(); //retrieve current window height
var documentWidth = $(document).width(); //retrieve current document width
var documentHeight = $(document).height(); //retrieve current document height
var vScrollPosition = $(document).scrollTop(); //retrieve the document scroll ToP position
var hScrollPosition = $(document).scrollLeft(); //retrieve the document scroll Left position


function onm_window_parameters(){ //called on viewer reload, screen resize or scroll

    windowWidth = $(window).width(); //retrieve current window width
    windowHeight = $(window).height(); //retrieve current window height
    documentWidth = $(document).width(); //retrieve current document width
    documentHeight = $(document).height(); //retrieve current document height
    vScrollPosition = $(document).scrollTop(); //retrieve the document scroll ToP position
    hScrollPosition = $(document).scrollLeft(); //retrieve the document scroll Left position

}; //end function onm_window_parameters()

我插入了一个警报语句,以针对应该包含的变量探查上面的变量。这些$(item).param()值保持一致,但由于无法弄清的原因,我的变量发生了变化。

我一直在寻找我的代码可能正在更改有关变量的值的地方,而不是仅检索它们的设置值而找不到任何地方。如果可能的话,我可以将整个shebang发布到某个地方。

Answers:


98

我认为您所看到的是滚动条的隐藏和显示。 这是显示宽度变化的快速演示

顺便说一句:您需要不断轮询吗?您也许可以优化代码以在resize事件上运行,如下所示:

$(window).resize(function() {
  //update stuff
});

1
顺便说一句,您毕竟是对的...在进行故障排除时,我注意到有滚动条。它们的显示时间如此短暂,以致于只有在调试模式下脚本在执行中暂停时才能看到。删除上述变量和函数后,某些元素仍会从位置跳出-与脚本步骤的顺序有关-我只需要确保在插入图像之前将保存有插入图像的div重置为css left:0即可。这个故事的寓意是:仅仅因为滚动条出现的时间不够长而不能被看到,并不意味着它们不存在!
Manca Weeks 2010年

我也将使用以下问题:stackoverflow.com/questions/2854407/…,以便您可以在调整大小事件完成后进行检查。您的脚本将在您调整大小的每个像素上运行.resize()函数中的内容,因此更好的做法是等待。
MarkP


3

请注意,如果问题是由于出现滚动条引起的,则将

body {
  overflow: hidden;
}

在CSS中进行修正可能很容易(如果不需要滚动页面)。


1

我有一个非常类似的问题。刷新页面时,得到的height()值不一致。(这不是导致问题的变量,而是实际的高度值。)

我注意到在页面的开头,我先调用了脚本,然后又调用了css文件。我进行了切换,以便首先链接css文件,然后链接脚本文件,到目前为止,这似乎已解决了该问题。

希望能有所帮助。


实际上,我最初的问题是我的元素在页面上的定位方式导致滚动条出现了不到一秒钟的时间-足以使测量值偏斜,但不足以吸引眼球...我想通了一旦我将警报语句放在我的javascript语句之间以将代码分成不同的状态,就可以解决这个问题。我这样做是为了让警报可以在代码执行的每个阶段报告测量结果。那是当我注意到其中一种状态导致滚动条出现时-恰好是进行测量的状态。
曼卡周

1
我可以用滚动条确认同样的事情。调整浏览器大小后,我将读取$(window).height(),它可能显示类似500的值。然后刷新(不调整浏览器大小),它将显示类似700的更大的值。在这种情况下,我只需要执行overflow:hidden就可以解决它,因为我从来不希望滚动条打开。一旦执行此操作,高度报告将保持一致。
2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.