【问题标题】:Responsive navbar breaks in some tablets某些平板电脑中的响应式导航栏中断
【发布时间】:2014-11-24 02:20:49
【问题描述】:

我已经设计了网站,当我调整浏览器窗口大小或使用 Firefox 提供的响应工具时,我没有看到导航栏坏了,我没有平板电脑,但有几个朋友有,他们说导航栏没有正确显示。

我不明白我做错了什么!

This is the site

已编辑:

导航栏 li 项应该是向右浮动的。苹果用户说,当他们打开网站时,它可以正常打开。但是一旦他们向下滚动和向后滚动,li 项目不会在右侧排列而是在中间。

【问题讨论】:

  • Chrome 非常擅长模拟各种平板电脑、iPhone 等
  • 哪些平板电脑有问题?
  • 我还没有看到导航中断的问题。使用 Firefox 开发工具,这些工具非常擅长模拟不同的视口大小进行测试。移动导航似乎从右侧飞入,这不是我习惯的样式 - 这可能是导航栏未正确显示的意思吗?
  • @DavidG - 我只是尝试了其中的每一个。我仍然没有看到它在哪里中断。我有3个朋友说他们有这个问题。给我几分钟,我会尽快回复你所有的平板电脑名称
  • 这是来自您的 custom.js 文件的行为。在那里,您在滚动事件后从导航中删除浮动。在滚动之前,导航是向右浮动的。您最初的问题可能更清楚 - 很难说出预期的行为是什么,具体问题是什么,以及您做了什么测试。

标签: html css twitter-bootstrap responsive-design


【解决方案1】:

我认为@khilley 关于使用标准 Bootstrap 标记和内置 javascript 组件提出了一个特别有效的观点。以下是一些原因:

  1. 您当前的方法使用重复标记(用于您的菜单)。它不是 DRY 或可访问的,需要更多的维护工作。
  2. 如果您不需要编写自己的 javascript,则可以节省开发和测试时间,并为您的用户节省几个下载字节。
  3. Twitter Bootstrap 被用于数百万个网站,因此每天都有数百万人在全球数百万种不同的设备/操作系统/分辨率组合上进行现场测试。当您使用标准标记和 javascript 组件插件时,您会受益于知道它会正常工作。

更重要的是,您可以通过一些样式轻松重现导航的所有行为,包括使用内置的词缀标记来处理导航栏中的更改。好甜!

DEMO

只需对您的标记和 css 进行少量更改即可完成此操作。您现在可以消除所有自定义 javascript,除了用于滚动到不同部分的一键式处理程序。

将所有导航样式和标记替换为以下内容:

HTML:

<nav class="navbar nav-custom navbar-fixed-top" data-spy="affix" data-offset-top="80" role="navigation">
    <div class="container-fluid">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                <span class="sr-only">Toggle navigation</span>
                <span class="glyphicon glyphicon-th-list"></span>
            </button>
            <span class="rc">RC</span>
        </div>
        <div class="collapse navbar-collapse">
            <ul class="nav navbar-nav navbar-right">
                <li class="active">
                    <a href="#home">Home</a>
                </li>
                <li>
                    <a href="#design">Design</a>
                </li>
                <li>
                    <a href="#develop">Develop</a>
                </li>
                <li>
                    <a href="#contact">Contact</a>
                </li>                
            </ul>
        </div><!-- /.navbar-collapse -->
    </div><!-- /.container-fluid -->
</nav>

CSS:

.nav-custom {
    width: 100%;
    height: 80px;
    z-index: 999;
    padding: 25px;
    background-color: #f87f73;
    border-bottom: 1px solid rgba(0, 0, 0, 0.18);
    font-size: 150%;
    color: #fff;
    -webkit-transition: all .35s ease;
    -o-transition: all .35s ease;
    transition: all .35s ease;
}
.nav-custom.affix {
    width: 100%;
    background-color: rgba(255, 255, 255, 1);
    color: #f87f73;
    height: 60px;
    padding: 14px;
    -webkit-transition: all .35s ease;
    -o-transition: all .35s ease;
    transition: all .35s ease;
}
.nav-custom .rc {
    background-color: #fff;
    color: #f87f73;
    padding: 5px;
    border-radius: 50% 0% 50% 0%;
    float: none;
}
.nav-custom.affix .rc {
    background-color: #f87f73;
    color: #fff;
}
.nav-custom.affix .navbar-collapse {
    top: 60px;
}
.nav>li>a:hover, .nav>li>a:focus {
    background-color: transparent;
}
button{
    outline: none;
}
.navbar-toggle {
    padding: 0;
    margin: 0;
}
@media (min-width: 768px) { 
    .nav-custom a::before,
    .nav-custom a::after {
        display: inline-block;
        opacity: 0;
        -webkit-transition: -webkit-transform 0.3s, opacity 0.2s;
        -moz-transition: -moz-transform 0.3s, opacity 0.2s;
        transition: transform 0.3s, opacity 0.2s;
    }
    .nav-custom a::before {
        margin-right: 10px;
        content: '[';
        -webkit-transform: translateX(20px);
        -moz-transform: translateX(20px);
        transform: translateX(20px);
    }
    .nav-custom a::after {
        margin-left: 10px;
        content: ']';
        -webkit-transform: translateX(-20px);
        -moz-transform: translateX(-20px);
        transform: translateX(-20px);
    }
    .nav-custom a:hover::before,
    .nav-custom a:hover::after,
    .nav-custom a:focus::before,
    .nav-custom a:focus::after {
        opacity: 1;
        -webkit-transform: translateX(0px);
        -moz-transform: translateX(0px);
        transform: translateX(0px);
    }
    .nav-custom a:link, .nav-custom a:visited, .nav-custom a:hover, .nav-custom a:active {
        text-decoration: none;
        color: #fff;
        outline: none;
    }
    .nav-custom.affix a:link, .nav-custom.affix a:visited, .nav-custom.affix a:hover, .nav-custom.affix a:active {
        text-decoration: none;
        color:  #f87f73;
        outline: none;
    }
}
@media (max-width: 767px) {
    .navbar-collapse {
        width: 250px;
        position: fixed;
        right: -250px;
        top: 80px;
        overflow-x: hidden;
        background-color: rgba(255, 255, 255, 0.8);
        border-top: none;
        -webkit-box-shadow: none;
        box-shadow: none;
        -webkit-transition: all .35s ease;
        -o-transition: all .35s ease;
        transition: all .35s ease;
    }
    .navbar-collapse.in {
        right: 0px;
        width: 250px;
        -webkit-transition: all .35s ease;
        -o-transition: all .35s ease;
        transition: all .35s ease;
    }
    .navbar-collapse.collapsing {
        height: auto !important;
    }
    .navbar-nav {
        margin: 0 -15px;
    }
    .navbar-nav>li>a {
        padding: 0;
        line-height: 3em;
        text-align: center;
    }
    .navbar-collapse ul {
        border-left: 1px solid rgba(0, 0, 0, .18);
    }
    .navbar-collapse ul li {
        border-bottom: 1px solid rgba(0, 0, 0, .18);
    }
    .navbar-collapse ul li:hover {
        background-color: #f87f73;
        color: #fff;
        -webkit-transition: all .35s ease;
        -o-transition: all .35s ease;
        transition: all .35s ease;
    }
    .navbar-collapse ul a:link,
    .navbar-collapse ul a:visited {
        color: #f87f73;
    }
    .navbar ul a:hover {
        text-decoration: none;
        color: #fff;
    }
}

工作原理:

  1. 使用 navbar-fixed-top 类代替自定义样式。
  2. 您可以使用 Bootstrap Affix,而不是编写自己的 javascript 来处理滚动时更改导航栏。这个内置的 javascript 插件可以使用 data-offset-top 属性来设置词缀类自动附加到设置了 data-spy 属性的元素的点。使用 data 属性,您不需要一行 javascript,只需添加样式,以便在应用 affix 类后您希望元素的外观。现在您的所有样式都在您的 CSS 中,而无需在您的 javascript 中。
  3. 使用内置 navbar-toggle,它使用内置 Bootstrap Collapse 插件在移动导航之间进行切换。这消除了编写/测试/维护您自己的 javascript 的需要,并消除了您对菜单的重复标记。当菜单展开时,折叠插件会将 in 类应用于具有折叠类的元素,因此您可以使用它来设置菜单样式。
  4. 使用媒体查询根据视口大小更改菜单布局。 “移动”菜单仅在小于 767 像素的视口中显示,因此您可以轻松确定移动菜单的样式。

总体而言,CSS 与您的 CSS 几乎相同,我只是更改了选择器以反映标记中的更改。除了一些小的调整之外,它几乎是从您的网站上剪切和粘贴的。

