纯CSS移动菜单:无法关闭 [英] Pure CSS mobile menu: Unable to close

查看:105
本文介绍了纯CSS移动菜单:无法关闭的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当点击菜单链接时,如何关闭此纯CSS移动菜单?我试着在< label for =nav-collapse> ; a> ...< / a>< / label> 喜欢关闭按钮(工作),但无效。

How does one close this pure CSS mobile menu when clicking on the menu links? I tried wrapping them in <label for="nav-collapse"><a>...</a></label> like the close button (which works) but to no avail.

http://codepen.io/anon/pen/PwEBaM

基于 http://www.scottohara.me /article/morph-button-updated.html

 *, *::after, *::before {
  box-sizing: border-box;
  font-family: arial;
  line-height: 2;
  margin: 0; }

body {
  background: #444;
  overflow-x: hidden; }

p {
  margin-bottom: 24px; }
  p:last-child {
    margin-bottom: 0; }

.content {
  margin: auto;
  max-width: 1000px;
  padding: 20px; }

.invis {
  height: 1px;
  left: -999px;
  position: absolute;
  top: -999px;
  visibility: hidden;
  width: 1px; }

.main-base {
  background: #eee;
  left: 0px;
  position: relative;
  transition: all .3s; }

  .main-base header, .main-base footer {
    background: #888;
    color: #fff; }

footer a {
  color: #fff; }

.nav-side {
  background: #56cee8;
  color: #fff;
  top: 20px;
  box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
  height: 60px;
  left: 20px;
  overflow: hidden;
  padding: 8px 0;
  position: fixed;
  transition: all .3s;
  width: 60px;
  z-index: 2; }

.menu-list {
  height: 0%;
  list-style: none;
  margin: 0;
  overflow: hidden;
  padding: 0;
  transition: all .3s; }
  .menu-list a {
    border-bottom: 1px solid #eee;
    color: #222;
    display: block;
    padding: 12px 8px;
    text-decoration: none; }
    .menu-list a:hover {
      background: rgba(0, 0, 0, 0.5); }

.btn-label {
  cursor: pointer;
  display: block;
  height: 60px;
  width: 60px;
  position: absolute;
  top: 0;
  left: 0; }
  .btn-label .top {
    height: 3px;
    background-color: #fff;
    position: absolute;
    top: 12px;
    left: 12px;
    right: 12px;
  }
  .btn-label .middle {
    height: 3px;
    background-color: #fff;
    position: absolute;
    top: 22px;
    left: 12px;
    right: 12px;
  }
  .btn-label .bottom {
    height: 3px;
    background-color: #fff;
    position: absolute;
    top: 32px;
    left: 12px;
    right: 12px;
  }
  .btn-label .label {
    text-align: center;
    position: absolute;
    bottom: 2px;
    left: 0;
    right: 0;
    font-size: 12px;
  }
  #nav-expand:checked + .nav-side .btn-label {
    display: none;
  }

.close {
  cursor: pointer;
  text-align: right;
  padding-right: 15px;
  line-height: 30px;
  font-size: 30px;
  cursor: hand;
  cursor: pointer;
  display: none;
  height: 40px;
  border-bottom: 1px solid #fff; }
  #nav-expand:checked + .nav-side .close {
    display: block;
  }

#nav-expand:checked + .nav-side {
  bottom: 0;
  height: 100%;
  left: 0;
  width: 200px; }
  #nav-expand:checked + .nav-side .menu-list {
    height: 100%; }
  #nav-expand:checked + .nav-side .btn-label {
    color: transparent;
    display: inline-block;
    height: 20px;
    line-height: 20px;
    text-align: center;
    width: 20px; }
  #nav-expand:checked + .nav-side + .main-base {
    left: 200px; }
  #nav-collapse + .main-base {
    left: 200px; }
  #nav-collapse + .main-base > .overlay {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background-color: rgba(0,0,0,.5);
    opacity: 1;
    transition: opacity .3s; }
  #nav-collapse:checked + .main-base {
    left: 0; }
  #nav-collapse:checked + .main-base > .overlay {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    height: 0;
    width: 0;
    opacity: 0; }

 <div class="page">

    <input type="radio" id="nav-expand" name="nav" class="invis" />
    <nav class="nav-side">
      <label for="nav-collapse" class="close">
        &times;
      </label>
      <label for="nav-expand" class="btn-label">
        <span class="top"></span><span class="middle"></span><span class="bottom"></span><span class="label">MENU</span>
      </label>

      <ul class="menu-list">
        <li>
          <label for="nav-collapse">
            <a href="#!" title="descriptive title">
              Link Label
            </a>
          </label>
        </li>
        <li>
          <label for="nav-collapse">
            <a href="#!" title="descriptive title">
              ಠ_ಠ Link Label
            </a>
          </label>
        </li>
      </ul>
    </nav>

    <input type="radio" id="nav-collapse" name="nav" checked="checked" class="invis" />
    <main class="main-base" role="main">

      <header class="header-base" role="banner">
        <div class="content">
          <h1>
            Display Sidebar/Settings on Click/Press of Icon
          </h1>
        </div>
      </header>

      <article>
        <div class="content">
          <p>
            Bacon ipsum dolor sit amet filet mignon prosciutto ham hock boudin pork chop swine shoulder beef. Flank andouille ground round strip steak pork bacon venison ham hock, tongue turducken. Venison jowl hamburger salami bacon capicola. Chuck ribeye sirloin spare ribs, venison beef t-bone prosciutto swine strip steak. Chuck jowl spare ribs tenderloin prosciutto. Pancetta pork chop venison bacon short ribs porchetta. Short loin short ribs kielbasa biltong t-bone tail brisket porchetta pork pork loin chicken.
          </p>
          <p>
            Pork belly meatball sirloin ribeye pork loin meatloaf. Tongue kielbasa chuck sausage, turducken jerky hamburger t-bone fatback frankfurter pork loin pig venison tail. Sirloin tri-tip kevin shankle salami doner jerky capicola leberkas tongue drumstick. Tongue turkey prosciutto salami tri-tip. Shank doner sirloin landjaeger pancetta beef ribs.
          </p>
          <p>
            Frankfurter pork loin short ribs andouille kevin. T-bone tail pig chuck prosciutto brisket. Landjaeger tail fatback beef porchetta, biltong shoulder turkey shankle kevin jowl pancetta brisket pork belly boudin. Short loin tenderloin swine, hamburger bresaola rump shank ground round ham kielbasa chicken pancetta capicola. Boudin chicken frankfurter, pig kielbasa flank ball tip. Corned beef pastrami landjaeger, meatloaf flank shankle pig meatball chuck pork loin swine.
          </p>
          <p>
            Pork belly meatball sirloin ribeye pork loin meatloaf. Tongue kielbasa chuck sausage, turducken jerky hamburger t-bone fatback frankfurter pork loin pig venison tail. Sirloin tri-tip kevin shankle salami doner jerky capicola leberkas tongue drumstick. Tongue turkey prosciutto salami tri-tip. Shank doner sirloin landjaeger pancetta beef ribs.
          </p>
          <p>
            Frankfurter pork loin short ribs andouille kevin. T-bone tail pig chuck prosciutto brisket. Landjaeger tail fatback beef porchetta, biltong shoulder turkey shankle kevin jowl pancetta brisket pork belly boudin. Short loin tenderloin swine, hamburger bresaola rump shank ground round ham kielbasa chicken pancetta capicola. Boudin chicken frankfurter, pig kielbasa flank ball tip. Corned beef pastrami landjaeger, meatloaf flank shankle pig meatball chuck pork loin swine.
          </p>
        </div>
      </article>

      <footer>
        <div class="content">
          <p>
            oh bai
          </p>
        </div>
      </footer>

      <label for="nav-collapse" class="overlay"></label>
    </main>

  </div>

