【问题标题】:Rounded animation Hamburger menu not opening menu items圆形动画汉堡菜单未打开菜单项
【发布时间】:2020-07-28 07:34:15
【问题描述】:

Ì 找到了一个很酷的脚本来显示“圆形动画”汉堡菜单,请参阅 https://jsfiddle.net/sigug/5ohmne6g/25/ 我有一个 ul 菜单项列表,它们目前没有显示,因为它们是“显示:无”。当我删除它时,它们就在那里(显然)。 现在如何使用单击菜单时弹出的动画“圆圈”来显示它们? 由于它们在动画的“外部”,是否只能将它们淡入“之后”或其他什么?

HTML

<div class="menu"><button class="nav-tgl" type="button" aria-label="toggle menu"><span aria-hidden="true"></span></button>
    <nav class="nav">
        <ul>
            <li>element one</li>
            <li>element two</li>
            <li>element three</li>
            <li>element four</li>
        </ul>
    </nav>
</div>

CSS

.cd-nav-trigger {
  top: 18px;
  right: 5%;
  height: 44px;
  width: 44px;
  z-index: 5;
  /* image replacement */
  overflow: hidden;
  text-indent: 100%;
  white-space: nowrap;
}

.cd-overlay-nav, .cd-overlay-content {
  /* containers of the 2 main rounded backgrounds - these containers are used to position the rounded bgs behind the menu icon */
  position: fixed;
  top: 18px;
  right: 5%;
  height: 4px;
  width: 4px;
  transform: translateX(-20px) translateY(20px);
}

.cd-overlay-nav span, .cd-overlay-content span {
  display: inline-block;
  position: absolute;
  border-radius: 50%;
  will-change: transform;
  transform: scale(0);
}

.cd-nav-trigger .cd-icon {
  /* icon created in CSS */
  position: absolute;
  left: 50%;
  top: 50%;
  bottom: auto;
  right: auto;
  transform: translateX(-50%) translateY(-50%);
  display: inline-block;
  width: 18px;
  height: 3px;
  background-color: #ffffff;
  z-index: 10;
}

.cd-nav-trigger .cd-icon::before, .cd-nav-trigger .cd-icon:after {
  /* upper and lower lines of the menu icon */
  position: absolute;
  top: 0;
  right: 0;
  width: 100%;
  height: 100%;
  background-color: inherit;
  transition: transform .3s;
}

.cd-nav-trigger .cd-icon::before {
  transform: translateY(-6px) rotate(0deg);
}

.cd-nav-trigger .cd-icon::after {
  transform: translateY(6px) rotate(0deg);
}

.cd-nav-trigger.close-nav .cd-icon {
  /* user clicks on the .cd-nav-trigger element - transform the icon */
  background-color: rgba(255, 255, 255, 0);
}

.cd-nav-trigger.close-nav .cd-icon::before, .cd-nav-trigger.close-nav .cd-icon::after {
  background-color: white;
}

.cd-nav-trigger.close-nav .cd-icon::before {
  transform: translateY(0) rotate(45deg);
}

.cd-nav-trigger.close-nav .cd-icon::after {
  transform: translateY(0) rotate(-45deg);
}

.cd-nav-trigger::before, .cd-nav-trigger::after {
  /* 2 rounded colored backgrounds for the menu icon */
  position: absolute;
  top: 0;
  left: 0;
  border-radius: 50%;
  height: 100%;
  width: 100%;
  transition-property: transform;
}
.cd-nav-trigger::before {
  background-color: #091d23;
  transform: scale(1);
  transition-duration: 0.3s;
  transition-delay: 0.4s;
}
.cd-nav-trigger::after {
  background-color: #ffb441;
  transform: scale(0);
  transition-duration: 0s;
  transition-delay: 0s;
}
.cd-nav-trigger.close-nav::before {
  /* user clicks on the .cd-nav-trigger element - 1st rounded background disappears */
  transform: scale(0);
}
.cd-nav-trigger.close-nav::after {
  /* user clicks on the .cd-nav-trigger element - 2nd rounded background appears */
  transform: scale(1);
  transition-duration: 0.3s;
  transition-delay: 0.4s;
}

jQuery

const menu = document.querySelector('.menu');
const btn = menu.querySelector('.nav-tgl');
btn.addEventListener('click', evt => {
  menu.classList.toggle('active');
})
``

【问题讨论】:

标签: jquery css hamburger-menu


【解决方案1】:

这是一个全 CSS 解决方案。我没有使用事件,而是使用带有标签的复选框作为按钮。

HTML

<div class="nav">
    <input type="checkbox" class="nav__checkbox" id="nav-toggle">
    <label for="nav-toggle" class="nav__button">
      <span class="nav__icon"></span>
    </label>

    <div class="nav__background"></div>

    <nav class="nav__menu">
        <ul class="nav__list">
            <li class="nav__item">Item1</li>
            <li class="nav__item">Item2</li>
            <li class="nav__item">Item3</li>
            <li class="nav__item">Item4</li>
        </ul>
    </nav>
</div>

CSS

.nav__checkbox{
  display: none;
}

.nav__button{
  background-color: #fff;
  position: fixed;
  height: 4.375rem;
  width: 4.375rem;
  border-radius: 50%;
  top: 2.5rem;
  right: 2.5rem;
  z-index: 20;
  cursor: pointer;
}

.nav__background{
  background-image: linear-gradient(#000, #000);
  height: 3.75rem;
  width: 3.75rem;
  border-radius: 50%;
  position: fixed;
  top: 2.8125rem;
  right: 2.8125rem;
  z-index: 10;
  transition: transform .6s ease;
}

.nav__menu{
  height: 100vh;
  position: fixed;
  color:#00f;
  top: 0;
  left: 0;
  z-index: 15;
  opacity: 0;
  visibility: hidden;
  width: 0;
  transition: all .6s ease;
}

.nav__checkbox:checked ~ .nav__menu{
  opacity: 1;
  visibility: visible;
  width: 100%;
}

.nav__checkbox:checked ~ .nav__background{
  transform: scale(20);
}

body{
  background-color: #eee;
}

这是链接

https://jsfiddle.net/1wcpz3ua/8/

【讨论】:

  • 谢谢!您认为这在生产站点中是否可用,或者可能存在“问题”? (愚蠢的问题)另外,现在唯一剩下的就是,用那个解决方案,背景应该是“全屏”,目前圆圈只显示一半。看起来也很酷,但它必须填满整个屏幕......
  • 我一直在使用这种导航菜单,从来没有遇到过问题。要更改圆圈覆盖的范围,只需修改 transform: scale() 属性。我用了 20,但如果你需要的话,你可以用 100。如果你打算使用任何渐变,你可以在媒体查询上配置它。
  • 再次感谢!所以,这一次真的是最后一件事:我想让打开的菜单总是在中心,似乎不适合添加 ``` top: 50%;左:50%;变换:翻译(-50%,-50%); ``` 但是,有一些奇怪的行为吗?
  • 确保将其添加到 .nav__list。另外,不要忘记“位置:绝对;”。它应该工作。 jsfiddle.net/uLfbn2th 这是不从左侧滑入的版本。我只是改变了过渡到不透明度和变换的方式。 jsfiddle.net/uLfbn2th/1
  • 你是说白圈?如果是这样,您可以在选中复选框时将其颜色更改为透明。该解决方案中有两个圆圈,白色的(标签)和黑色的(空 div)。黑色的是扩展的。
【解决方案2】:

您可以使用仅包含“显示:无”的单独类,并将其添加到脚本开头的列表中。根据我的经验,切换未硬编码到 HTML 中元素的类总是更容易。然后您只需使用 JQUERY 选择元素并从按钮菜单中单独切换新类,如下所示:

jquery:

const menu = document.querySelector('.menu');
const btn = menu.querySelector('.nav-tgl');
$('.nav ul').addClass("hidden");
btn.addEventListener('click', evt => {
  menu.classList.toggle('active');
  $('.nav ul').toggleClass("hidden");
})

CSS:

.hidden {
  display: none;
}

JSfiddle

【讨论】:

  • 谢谢,现在动画好像没了?
  • 哦,哎呀,我没注意到,对不起,我会调查一下
  • jsfiddle.net/b4e8z3ga 给你,将属性添加到错误的元素,这对你有用吗?
  • 哦,等一下,您的问题不仅是关于使列表显示,而是通过按钮动画使其看起来流畅,对吗?
  • jsfiddle.net/b4e8z3ga/2 所以 css 类是直接添加到 html 中的,这样可以防止 NO-JS 错误并且应该仍然可以工作。还添加了一个带有动画的单独类,使其看起来更流畅。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-28
  • 1970-01-01
  • 2016-08-11
  • 2019-08-13
  • 1970-01-01
  • 2017-12-01
  • 1970-01-01
相关资源
最近更新 更多