Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

屏幕旋转时候获得的可用高度值经常不一样 #2

Open
a2631500 opened this issue Dec 22, 2016 · 9 comments
Open

屏幕旋转时候获得的可用高度值经常不一样 #2

a2631500 opened this issue Dec 22, 2016 · 9 comments

Comments

@a2631500
Copy link

添加了你的fix代码之后,发现屏幕旋转时候获得的可用高度值经常不一样(多测几次就会发现)。
`<!doctype html>

<title>test</title>

<script src="js/jquery-2.1.1.min.js"></script> <script src="js/orientationchange-fix.js"></script> <script> var f=function(){ $("p").html($(window).innerHeight()); } f(); window.addEventListener("orientationchange",f,false); </script> `

目前我的解决办法是使用原生的orientationchange事件,然后延迟300毫秒执行事件处理函数。
`<!doctype html>

<title>test</title>

<script src="js/jquery-2.1.1.min.js"></script> <script> var f=function(){ setTimeout(function(){ $("p").html($(window).innerHeight()); },300); } f(); window.addEventListener("orientationchange",f,false); </script> `
@zhansingsong
Copy link
Owner

zhansingsong commented Dec 22, 2016

@a2631500 不是旋转引起的吧。
我不知道你是否了解:浏览器是如何进行渲染页面的。知道为啥你延迟一下就可以了?(其实这里可以不是300,其他值也行),只要DOM tree准备好了就行。你可以将代码放在body的底部或在$(function(){ //do something.... })也行。看描述我想到就这么多了,也不知道能否解决你的疑惑。

@a2631500
Copy link
Author

a2631500 commented Dec 22, 2016 via email

@a2631500
Copy link
Author

a2631500 commented Dec 22, 2016 via email

@zhansingsong
Copy link
Owner

好吧!其实我不建议你在mobile上使用$(window).innerHeight()获取浏览器visual viewport的高度。因为不靠谱的,每个浏览器给出值都不一样,特别是国内,如浏览器UC,搜狗。他们给的值会减掉工具栏(定栏或底栏)的高度。至于你说高度有时不正确,我想到的可能与工具栏有关吧。当然也有一些隐藏工具栏技巧(不过貌似对国内一些浏览器不好使):

function hideURLbar() {
	if (window.location.hash.indexOf('#') == -1) {
		window.scrollTo(0, 1);
	}
}

if (navigator.userAgent.indexOf('iPhone') != -1 || navigator.userAgent.indexOf('Android') != -1) {
    addEventListener("load", function() {
            setTimeout(hideURLbar, 0);
    }, false);
}

参考文章:http://atlchris.com/1847/quick-tip-hide-mobile-web-browser-address-bar-improved/
之前做横竖屏适应了解一点,希望对你有帮忙。至于其他原因我就不了解了-。-

@a2631500
Copy link
Author

a2631500 commented Dec 22, 2016 via email

@newsekaes
Copy link

其实这个问题,我在IOS里碰到过好多次,尤其是在用微信打开某个页面时:
该问题为客户端问题,和JavaScript无关,更和各种轮子无关
350*588的手机屏幕,横屏时,获取高度约为300;然后横屏转竖屏的一瞬间,屏幕转换事件触发了(无论是原生orientationchange事件,还是原生resize事件),但那一瞬间获取的高度仍然是300
在适当的延迟几百毫秒之后,才能正确获得旋转之后的高度(大约500)

个人在想,是否可以单独针对这种情况,将旋转事件event,切分为eventStart和eventEnd,eventEnd代表横竖比已经切换完毕

@gongxihai22
Copy link

你们旋转屏幕的时候例子没出现死循环递归吗

@dark94da
Copy link

其实这个问题,我在IOS里碰到过好多次,尤其是在用微信打开某个页面时:
该问题为客户端问题,和JavaScript无关,更和各种轮子无关
350*588的手机屏幕,横屏时,获取高度约为300;然后横屏转竖屏的一瞬间,屏幕转换事件触发了(无论是原生orientationchange事件,还是原生resize事件),但那一瞬间获取的高度仍然是300
在适当的延迟几百毫秒之后,才能正确获得旋转之后的高度(大约500)

个人在想,是否可以单独针对这种情况,将旋转事件event,切分为eventStart和eventEnd,eventEnd代表横竖比已经切换完毕

这个问题我也发现了,ios微信客户端读window.innerHeight在第一次横竖屏切换的时候是正确的,然而第二次切换的时候innerHeight要过一定的延时才能正确更新、

@SuttonSteele
Copy link

SuttonSteele commented Aug 29, 2019

原生resize事件监听的是屏幕尺寸的变化,并不会监听innerHeight值的变化,所以在改变横竖屏的那一刻,值是不对的,几秒之后,值就对了,所以建议在updata里面监听innerHeight值的改变会比使用sesize要好。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants