【问题标题】:responsive menu not showing响应式菜单未显示
【发布时间】:2017-09-20 03:39:32
【问题描述】:

我想在较小的屏幕上将菜单项显示为单独的行。这是非常基本的,在很多地方都见过。我想要的效果是:

到目前为止,我所拥有的(代码如下)菜单项仅显示在徽标旁边(这就是它们在桌面上的显示方式)。

我还需要在菜单项中添加背景图像。一张填充整个区域的图像,而不是为每个菜单重复的相同图像

我已经添加了:

<meta name="viewport" content="width=device-width, initial-scale=1">

这是我的fiddle

//make the topnav responsive for mobile screens
function topNav() {
    var x = document.getElementById("myTopnav");
    if (x.className === "myTopnav") {
        x.className += " responsive";
    } else {
        x.className = "myTopnav";
    }
}
.topnav {
    background-repeat:no-repeat;
    background-size:cover;
    overflow:visible;
    width: 100%;
    padding-bottom: 0px;
}

.topnav nav{
    padding-top: 5px;
    padding-bottom: 8px;
    background: -webkit-linear-gradient(left, transparent, black, black, transparent); /* For Safari 5.1 to 6.0 */
    background: -o-linear-gradient(left, transparent, black,black, transparent); /* For Opera 11.1 to 12.0 */
    background: -moz-linear-gradient(left, transparent, black,black, transparent); /* For Fx 3.6 to 15 */
    background: linear-gradient(to right, transparent, black, black, transparent); /* Standard syntax (must be last) */
    width:100%;
}

.topnav nav div{
    width: 85%;
    margin-left: 7.5%;
    margin-right: 7.5% ;
    display:flex;
    align-items: center;
    justify-content: center;
}

.link {
    color: white;
    text-decoration: none;
    font-size: 11px;
    font-weight: 700; /* this is futura heavy*/
    width:11.25%;
    letter-spacing: 2px;
    word-wrap:true;
    display:inline-block;
    vertical-align: top;
    text-align: center;
    /*line-height: 5em;*/
}

.notlink {
    width:30.4%;
    margin-left: 1%;
    margin-right: 1%;
    display: inline-block;
}

.notlink img {
    width: 100%;
}

.topnav nav .link:hover {
    color: #008ed2;
}

.icon {
    display: none;
    font-size: 32px;
    color: white;
    text-decoration: none;
    text-align: center;
    line-height: 40px;
    min-width: 40px;
    min-height: 40px;
}


/* When the screen is less than 600 pixels wide, hide all links, except for the first one ("Home"). Show the link that contains should open and close the topnav (.icon) */
@media only screen and (max-width: 767px) {
    .myTopnav a.link {display: none;}
    
    .topnav nav div{
        width: 100%;
        margin-left: 0;
        margin-right: 0;
        position: relative;
        top: 0;
        left: 0;
    }
    
    .icon {
      display :inline-block;
      position : absolute;
      right : 0;
    }
    
    .notlink {
        width: 70%;
        display : flex;
        align-items: center;
        justify-content : center;
    }
    .notlink img {
        max-width:100%;
        max-height:75px;
        width: auto;
        height: auto;
    }
}

@media screen and (max-width: 767px) {
    .myTopnav.responsive {position: relative;}
    .myTopnav.responsive .icon {
        position: absolute;
        right: 0;
        top: 0;
    }
    .myTopnav.responsive a {
        float: none;
        display: block;
        text-align: left;
    }

}
<div class="topnav">
                <nav>
                    <div class="myTopnav" id="myTopnav">
                        <a class="link" href="index.html">HOME</a>
                        <a class="link" id ="selected" href="about.html">ABOUT</a>
                        <a class="link" href="expertise.html">EXPERTISE</a>
                        <a class="notlink" href="index.html"><img src="https://www.google.com/logos/doodles/2017/earth-day-2017-5650394117046272-s.png"></a>
                        <a class="link" href="industries.html">INDUSTRIES</a>
                        <a class="link" href="friends.html">FRIENDS OF MARY</a>
                        <a class="link" href="contact.html">CONTACT</a>
                        <a href="javascript:void(0);" class="icon" onclick="topNav()">&#9776;</a>
                    </div>
                </nav>
            </div>

【问题讨论】:

  • 请看这个,它真的不干净,现在有一些不必要的代码,它需要一些重构,但我只是没有时间。如果它是你需要的,明天会重构/做得更好并把它打包成一个答案吗?:jsfiddle.net/gyexzhao/13
  • 我刚刚再次阅读了您的问题,我之前共享的小提琴可能不是您想要的。您想将徽标保留在顶部并插入另一个图像作为菜单背景吗?
  • 是的,没错
  • 抱歉回答迟了,请查看:jsfiddle.net/gyexzhao/14
  • 以上代码有错误:jsfiddle.net/gyexzhao/16这个比较好。现在您只需在展开时将其正确放置在其余内容上

标签: html css menu responsive-design


【解决方案1】:

这是我的解决方案(更改标记、js 和 css):

HTML:

<div class="topnav" data-mobile="false">
  <nav>
    <div class="myTopnav" id="myTopnav">
      <a class="link" href="index.html">HOME</a>
      <a class="link" id ="selected" href="about.html">ABOUT</a>
      <a class="link" href="expertise.html">EXPERTISE</a>
      <a class="notlink" href="index.html"><img src="https://www.google.com/logos/doodles/2017/earth-day-2017-5650394117046272-s.png"></a>
      <a class="link" href="industries.html">INDUSTRIES</a>
      <a class="link" href="friends.html">FRIENDS OF MARY</a>
      <a class="link" href="contact.html">CONTACT</a>
      <a href="javascript:void(0);" class="icon" onclick="topNav()">&#9776;</a>
    </div>
  </nav>

  <nav id="mobile-menu">
      <a class="link" href="index.html">HOME</a>
      <a class="link" id ="selected" href="about.html">ABOUT</a>
      <a class="link" href="expertise.html">EXPERTISE</a>
      <a class="link" href="industries.html">INDUSTRIES</a>
      <a class="link" href="friends.html">FRIENDS OF MARY</a>
      <a class="link" href="contact.html">CONTACT</a>
  </nav>
</div>

JS:

function topNav() {
  var topNav = document.querySelector('.topnav');
  topNav.dataset.mobile = (topNav.dataset.mobile == "false") ? true : false;
}

CSS:

html, body {
  height : 100%;
  margin : 0;
  padding : 0;
  background-color : white;
}

.topnav {
  overflow:hidden;
  width: 100%;
  padding-bottom: 0px;
}

.topnav nav:first-of-type{
  padding-top: 5px;
  padding-bottom: 8px;
  background: -webkit-linear-gradient(left, transparent, black, black, transparent); /* For Safari 5.1 to 6.0 */
  background: -o-linear-gradient(left, transparent, black,black, transparent); /* For Opera 11.1 to 12.0 */
  background: -moz-linear-gradient(left, transparent, black,black, transparent); /* For Fx 3.6 to 15 */
  background: linear-gradient(to right, transparent, black, black, transparent); /* Standard syntax (must be last) */
  width:100%;
}

.topnav .myTopnav{
  width: 85%;
  margin-left: 7.5%;
  margin-right: 7.5% ;
  display:flex;
  align-items: center;
  justify-content: center;
}

.link {
  color: white;
  text-decoration: none;
  font-size: 11px;
  font-weight: 700; /* this is futura heavy*/
  width:11.25%;
  letter-spacing: 2px;
  word-wrap:true;
  display:inline-block;
  vertical-align: top;
  text-align: center;
  /*line-height: 5em;*/
}

.notlink {
  width:30.4%;
  margin-left: 1%;
  margin-right: 1%;
  display: inline-block;
}

.notlink img {
  width: 100%;
}

.topnav nav .link:hover {
  color: #008ed2;
}

.icon {
  display: none;
  font-size: 32px;
  color: white;
  text-decoration: none;
  text-align: center;
  line-height: 40px;
  min-width: 40px;
  min-height: 40px;
}

#mobile-menu {
  width : 100%;
  height : 100%;
  padding : 20px;
  background: url(https://pbs.twimg.com/profile_images/638771889339404289/h64dZ4wh_400x400.png) no-repeat center center fixed;
  -webkit-background-size: cover;
  -moz-background-size: cover;
  -o-background-size: cover;
  background-size: cover;
  display: flex;
  flex-direction: column;
  /*justify-content: center; --> add this to center vertically*/ 
  align-items: center;
  box-sizing : border-box;
}

#mobile-menu > * {
  color : black;
}

.topnav[data-mobile=false] #mobile-menu {
  display : none;
}


@media only screen and (max-width: 767px) {
  .myTopnav a.link {
    display: none;
  }

  .topnav[data-mobile=true]{
    height : 100%;
  }

  .topnav nav div{
    width: 100%;
    height : 100%;
    margin-left: 0;
    margin-right: 0;
    position: relative;
    top: 0;
    left: 0;
  }

  .icon {
    display :inline-block;
    position : absolute;
    right : 0;
  }

  .notlink {
    width: 70%;
    display : flex;
    align-items: center;
    justify-content : center;
  }

  .notlink img {
    max-width:100%;
    max-height:75px;
    width: auto;
    height: auto;
  }
}

之后,当移动菜单展开时,您需要将其正确放置在您的以下内容上。

fiddle

【讨论】:

    【解决方案2】:

    这里是fiddle

    您需要为顶部栏添加flex-direction:column,以便将其显示为移动设备的列。

        .topnav nav div{
          flex-direction:column;
        }
        .myTopnav.responsive a.link:first-child{
          margin-top:30px;
        }
        .myTopnav.responsive a.link{
          width : 100%;
        }
        .myTopnav.responsive a.notlink{
              width: 70%;
        position: absolute;
        top: 0px;
        text-align: center;
        }
    

    【讨论】:

    • 不确定是不是只有我,但在小提琴中点击菜单按钮没有做任何事情。
    • 嗨@codeNinja,我已经更新了小提琴,现在检查一下。
    • 唯一的事情是背景图片应该填满整个屏幕。现在它只填满了菜单的顶部。
    • 您所做的新更新移动了徽标。徽标应保持原位。菜单抽屉应该覆盖全屏高度。在图片中看到我已经展示了木质背景填满了整页
    • 我不明白。在第一个小提琴中,谷歌徽标保持在顶部,背景黑色图像占据屏幕。在第二小提琴中,徽标位于中心。您希望 google 徽标在宽度和高度上覆盖整个屏幕吗?
    猜你喜欢
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 2020-09-02
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多