首页 > 代码库 > 再探 butterfly.js - 奇异的留白
再探 butterfly.js - 奇异的留白
再探 butterfly.js - 奇异的留白
事情经过
在 梓凡兄 捣鼓他的 豆瓣FM 播放器的时候,发现了butterfly.js
会在ipad
的横屏模式(landscape mode)
的时候对<html>
添加class="ipad ios7"
。更加离奇的是在butterfly.css
有以下样式:
@media (orientation:landscape){
html.ipad.ios7 > body{
position:fixed;bottom:0;width:100%;height:672px !important
}
}
这样的结果就是导致了在chrome
的Apple iPad 3/4(landscape mode)
下,<body>
的height
值为672px
,而且是!important
的。显然这在Apple iPad 3/4(landscape mode)
(分辨率为1024*768
)做不到height
为100%
真相只有一个
今天在研究butterfly.js
源代码,在butterfly-amd.js
下发现有以下代码:
//ios7 issue fix
if (navigator.userAgent.match(/iPad;.*CPU.*OS 7_\d/i)) {
$(‘html‘).addClass(‘ipad ios7‘);
}
现在这是butterfly.js
刻意为iPad
而且是ios7
下的landscape mode
,做的fix
。
在stackoverflow
有人提出了一样的issue
:IOS 7 - css - html height - 100% = 692px。用我渣渣的英语翻译得出的问题就是:
在iPad(ios7)
的landscape mode
下,将<html>
或<body>
的height
设为100%
,safari
会把<html>
或<body>
的outerHeight
渲染为692px
,而innerHeight
渲染会672px
。
没错,少了20px
!这样的后果就是网页在屏幕显示出来bottom
会被切掉20px
。需要以下的hack
来修复这奇异的bug
:
body {
position: absolute;
bottom: 0;
height: 672px !important;
}
由于这个bug
只存在于iPad
而且是ios7
再而且是landscape mode
。所有就有了上文贴出的butterfly.js
代码。
为什么是672px
,而不是iPad
的768px
??
因为在iPad
实机使用下,屏幕上有系统的最顶的电量、信号状态栏。在safari
中有地址栏和其他后退、菜单的按钮。这些都占了屏幕的高度。最后留给我们的网页的height
只有672px
(landscape mode
)。
所以,在chrome
的iPad
调试模式下发现672px
会在屏幕底部留有一大段空白也不用惊讶!butterfly.js
会将你的webApp
在真机上展示得好好的!!
再探 butterfly.js - 奇异的留白