你的浏览器不支持canvas

Enjoy life!

javascript - 窗口位置

Date: Author: JM

本文章采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。

参考资料:

  • 《JavaScript高级程序设计(第3版)》 8.1.3 8.1.4

一、窗口位置

1.1 screenTop、screenLeft

  • 表示窗口相对于屏幕左边和上边的位置
    • IESafariOperaChrome 都提供了screenLeftscreenTop 属性。
    • Firefox提供 screenXscreenY
var leftPos = (typeof window.screenLeft == "number") ? window.screenLeft : window.screenX;
var topPos = (typeof window.screenTop == "number") ? window.screenTop : window.screenY; 
  • IEOpera 中:
    • screenLeftscreenTop 中保存的是从屏幕左边和上边到由 window 对象表示的页面可见区域的距离
    • 换句话说,如果 window 对象是最外层对象,而且浏览器窗口紧贴屏幕最上端——即 y 轴坐标为 0, 那么 screenTop 的值就是位于页面可见区域上方的浏览器工具栏的像素高度

relationship-map

  • ChromeFirefoxSafari中,screenYscreenTop中:
    • 保存的是整个浏览器窗口相对于屏幕的坐标值,即在窗口的 y 轴坐标为 0 时返回 0

relationship-map

  • FirefoxSafariChrome 始终返回页面中每个框架的 top.screenXtop.screenY 值。
    • 即使在页面由于被设置了外边距而发生偏移的情况下,相对于 window 对象使用screenXscreenY 每次也都会返回相同的值。
  • IEOpera :会给出框架相对于屏幕边界的精确坐标值。
  • 最终结果:无法在跨浏览器的条件下取得窗口左边和上边的精确坐标值。

1.2 moveTo()、moveBy()

  • moveTo(x, y)
    • 新位置的 xy坐标值
  • moveBy(left, top)
    • left:水平方向上移动的像素数。
    • top:垂直方向上移动的像素数。
//将窗口移动到屏幕左上角
window.moveTo(0,0);
//将窗向下移动 100 像素
window.moveBy(0,100);
//将窗口移动到(200,300)
window.moveTo(200,300);
//将窗口向左移动 50 像素
window.moveBy(-50,0); 

在 Opera 和 IE 7(及更高版本)中默认就是禁用的。另外,这两个方法都不适用于框架,只能对最外层的 window 对象使用。

二、窗口大小

  • innerWidthinnerHeight:表示该容器中页面视图区的大小(减去边框宽度)。
  • outerWidthouterHeight
  • IE9+SafariFirefox 中:
    • outerWidthouterHeight 返回浏览器窗口本身的尺寸(无论是从最外层的 window 对象还是从某个框架访问)。
  • 在 Opera中:
    • 这两个属性的值表示页面视图容器的大小。

2.1 chrome、Firefox、IE

  • outerWidthouterHeight:红色框框,即:返回浏览器窗口本身的尺寸
  • innerWidthinnerHeight:蓝色框框,即:浏览器视口的大小(减去了浏览器的边框)

relationship-map

2.2 clientHeight & innerHeight、clientWidth & innerWidth

  • 以下两组输出的值是一样的,这两组属性都是保存了页面视口的信息。
  • 操作过程

image

2.3 兼容浏览器,获取页面视口大小

var pageWidth = window.innerWidth,
    pageHeight = window.innerHeight;

if (typeof pageWidth != "number"){
    if (document.compatMode == "CSS1Compat"){
        pageWidth = document.documentElement.clientWidth;
        pageHeight = document.documentElement.clientHeight;
    } else {
        pageWidth = document.body.clientWidth;
        pageHeight = document.body.clientHeight;
    }
} 

2.4 移动设备与桌面浏览器的差异

  • 对于移动设备:window.innerWidthwindow.innerHeight 保存着可见视口,也就是屏幕上可见页面区域的大小
  • 移动 IE 浏览器不支持这些属性,但通过 document.documentElement.clientWidthdocument.documentElement.clientHeihgt 提供了相同的信息。
  • 着页面的缩放,这些值也会相应变化
  • 在其他移动浏览器中,document.documentElement 度量的是布局视口,即渲染后页面的实际大小与可见视口不同,可见视口只是整个页面中的一小部分)。
  • 移动 IE 浏览器把布局视口的信息保存在document.body.clientWidthdocument.body.clientHeight中。
  • 这些值不会随着页面缩放变化

由于与桌面浏览器间存在这些差异,最好是先检测一下用户是否在使用移动设备,然后再决定使用哪个属性。

2.5 resizeTo()、resizeBy()

  • resizeTo():接收浏览器窗口的新宽度和新高度
  • resizeBy():接收新窗口与原窗口的宽度和高度之差。
//调整到 100×100
window.resizeTo(100, 100);
//调整到 200×150
window.resizeBy(100, 50);
//调整到 300×300
window.resizeTo(300, 300); 

OperaIE7(及更高版本)中默认就是禁用的。另外,这两个方法同样不适用于框架,而只能对最外层的window 对象使用。


对于本文内容有问题或建议的小伙伴,欢迎在文章底部留言交流讨论。