Calculating Viewport Height on Chrome Android with CSS

25,450

Solution 1

Here's what I went with:

HTML

<div id="selector"></div>

CSS

#selector {
   height: 100vh;
}

JQUERY

function calcVH() {
    $('#selector').innerHeight( $(this).innerHeight() );
}
(function($) { 
  calcVH();
  $(window).on('orientationchange', function() {
    calcVH();
  });
})(jQuery);

PURE JS (NO JQUERY)

function calcVH() {
  var vH = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
  document.getElementById("selector").setAttribute("style", "height:" + vH + "px;");
}
calcVH();
window.addEventListener('onorientationchange', calcVH, true);

Simply change #selector to whatever your css selector is. If you use the pure js version you need to use an ID unless you change .getElementByID to .getElementsByClassName.

I'm only aware of this being a problem in Mobile Chrome Android, but I'm guessing it's the same for Chrome iOS as well. You could easily add a mobile detect option if you wanted so this only runs when you need it to. Personally I use Detectizr which works well, but to be honest, since it's pretty lightweight as it is, adding something like this is probably not worth it unless you're already using it.

Hopefully this gets fixed soon so a javascript solution isn't necessary. Also, I tried adding the resize event in case the browser width resizes, but after seeing this question I removed it from my answer. If you want to try using those just change the above to:

JQUERY

function calcVH() {
    $('#selector').innerHeight( $(this).innerHeight() );
}
(function($) { 
  calcVH();
  $(window).on('orientationchange resize', function() {
    calcVH();
  });
})(jQuery);

$(window).on('resize orientationchange', function() {

PURE JS (NO JQUERY)

function calcVH() {
  var vH = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
  document.getElementById("selector").setAttribute("style", "height:" + vH + "px;");
}
calcVH();
window.addEventListener('onorientationchange', calcVH, true);
window.addEventListener('resize', calcVH, true);

Solution 2

I tried every suggestion ... but nothing works for me. Either with Chrome or IOS.

But then...I had an Idea!

1. You can leave the standard entry in the head

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />

2. Write an JS in the Foot(be sure jQuery knows about your elements) of the site e.g

<script type="text/javascript" charset="utf-8">
  (function() {
    function size() {
      // you can change here what you prefer
      if (/android|webos|iphone|ipad|ipod|blackberry|nokia|opera mini|opera mobi|skyfire|maemo|windows phone|palm|iemobile|symbian|symbianos|fennec/i.test(navigator.userAgent.toLowerCase())) {
        var theminheight = Math.min(document.documentElement.clientHeight, window.screen.height, window.innerHeight);
        //now apply height ... if needed...add html & body ... i need and i use it
        $('html body #yourelementofchoise').css('height', theminheight);
      }
    }
    window.addEventListener('resize orientationchange', function() {
      size();
    }, false);
    size();
  }());
</script>

3. No more Navigationbar of chrome or whatever will disturb your output or what you want to see

I really hope this will help somebody !

Maybe this is only a template of doing it muchmuchmuch greater.

Share:
25,450
Bryan Willis
Author by

Bryan Willis

I'm an avid proponent of cloud technology and am a web application developer by trade. My professional expertise is in creating solutions to overcome business challenges by improving efficiency through AI, process automation development, and intuitive user experiences through UI/UX design. I'm currently an active partner at candid.solutions where I work with a team of uniquely talented individuals that strive to guide corporations through digital transformation by designing, orchestrating, and managing IT solutions and services in cost effective ways. I'm active on Stack, CodePen, and Github, and I'm always open to new connections and conversations, so don't hesitate to reach out.

Updated on July 09, 2022

Comments

  • Bryan Willis
    Bryan Willis almost 2 years

    So I noticed that mobile Chrome calculates the address bar into the viewport height. Because of this using height: 100vh on an element doesn't work because when the address bar scrolls the viewport height changes.

    I was actually able to find a question that had the same issue here on ios, but after investigating further I realized that this happens on all mobile Chrome browsers. When the address bar scrolls out of the viewport and then again when scrolls into the viewport, the viewport height changes.

    This causes any element using vh to recalculate which makes the page jump. It's extremely annoying when using a background image because it causes the image to resize on scrolling.

    Here's the code and an example

       .jumbotron {
            background-image: url(http://example.com/image.png);
            background-size: cover;
            background-position: top;
            background-repeat: no-repeat;
            height: 100vh;
        }
    

    You'll only be able to see the issue when scrolling up and down using mobile chrome.

    My question is, I would like to know is there any way around this or if not how to calculate full height on mobile chrome without causing the page to jump (css or js).

    http://s.codepen.io/bootstrapped/debug/qadPkz


    Update: So as far as using jquery here's what I came up with which seems to work pretty well:

    function calcVH() {
        $('.jumbotron').innerHeight( $(this).innerHeight() );
    }
    $(window).on('load resize orientationchange', function() {
      calcVH();
    });
    

    Demo of working example above

    I'd love to be able to do this without javascript though if someone has a CSS alternative that they know works.