【讨论】:

  • P.S.如果您选择这种方法,则不必担心 nav-custom 类上的填充,因为您不再在导航中使用 col-class。
  • 我怀疑这是因为您使用的是块级的 h1 元素。如果您将其更改为按钮(内联元素)并使用 col-sm-6 类将 text-right 类添加到包含 div 中,您应该会得到更好的结果。将 contact-right 类留在按钮上。您仍然需要调整按钮的样式,但无论如何使用按钮元素更具语义性和可访问性。
  • 我只想说,我认为您发现了 Chrome 错误。我在演示中进行了一系列更改和调整,试图找出渐变背景发生变化但仍然表现不佳的原因。如果您发布另一个问题以查看其他人是否可以就为什么会发生这种情况以及是否可以采取任何措施来解决它提出任何见解,那将会很有趣。
  • 问题实际上是你的javascript。删除这些行: $('.nav a').on('click', function(){ $(".navbar-toggle").click() //bootstrap 3.x by Richard });
  • 可以添加:$('.navbar-collapse').removeClass('in');直接在该行之前返回 false;如果要在单击链接时关闭菜单,请在单击处理程序中。我的演示正确地包含了 javascript。
【解决方案2】:

当页面打开时,您的导航位于 HTML 块中

<div class="row nav-custom nav-custom"> ... </div>

并且在滚动时导航位于块内

<div class="row nav-custom nav-custom-2"> ... </div>

在您的样式表http://rohanchhabra.in/css/custom.css 中有 padding:25px;padding:14px; 用于 .nav-custom .nav-custom-2 会破坏 Bootstrap 网格,因为没有足够的宽度来放置 col-sm-3 和 col-sm-9 列而不会将行分成两行。

您可以删除或编辑这 2 个类的填充,这样就不会添加任何额外的水平空间,例如

.nav-custom{
padding-top:15px;
padding-bottom:15px;
}

或者将 nav-custom 类放在你的 col 类中,例如

<div class="row">
  <div class="col-xs-3 col-sm-3">  
    <div class="nav-custom">  ... </div>
  </div>
  ...
</div>    

这里的关键是,您永远不想对任何引导行或列元素进行水平填充,否则您可能会破坏引导网格

祝你好运!

【讨论】:

    【解决方案3】:

    您可能遇到了 Safari 网络浏览器错误,因为此问题似乎只会在 Mac 上重现。我可以在运行 Safari 6.1 的 OSX 10.8 上重新创建该问题。刷新浏览器或单击任何导航值可清除问题并将导航显示重置到所需位置。您可以考虑为这个潜在的 Safari 显示问题提交错误。

    话虽如此,我解决此问题的建议是重构您的 HTML 以更好地利用核心 Bootstrap 导航组件。目前,您已将导航拆分为不同的 div 容器,并将其分别用于宽屏和移动设备。更标准的 Bootstrap 导航元素如下所示:

    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet"/>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <!-- Static navbar -->
                <nav class="navbar navbar-custom navbar-inverse navbar-fixed-top" role="navigation">
                      <div class="container" id="nav-container">
                        <!-- Brand and toggle get grouped for better mobile display -->
                        <div class="navbar-header">
                              <a class="navbar-brand" href=""><img src="" class="Logo" alt="Rohan Chhabra Designer and Developer"></a>
                          <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                            <span class="sr-only">Toggle navigation</span>
                            <span class="icon-bar"></span>
                            <span class="icon-bar"></span>
                            <span class="icon-bar"></span>
                          </button>
                        </div>
                    
                        <!-- Collect the nav links, forms, and other content for toggling -->
                        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
                          <ul class="nav navbar-nav">
                             <li><a href="#home">Home</a></li>
                             <li><a href="#design">Design</a></li>
                             <li><a href="#develop">Develop</a></li>
                             <li><a href="#contact">Contact</a></li>   
                          </ul>
                          
                        </div><!-- /.navbar-collapse -->
                      </div><!-- /.container-fluid -->
                    </nav>
            <!-- End Static navbar -->

    您当然需要在此代码示例中添加一些 custom.css 样式,并且它假定您的徽标是图像(因此相应地对其进行修改),但我认为通过使用这种更“标准”的导航Bootstrap 导航的实施,从长远来看,您将处于更好的状态。我已经使用这种样式导航测试了 Boostrap 网站,它们没有在您的示例中看到 Safari 显示问题。

    【讨论】:

      【解决方案4】:

      我已使用w3c validator 验证您的网站。

      发现一些关键问题需要纠正。

      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      

      我建议此行应与IE conditional comments 一起使用,如下行。

      <!-- [if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge"> -->
      

      并且锚标签不能作为元素ul的子元素

      请当前这些问题并检查。它肯定会解决您的网站问题。

      【讨论】:

        【解决方案5】:

        您可以尝试对不同的窗口大小使用媒体查询..

        https://developers.google.com/web/fundamentals/layouts/rwd-fundamentals/use-media-queries?hl=en.

        这可能对你有帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-07-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-19
          • 2013-09-02
          • 2012-02-19
          • 2020-11-24
          相关资源
          最近更新 更多