-
-
Save yckart/5609969 to your computer and use it in GitHub Desktop.
/** | |
* Hide the addressbar on ios & android devices | |
* https://gist.github.com/yckart/5609969 | |
* | |
* Based on the work from Nate Smith | |
* @see https://gist.github.com/nateps/1172490 | |
* | |
* Copyright (c) 2013 Yannick Albert (http://yckart.com) | |
* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php). | |
* 2013/07/10 | |
*/ | |
;(function(window) { | |
window.hideAddressbar = function (elem) { | |
elem = typeof elem === 'string' ? document.querySelector(elem) : elem; | |
var ua = navigator.userAgent, | |
iphone = ~ua.indexOf('iPhone') || ~ua.indexOf('iPod'), | |
ipad = ~ua.indexOf('iPad'), | |
ios = iphone || ipad, | |
android = ~ua.indexOf('Android'), | |
// Detect if this is running as a fullscreen app from the homescreen | |
fullscreen = window.navigator.standalone, | |
lastWidth = 0; | |
// We don't go further if we are | |
// not on an ios or android device | |
// or the passed element was not found | |
if (!(ios || android) || !elem) return; | |
if (android) { | |
// Android's browser adds the scroll position to the innerHeight, just to | |
// make this really fucking difficult. Thus, once we are scrolled, the | |
// page height value needs to be corrected in case the page is loaded | |
// when already scrolled down. The pageYOffset is of no use, since it always | |
// returns 0 while the address bar is displayed. | |
window.addEventListener('scroll', function () { | |
elem.style.height = window.innerHeight + 'px'; | |
}, false); | |
} | |
var setupScroll = function () { | |
var height = 0; | |
// Start out by adding the height of the location bar to the width, so that | |
// we can scroll past it | |
if (ios) { | |
// iOS reliably returns the innerWindow size for documentElement.clientHeight | |
// but window.innerHeight is sometimes the wrong value after rotating | |
// the orientation | |
height = document.documentElement.clientHeight; | |
// Only add extra padding to the height on iphone / ipod, since the ipad | |
// browser doesn't scroll off the location bar. | |
if (iphone && !fullscreen) height += 60; | |
} else if (android) { | |
// The stock Android browser has a location bar height of 56 pixels, but | |
// this very likely could be broken in other Android browsers. | |
height = window.innerHeight + 56; | |
} | |
elem.style.height = height + 'px'; | |
// Scroll after a timeout, since iOS will scroll to the top of the page | |
// after it fires the onload event | |
setTimeout(scrollTo, 0, 0, 1); | |
}; | |
(function resize() { | |
var pageWidth = elem.offsetWidth; | |
// Android doesn't support orientation change, so check for when the width | |
// changes to figure out when the orientation changes | |
if (lastWidth === pageWidth) return; | |
lastWidth = pageWidth; | |
setupScroll(); | |
window.addEventListener('resize', resize, false); | |
}()); | |
}; | |
}(this)); |
/** | |
* Hide the addressbar on ios & android devices | |
* https://gist.github.com/yckart/5609969 | |
* | |
* Based on the work from Nate Smith | |
* @see https://gist.github.com/nateps/1172490 | |
* | |
* Copyright (c) 2013 Yannick Albert (http://yckart.com) | |
* Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php). | |
* 2013/07/10 | |
*/ | |
;(function(a){a.hideAddressbar=function(g){g=typeof g==="string"?document.querySelector(g):g;var b=navigator.userAgent,i=~b.indexOf("iPhone")||~b.indexOf("iPod"),k=~b.indexOf("iPad"),f=i||k,e=~b.indexOf("Android"),j=a.navigator.standalone,c=0;if(!(f||e)||!g){return}if(e){a.addEventListener("scroll",function(){g.style.height=a.innerHeight+"px"},false)}var h=function(){var l=0;if(f){l=document.documentElement.clientHeight;if(i&&!j){l+=60}}else{if(e){l=a.innerHeight+56}}g.style.height=l+"px";setTimeout(scrollTo,0,0,1)};(function d(){var l=g.offsetWidth;if(c===l){return}c=l;h();a.addEventListener("resize",d,false)}())}}(this)); |
<!DOCTYPE html> | |
<html> | |
<head> | |
<meta charset="utf-8"> | |
<meta name=viewport content="width=device-width"> | |
<title>hideAddressbar.js</title> | |
<style> | |
html, body { | |
margin: 0; | |
padding: 0; | |
} | |
#page { | |
position: absolute; | |
width: 100%; | |
height: 100%; | |
-webkit-box-sizing: border-box; | |
box-sizing: border-box; | |
border: 8px solid #f00; | |
} | |
</style> | |
</head> | |
<body> | |
<div id="page"></div> | |
<script src="hideAddressbar.js"></script> | |
<script>hideAddressbar('#page');</script> | |
</body> | |
</html> |
Hi Yannick
Thanks for this.
Minor typo: hideAdressbar should be hideAddressbar (double-d in address), no?
Forgive my ignorance, but how do I use it?
I can follow pretty much all of the detail, but I don't understand how it has been packaged, i.e. the first 3 lines and last line of code.
I'm supposed to call hideAddressBar with some parameter?
Thanks for any help.
At the first, thanks for the spellingcorrection :)
To your question, I'll split it up:
// we start with an anonymous self invoked function wrapper
// it holds `window` as parameter (referenced in the last line)
// the semi-colon before the function invocation is a safety
// net against concatenated scripts and/or other plugins
// that are not closed properly.
;(function(window) {
// now we expose `hideAddressbar` to the global window-object
// to make it accessible outside of our anonymous function
window.hideAddressbar = function (elem) {
// this step is a pretty simple type-detection
// to check if the passed argument is a string or not
// if it is, we use `querySelector` to catch the element from our DOM
// otherwise we use the raw DOM-Node
elem = typeof elem === "string" ? document.querySelector(elem) : elem;
// this closes our anonymous function and invokes it
// we pass `this` in it, because it referes to the most global object in what we are
// in most cases (browsers) it is the window-object, if you use something like require.js
// it refers to the `define`-scope
}(this));
Something about anonymous functions: http://en.wikibooks.org/wiki/JavaScript/Anonymous_Functions
I've added an index.html
-file to show up how to use it:
This don't work for me on my Google Nexus4 Android 4.*** Some one can help me ?
Doesnt work on chrome for ios7 / iPhone 4s
Doesnt work on chrome for android 4.2 / Nexus 10
@LeCanardNoir @Romainpetit Since I made this gist, there are a lot of new devices / os-updates out there... If I get the time I'll push this to the next level... Though it would be great if you could help to fiddle the cross-device support out.
Awesome! Thanks man!