【问题标题】:Responsive Menu with Dropdown Elements带有下拉元素的响应式菜单
【发布时间】:2018-02-08 14:46:43
【问题描述】:

我主要是从 PureCSS“文档”中复制 demo code 来实现他们的 dropdown menu

我创建了一个CodePen,并将在这里分享代码。

问题是在垂直版本中,子菜单项在悬停或点击时没有显示。

我认为这是设计使然,我不确定是否应该编写额外的 JavaScript (example) 以启用触摸设备等的点击显示。

我拥有的是:

HTML:

<h1>PureCSS.io Responsive Nav Test</h1>
<link rel="stylesheet" href="https://unpkg.com/purecss@1.0.0/build/grids-responsive-min.css">
<link rel="stylesheet" href="https://unpkg.com/purecss@1.0.0/build/pure-min.css" integrity="sha384-nn4HPE8lTHyVtfCBi5yW9d20FjT8BJwUXyWZT9InLYax14RDjBj46LmSztkmNP9w" crossorigin="anonymous">
<a href="#" class="custom-toggle" id="toggle"><s class="bar"></s><s class="bar"></s><s class="bar"></s></a>
 <nav class="custom-wrapper pure-menu custom-restricted-width pure-u-1" id="menu">
    <div class="pure-menu pure-menu-horizontal custom-can-transform">
      <ul id="menu-header-nav-menu" class="pure-menu-list">
        <li class="pure-menu-item">
           <a class="pure-menu-link" class='pure-menu-link' href="#">One</a>
        </li>
        <li class="pure-menu-item">
           <a class="pure-menu-link" class='pure-menu-link' href="#">Two</a>
         </li>
        <li class="pure-menu-item">
          <a class="pure-menu-link" class='pure-menu-link' href="#">Three</a>
        </li>
        <li class="pure-menu-item pure-menu-has-children pure-menu-allow-hover">
          <a class="pure-menu-link" class='pure-menu-link' href="#">Parent</a>
          <ul class="pure-menu-children">
              <li class="pure-menu-item">
              <a class="pure-menu-link" class='pure-menu-link' href="#">Child One</a>
             </li>
               <li class="pure-menu-item">
               <a class="pure-menu-link" class='pure-menu-link' href="#">Child Two</a>
             </li>
            </ul>
          </li>
        </ul>
    </div>
 </nav>

CSS:

  .site-header {
      position: relative;
  }

  .custom-wrapper {
      margin-bottom: 1em;
      -webkit-font-smoothing: antialiased;
      height: 2.1em;
      overflow: hidden;
      -webkit-transition: height 0.5s;
      -moz-transition: height 0.5s;
      -ms-transition: height 0.5s;
      transition: height 0.5s;
  }

  .custom-wrapper.open {
      height: 14em;
  }

  .custom-wrapper {
      height: 0;
  }

  .custom-toggle {
      width: 34px;
      height: 34px;
      position: absolute;
      top: 0;
      right: 0;
      display: none;
  }

  .custom-toggle {
      display: block;
  }

  .custom-toggle .bar {
      background-color: #777;
      display: block;
      width: 20px;
      height: 2px;
      border-radius: 100px;
      position: absolute;
      top: 18px;
      right: 7px;
      -webkit-transition: all 0.5s;
      -moz-transition: all 0.5s;
      -ms-transition: all 0.5s;
      transition: all 0.5s;
  }

  .custom-toggle .bar:first-child {
      -webkit-transform: translateY(-6px);
      -moz-transform: translateY(-6px);
      -ms-transform: translateY(-6px);
      transform: translateY(-6px);
  }

  .custom-toggle .bar:last-child {
      -webkit-transform: translateY(+6px);
      -moz-transform: translateY(+6px);
      -ms-transform: translateY(+6px);
      transform: translateY(+6px);
  }

  .custom-toggle.x .bar:last-child {
      display: none;
  }

  .custom-toggle.x .bar {
      -webkit-transform: rotate(45deg);
      -moz-transform: rotate(45deg);
      -ms-transform: rotate(45deg);
      transform: rotate(45deg);
  }

  .custom-toggle.x .bar:first-child {
      -webkit-transform: rotate(-45deg);
      -moz-transform: rotate(-45deg);
      -ms-transform: rotate(-45deg);
      transform: rotate(-45deg);
  }

  @media (min-width: 47.999em) {
    .custom-toggle {
        display: none;
    }

    .custom-wrapper {
      height: 3.2em;
      overflow: visible;
    }

    .pure-menu-children .pure-menu-item {
      background-color: #999;
    }
  }

Javascript:

(function (window, document) {
  var menu = document.getElementById('menu'),
      WINDOW_CHANGE_EVENT = ('onorientationchange' in window) ? 'orientationchange':'resize';

  function toggleHorizontal() {
      [].forEach.call(
          document.getElementById('menu').querySelectorAll('.custom-can-transform'),
          function(el){
              el.classList.toggle('pure-menu-horizontal');
          }
      );
  };

  function toggleMenu() {
      // set timeout so that the panel has a chance to roll up
      // before the menu switches states
      if (menu.classList.contains('open')) {
          setTimeout(toggleHorizontal, 500);
      }
      else {
          toggleHorizontal();
      }
      menu.classList.toggle('open');
      document.getElementById('toggle').classList.toggle('x');
  };

  function closeMenu() {
      if (menu.classList.contains('open')) {
          toggleMenu();
      }
  }

  document.getElementById('toggle').addEventListener('click', function (e) {
      toggleMenu();
      e.preventDefault();
  });

  window.addEventListener(WINDOW_CHANGE_EVENT, closeMenu);
})(this, this.document);

我是否正确地假设我需要使用额外的脚本来处理移动子导航?

【问题讨论】:

    标签: yui-pure-css pure-css


    【解决方案1】:

    发生的事情是“孩子”不在页面上。

    我不确定为什么需要修改基本的 yui-pure-css 标记,但为了在这种情况下工作,我针对小屏幕尺寸修改了以下两项:

    .pure-menu-has-children {
      position: relative;
    }
    
    .pure-menu-children {
        left: 3em;
        top: 2em;
    }
    

    .pure-menu-children ulposition: absolute,但我不确定它的 relative 父级是什么。也许是ul。无论如何,将 .pure-menu-has-children li 设为相对父级有助于它相对于父级列表项显示。

    我使用的是移动优先方法,因此对于更大视口的媒体查询,它可以恢复为框架默认值:

    .pure-menu-children {
        left: 100%;
        top: 0;
    }
    

    但是我认为我更喜欢它,因为它在较小的设备上。这是更新后的Pen

    不完全高兴。也许垂直菜单不需要那么宽。在这种情况下,我还发现需要添加到 .pure-menu-linktext-align: left,因为 child item 似乎仍然基于全角项目对齐。

    【讨论】:

      猜你喜欢
      • 2016-11-12
      • 2019-01-16
      • 2014-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-05
      相关资源
      最近更新 更多