// 监听 orientation changeswindow.addEventListener("orientationchange", function(event) { // 根据event.orientation|screen.orientation.angle等于0|180、90|-90度来判断横竖屏}, false);代码添加上后,就各种兼容性问题。这里兼容性问题出现在两个地方:
如下是screen.orientation的兼容性:
方案二:
上述方案不行,只能另行他法了。google一下,了解到可以通过resize配合(window.inner/outerWidth, window.inner/outerHeight)来实现:
window.addEventListener("resize", function(event) {var orientation=(window.innerWidth > window.innerHeight)? "landscape":"portrait";if(oritentation === "portrait"){// do something ……} else {// do something else ……}}, false);这种方案基本满足大部分项目的需求,但是还是有些不足之处:
var resizeCB = function(){ if(win.innerWidth > win.innerHeight){//初始化判断meta.init = "landscape";meta.current = "landscape"; } else {meta.init = "portrait";meta.current = "portrait"; } return function(){if(win.innerWidth > win.innerHeight){ if(meta.current !== "landscape"){meta.current = "landscape";event.trigger("__orientationChange__", meta); }} else { if(meta.current !== "portrait"){meta.current = "portrait";event.trigger("__orientationChange__", meta); }} }}();完整代码猛击这里
如上上图所示,移动端浏览器都支持CSS3 media。
实现思路:
创建包含标识横竖屏状态的特定css样式
通过JS向页面中注入CSS代码
resize回调函数中获取横竖屏的状态
这里我选择<html></html>的节点font-family作为检测样式属性。理由如下:
选择<html></html>主要为了避免reflow和repaint
选择font-family样式,主要是因为font-family有如下特性:
// callbackvar resizeCB = function() {var hstyle = win.getComputedStyle(html, null),ffstr = hstyle["font-family"],pstr = "portrait, " + ffstr,lstr = "landscape, " + ffstr,// 拼接csscssstr = "@media (orientation: portrait) { .orientation{font-family:" + pstr + ";} } @media (orientation: landscape) { .orientation{font-family:" + lstr + ";}}";// 载入样式loadStyleString(cssstr);// 添加类html.className = "orientation" + html.className;if (hstyle["font-family"] === pstr) { //初始化判断meta.init = "portrait";meta.current = "portrait";} else {meta.init = "landscape";meta.current = "landscape";}return function() {if (hstyle["font-family"] === pstr) {if (meta.current !== "portrait") {meta.current = "portrait";event.trigger("__orientationChange__", meta);}} else {if (meta.current !== "landscape") {meta.current = "landscape";event.trigger("__orientationChange__", meta);}}}}();完整代码猛击这里
landscape效果:
方案四:
可以再改进一下,在支持orientationchange时,就使用原生的orientationchange,不支持则使用方案三。
关键代码如下:
// 是否支持orientationchange事件var isOrientation = ("orientation" in window && "onorientationchange" in window);// callbackvar orientationCB = function(e) {if (win.orientation === 180 || win.orientation === 0) {meta.init = "portrait";meta.current = "portrait";}if (win.orientation === 90 || win.orientation === -90) {meta.init = "landscape";meta.current = "landscape";}return function() {if (win.orientation === 180 || win.orientation === 0) {meta.current = "portrait";}if (win.orientation === 90 || win.orientation === -90) {meta.current = "landscape";}event.trigger(eventType, meta);}};var callback = isOrientation ? orientationCB() : (function() {resizeCB();return function() {timer && win.clearTimeout(timer);timer = win.setTimeout(resizeCB, 300);}})();// 监听win.addEventListener(isOrientation ? eventType : "resize", callback, false);完整代码猛击这里
var eventType = "orientationchange";// 触发原生orientationchangevar fire = function() {var e;if (document.createEvent) {e = document.createEvent("HTMLEvents");e.initEvent(eventType, true, false);win.dispatchEvent(e);} else {e = document.createEventObject();e.eventType = eventType;if (win[eventType]) {win[eventType]();} else if (win["on" + eventType]) {win["on" + eventType]();} else {win.fireEvent(eventType, e);}}}完整代码猛击这里