如何防止(引导)固定顶部导航从移动缩放

fle*_*ive 7 css mobile jquery html5 twitter-bootstrap-3

当使用bootstrap 3的固定顶部导航时,我注意到当用户在移动设备上使用原生缩放时,顶部导航也变得非常大.这导致了非常差的用户体验,导航模糊了大部分内容并最终破坏了自身,如下例所示:

在移动浏览器中使用本机缩放时,固定顶部导航会爆炸

这个问题可以在http://www.exploretrade.info/上看到,并且似乎也会影响使用这种导航的许多其他网站; 一个常见的解决方案是禁用用户缩放,但这会损害网站的可访问性.

我的问题是:当用户缩放移动设备上的内容时,如何使固定顶部导航的显示大小保持不变

  • 使用JavaScript,可以计算当前应用的设备缩放,并动态更新css transform: scale指令2
  • 但是,这似乎不适用于position: fixed元素,在缩小之后最终以某种方式居中在屏幕中

fle*_*ive 2

阻止 Bootstrapnavbar-top-fixed 在手机上缩放

最终结果: 使用 css 变换在缩放后将固定顶部标题保持恒定大小

仅在移动设备上,可以将缩放系数计算为window.innerWidth屏幕宽度的比率,如[2]中所示。当用户切换缩放时,会触发调整大小事件;此外,当重新加载先前缩放的页面时,缩放系数将保持不变。因此,可以使用 jQuery 动态更新 CSS 转换,以保持标题的形状。请注意,对于position: fixed,还需要对原点进行变换。将类应用于device-fixed-height引导程序navdevice-fixed-width品牌徽标和汉堡包图标,然后产生非常接近所需的结果。

  • Bug:当页面缩放时,汉堡包图标仍然向左移动一点。任何如何修复它的建议将不胜感激!
  • 测试平台:Android 4.4

实例http ://www.exploretrade.info/other/example-fixed-nav-after-zoom.html

源代码:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="">
    <link rel="icon" href="../../favicon.ico">

    <title>Bootstrap zoom-proof fixed top nav</title>

    <!-- Bootstrap core CSS -->
    <link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">

    <!-- Custom styles for this template -->
    <link href="//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet">
    <style>
    body {
     padding-top: 50px;
    }
    </style>
  </head>
  <body>
    <nav class="navbar navbar-inverse navbar-fixed-top device-fixed-height">
      <div class="container">
        <div class="navbar-header">
          <button type="button" class="navbar-toggle collapsed device-fixed-width" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
            <span class="sr-only">Toggle navigation</span>
             <i class="fa fa-bars"></i>
          </button>
          <a class="navbar-brand device-fixed-width" href="#">Example</a>
        </div>
        <div id="navbar" class="collapse navbar-collapse device-fixed-width">
          <ul class="nav navbar-nav">
            <li class="active"><a href="#">Home</a></li>
            <li><a href="#about">About</a></li>
            <li><a href="#contact">Contact</a></li>
          </ul>
        </div><!--/.nav-collapse -->
      </div>
    </nav>
    <div class="container">
      <div class="starter-template">
        <h1>Bootstrap starter template</h1>
        <p class="lead">Use this document as a way to quickly start any new project.<br> All you get is this text and a mostly barebones HTML document.</p>

        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In in metus eget nisi imperdiet dictum ac eu metus. Morbi consequat sodales porta. Nam convallis sed dolor in ullamcorper. Vestibulum ut tortor porttitor, venenatis nulla iaculis, sollicitudin metus. Mauris ut hendrerit purus, sed ultricies lacus. Proin imperdiet, lectus vel efficitur hendrerit, quam tortor efficitur sapien, vehicula viverra magna ipsum vitae lacus. Sed faucibus elit vel massa placerat, in porttitor est suscipit. Pellentesque consequat condimentum elit, at sagittis erat euismod nec. Fusce consequat purus quis turpis volutpat, vel luctus tortor consectetur. Sed in lectus vitae enim fringilla faucibus. Mauris vitae risus ut ex convallis luctus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Etiam tempor ante augue, sed iaculis nisi porta quis.</p>
      </div>

    </div><!-- /.container -->


    <!-- Bootstrap core JavaScript
    ================================================== -->
    <!-- Placed at the end of the document so the pages load faster -->
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.1/js/bootstrap.min.js"></script>
    <script>

// from https://signalvnoise.com/posts/2407-device-scale-user-interface-elements-in-ios-mobile-safari
function getDeviceScale() {
    var deviceWidth, landscape = Math.abs(window.orientation) == 90;
    if (landscape) {
      // iPhone OS < 3.2 reports a screen height of 396px
      deviceWidth = Math.max(480, screen.height);
    } else {
      deviceWidth = screen.width;
    }
    return window.innerWidth / deviceWidth;
}

// mobile only - keep the position:fixed header at constant size when page is zoomed
if (navigator.userAgent.match(/Mobi/)) {
    $(window).on('load scroll', function() {
        var ds = getDeviceScale();
        $('.device-fixed-height').css('transform','scale(1,' + ds + ')')
            .css('transform-origin', '0 0');
        $('.device-fixed-width').css('transform', 'scale(' + ds + ',1)')
            .css('transform-origin', '0 0');
        })
}

  </script>
    </script>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)