推荐答案

看起来链接采用点击事件,并且不会将其传递给标签。

It looks like the link takes the click event and does not pass it to the label.

如果您将标签包裹在锚点内,则问题反过来。

If you wrap the label inside the anchor, the problem is reversed. The menu collapses but the link is not followed.

我不认为你会有这样的运气。

I don't think you will have any luck with this.

还有一种方法可以在纯CSS中切换菜单。

There's another way to toggle a menu in pure CSS. It does not involve custom markup like for the radio boxes but has other drawbacks.

这个想法是在打开的菜单链接上使用锚点。

The idea is to use an anchor on the open menu link.

.page-wrap #open-menu {
  display: block;
}
.page-wrap #close-menu {
  display: none;
}
.page-wrap #open-menu:target {
  display: block;
}
.page-wrap #open-menu:target + #close-menu {
  display: none;
}
.page-wrap #close-menu:target {
  display: block;
}
.page-wrap #close-menu:target + #open-menu {
  display: none;
}

<div class="page-wrap">
  <a id="close-menu" href="#open-menu">Close</a> 
  <a id="open-menu" href="#close-menu">Open</a> 
</div>

查看原始问题的适应解决方案: a href =http://codepen.io/manuszep/pen/NPyWqV =nofollow> http://codepen.io/manuszep/pen/NPyWqV

See adapted solution for original question : http://codepen.io/manuszep/pen/NPyWqV

由于解决方案依赖于锚点来触发菜单,浏览器会在您单击它时滚动到该锚点。

As the solution relies on anchors to trigger the menu, the browser will scroll to that anchor when you click it. This is something you may not want.

另一个问题是,如果您将该解决方案用于其他应用程序,点击页面上的任何其他定位点将会停用当前的定位点。

Another issue, if you use that solution for other applications, is that clicking any other anchor on the page will deactivate the current one.

最后,一次只能有一个活动锚。

And finally, you can have only one active anchor at a time.

这篇关于纯CSS移动菜单:无法关闭的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