以跨浏览器的方式查找视口的确切高度和宽度(无Prototype / jQuery)


67

我正在尝试找到浏览器视口的确切高度和宽度,但是我怀疑Mozilla或IE给我的号码不正确。这是我的身高方法:

var viewportHeight = window.innerHeight || 
                     document.documentElement.clientHeight || 
                     document.body.clientHeight;

我还没有开始做宽度,但是我猜它将会是类似的东西。

有没有更正确的方式来获取此信息?理想情况下,我希望该解决方案也能与Safari / Chrome /其他浏览器一起使用。



另外,您可以使用W库,该库处理跨浏览器的视口检测;)
pyrsmk

Answers:


91

您可以尝试以下方法:

function getViewport() {

 var viewPortWidth;
 var viewPortHeight;

 // the more standards compliant browsers (mozilla/netscape/opera/IE7) use window.innerWidth and window.innerHeight
 if (typeof window.innerWidth != 'undefined') {
   viewPortWidth = window.innerWidth,
   viewPortHeight = window.innerHeight
 }

// IE6 in standards compliant mode (i.e. with a valid doctype as the first line in the document)
 else if (typeof document.documentElement != 'undefined'
 && typeof document.documentElement.clientWidth !=
 'undefined' && document.documentElement.clientWidth != 0) {
    viewPortWidth = document.documentElement.clientWidth,
    viewPortHeight = document.documentElement.clientHeight
 }

 // older versions of IE
 else {
   viewPortWidth = document.getElementsByTagName('body')[0].clientWidth,
   viewPortHeight = document.getElementsByTagName('body')[0].clientHeight
 }
 return [viewPortWidth, viewPortHeight];
}

http://andylangton.co.uk/articles/javascript/get-viewport-size-javascript/

但是,甚至不可能在所有浏览器中都获得视口信息(例如,古怪模式下的IE6)。但是上面的脚本应该做得很好:-)


4
被bug困了5个小时之久,事实证明jquery在执行$(document).width()或时不会在FF / Chrome中返回相同的值$(window).width()window.innerWidth效果很好。
qwerty 2012年

这似乎不适用于iframe,而是返回iframe大小。有什么线索吗?
亚历杭德罗·加西亚·伊格莱西亚斯

1
@GarciaWebDev所以,您的意思是它可以正常工作;-)
Dee2000

@ Dee2000我的意思是,或者说我想说的是,当您在常规页面上进行测量时,您将获得浏览器的视口大小,但是当您在iframe中进行测量时,您将获得iframe的文档大小,而不是浏览器视口。不知道我的解释是否很好,请让我知道是否应该重新制定。
2013年

@GarciaWebDev在一个简单的页面上,您“认为”您正在获得“浏览器”视口的大小,但事实并非如此。您将获得正在/在其中的HTML页面的视口大小。无论该页面是“顶部”页面,还是位于iframe或嵌套嵌套的iframe中,它始终是您所在的/位于其中的HTML页面的视口大小。如果您想知道首页(或父页面)的视口大小,只要您的iframe是“友好的”(而非跨网域),则只需替换“窗口”即可。与“父母”。或“顶部”。到您测试的每个值(例如parent.innerWidth)。
Dee2000

20

您可以使用较短的版本:

<script type="text/javascript">
<!--
function getViewportSize(){
    var e = window;
    var a = 'inner';
    if (!('innerWidth' in window)){
        a = 'client';
        e = document.documentElement || document.body;
    }
    return { width : e[ a+'Width' ] , height : e[ a+'Height' ] }
}
//-->
</script>

16

我一直只用document.documentElement.clientHeight/ clientWidth。在这种情况下,我认为您不需要OR条件。


不会痛的。一旦找到有效值,将不会评估其余部分
贾斯汀·约翰逊

2
您那里有一个错字,应该是:'document.documentElement'。这在quircksmode中不起作用...在FF上它给出了整个文档的高度,而不仅仅是'clientHeight',在IE上它给出了'0'。
vsync

4
同意document.documentElement.clientWidth使用纯JS的方法。responsejs.com/labs/dimensions
ryanve 2012年

同意 来自:quirksmode.org/mobile/viewports.html-document.documentElement实际上是<html>元素”。“document.documentElement.clientWidth并且clientHeight仍然给出视口的尺寸,而不是<html>元素的尺寸。(这是一条特殊规则仅对该属性对适用于此元素。在所有其他情况下,将使用元素的实际宽度。)”从IE6标准模式开始,它应该“在所有情况下”都能正常工作。这些值不包括滚动条(与window.innerWidth和不同innerHeight)。
GitaarLAB

6

尝试这个..

<script type="text/javascript">
function ViewPort()
{
var w = Math.max(document.documentElement.clientWidth, window.innerWidth || 0)
var h = Math.max(document.documentElement.clientHeight, window.innerHeight || 0)
var viewsize = w + "," + h;
alert("Your View Port Size is:" + viewsize);
}
</script>

谢谢!你才救了我的命!:)
gioNicol

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.