Prevent fixed-position background-image: cover from resizing in mobile browsers upon address bar hide

前端 未结 6 1648
北海茫月
北海茫月 2020-12-29 05:25

Sorry for a lack of example on this one, but I figure it\'s easy enough to understand.

I have a fixed background on my site, which is currently implemented like this

相关标签:
6条回答
  • 2020-12-29 05:36

    Its hard to say without an example but you may be missing width:100% that should stop any resizing with the scroll bar.

    Another way to implement a fixed background on mobile is to have a background div with position: absolute and overflow: hidden and all your other background implementations, Then have a content div with overflow-y:scroll; and set the height of the content div using jquery or any other method you choose to get the window height with.

    Check out this JS Fiddle for an example.

    0 讨论(0)
  • 2020-12-29 05:37

    Almost 5 years later, there is finally a fix for this, due to changes in how Safari and now Chrome for Android calculate vh units. Check it out! https://developers.google.com/web/updates/2016/12/url-bar-resizing

    I implemented it on this website (can't really show this off on any of the code playgrounds due to them always embedding results in iframes): https://www.cochranesupply.com

    Just used the following code on a background element:

    #background {
        position: fixed;
        top: 0;
        left: 0;
        width: 100%;
        height: 100vh;
        background-image: url(../images/background.jpg);
        background-size: cover;
        z-index: -1;
    }
    

    And that's all there is to it! Just need Chrome for Android 56, or Safari for iOS (not certain which version but this may have been in Safari for a long time now).

    0 讨论(0)
  • 2020-12-29 05:39

    For those still looking around for an answer, you can use the new vw and vh attributes with an element that is position: fixed.

    This scrolls while the address bar moves/shrinks/etc., then remains fixed on the page.

    #bgimg {
      display: block;
      background: no-repeat url(bg.png);
      position: fixed;
      top: 0;
      left: 0;
      width: 100vw;
      height: 120vh;
    }
    
    0 讨论(0)
  • 2020-12-29 05:40

    I made this. I found that if you never really scroll the body/window you never trigger the autohide for Chrome. So wrap the content in a bigger div and just scroll that and the autohide never triggers. BUT ALSO!!! The autohide never triggers. (Address bar is always there). Wouldn't doubt for second you could hide the address bar after this but then how does the user get the address bar back?

    html, body {
      height: 100%; 
      overflow: hidden;
    }
    body {
      height: 100%;
    }
    #background {
      position: fixed;
      left: 50%;
      bottom: 0px;
      min-width: 100%;
      min-height: 120%;
      z-index: 0;
      background: url('background.gif');
      margin-left: -50%;
      background-position: center center;
      background-attachment: fixed;  
      background-size: cover;
    }
    #main_container {
      width: inherit;
      height: inherit;
      overflow-y: scroll;
    }
    .block {
      position: relative;
      text-align: center;
      background: transparent;
      height: 100%;
      z-index: 9;
    }
    .block {
      width: 100%;
      height: 100%;
      background: rgba(224, 224, 224, 0.4);
    }
    .block::before {
      content: '';
      display: inline-block;
      height: 100%; 
      vertical-align: middle;
    }
    .centered {
      display: inline-block;
      vertical-align: middle;
    }
    
    <div id="main_container">
      <div class="block" >
        <div class="centered">
          <h1 class="circle">Some text</h1>
        </div>
      </div>
      <div class="block">  
        <div class="centered">
          <h1>Some text</h1>
        </div>
      </div>
      <div class="block">  
        <div class="centered">
          <h1>Some text</h1>
        </div>
      </div>
      <div class="block">  
        <div class="centered">
          <h1>Some text</h1>
        </div>
      </div>
      <div class="block" >
        <div class="centered">
          <h1>Some text</h1> 
        </div>
      </div>
    </div>
    <div id="bg"></div>
    
    0 讨论(0)
  • 2020-12-29 05:47

    I ended up creating a workaround for mobile. It may not degrade gracefully, but it's working well for the time being.

    window.mobilecheck = function() {
      var check = false;
      (function(a){if(/(android|bb\d+|meego).+mobile|android|ipad|playbook|silk|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))check = true})(navigator.userAgent||navigator.vendor||window.opera);
      return check;
     }
    
     if (window.mobilecheck() == true) {
      var newHeight = $(window).height() + 70;
      $("#background").css("height", newHeight);
     }
    

    I found that mobilecheck function on the internet ( http://detectmobilebrowsers.com/ ). If it returns true, I take my fixed background image container and add 70 to its height. Then when you drag the screen up and the web browser's address bar auto-hides (thus increasing the window height), it has enough extra height such that background-size: cover does not have to jarringly resize the background image to fit the screen again.

    I could have just put the entire page into a fixed container and prevented mobile address bars from ever hiding, but I don't like sidestepping an otherwise neat feature of mobile browsers, and I know iOS isn't exactly thrilled with fixed containers that have their own scrollbars (there are workarounds of course, but I'd prefer my content to be in a more standard container).

    EDIT: However, this workaround introduces this issue: CSS CHALLANGE: Background-Image with 100% height - White Space when Scrolling Mobile

    0 讨论(0)
  • 2020-12-29 05:49

    For mobile safari you must, unintuitively, attach fixed backgrounds to the html element like so.

    html {
        background: url(../img/bg.jpg) no-repeat center center fixed;
        background-size: cover;
        height: 100%;
        overflow: hidden;
    }
    

    Then set the scrolling to the body.

    body {
        height: 100%;
        overflow: scroll;
    }
    

    You'll still need the background div for IE 8 since it doesn't support the background-size property, so mobile browsers should hide it. The cleanest way to do this is to exploit IE 8's inability to read a media query

    @media only screen { #background { display: none; }}
    
    0 讨论(0)
提交回复
热议问题