【问题标题】:Side menu hover close delay issue侧边菜单悬停关闭延迟问题
【发布时间】:2017-04-29 00:43:06
【问题描述】:

我是 javascript/jQuery 的新手。我正在尝试创建一个侧面菜单(滑出式抽屉)。我的一切工作正常,但是当我关闭抽屉时,带有关闭按钮的“标签”部分不会与抽屉的其余部分一起关闭,因为它继续悬停并保持打开状态。

我正在使用 CSS (Bootstrap) 来格式化整个幻灯片。我可以让它正常工作,只需将其悬停打开然后在鼠标移出滑出时关闭(您可以取消注释第一组 js 以查看它如何与悬停效果一起工作,这很顺利,这就是我需要的方式使用关闭按钮),但是我需要它保持打开状态,以便用户可以查看菜单,所以要关闭它,我添加了一个关闭按钮图像,他们需要单击以关闭。

我设置了一个 jsfiddle,以便您在单击关闭滑出时可以准确看到问题。下面是我的代码。任何帮助,将不胜感激。这是 jsfiddle 链接:https://jsfiddle.net/wtLge8te/2/

// add/remove hover class on hover
/*$("#slideoutNav").hover(function() {
      	$(this).addClass("hover");
      	}, function() {
      	$(this).removeClass("hover");
      });*/

// add hover class on mouseenter
$("#slideoutNav").on("mouseenter", function() {
  slideoutHover();
});

function slideoutHover() {
  var slideout = $("#slideoutNav");

  // unbind mouseenter for slideout
  $(slideout).off("mouseenter");
  // start slideout open animation
  $(slideout).addClass("hover");

  // clicking X button will close slideout
  $(slideout).find("a#slideoutBtn").on("click", function() {

    // turn off click binding
    $(this).off("click");
    // remove slideout
    $(slideout).removeClass("hover");

    // wait 1.5 seconds before activating hover again so it can slide back in without interuption
    window.setTimeout(function() {
      // setup mouseenter binding again
      $(slideout).on("mouseenter", function() {
        slideoutHover();
      });
    }, 1500);

  });
}
/* ===========================
    --- slideout drawer navigation
    ============================ */

#slideoutNav {
  position: fixed;
  top: 85px;
  left: 0;
  width: 35px;
  height: 75px;
  /*padding: 12px 0;*/
  text-align: center;
  background: #568388;
  background-repeat: no-repeat;
  -webkit-transition-duration: 0.3s;
  -moz-transition-duration: 0.3s;
  -o-transition-duration: 0.3s;
  transition-duration: 0.3s;
  -webkit-border-radius: 0 5px 5px 0;
  -moz-border-radius: 0 5px 5px 0;
  border-radius: 0 5px 5px 0;
  z-index: 999;
}

#slideoutNav a#slideoutBtn {
  background: url("http://techtalk.pcpitstop.com/wp-content/uploads/menuClose.png") no-repeat scroll;
  height: 75px;
  display: block;
}

#slideout_innerNav {
  position: fixed;
  top: 85px;
  left: -285px;
  background: #568388;
  width: 285px;
  padding: 25px 25px 10px 25px;
  height: auto;
  color: #fff;
  -webkit-transition-duration: 0.3s;
  -moz-transition-duration: 0.3s;
  -o-transition-duration: 0.3s;
  transition-duration: 0.3s;
  text-align: left;
  -webkit-border-radius: 0 0 5px 0;
  -moz-border-radius: 0 0 5px 0;
  border-radius: 0 0 5px 0;
  z-index: 999;
}

#slideout_innerNav h2 {
  color: #fff;
  margin-bottom: 5px;
  margin-top: -10px;
}

#slideout_innerNav p {
  font-size: 16px;
}

#slideout_innerNav textarea {
  width: 190px;
  height: 100px;
  margin-bottom: 6px;
}


/*
    #slideoutSupport:hover {
    	left: 305px;
    }
    #slideoutSupport:hover #slideout_innerSuppport {
    	left: 0;
    } */

#slideoutNav:hover,
#slideoutNav.hover {
  left: 285px;
}

#slideoutNav.hover {
  left: 285px;
}

#slideoutNav.hover a#slideoutBtn {
  background-image: url("http://techtalk.pcpitstop.com/wp-content/uploads/menuOpen.png");
}

#slideoutNav.hover #slideout_innerNav {
  left: 0;
}

* {
  padding: 0;
  margin: 0;
}

body {
  font: 16px/1 sans-serif
}


/*VERTICAL MENU*/

nav.vertical {
  position: relative;
  background: #7bbab9;
}


/* ALL UL */

nav.vertical ul {
  list-style: none;
}


/* ALL LI */

nav.vertical li {
  position: relative;
}


/* ALL A */

nav.vertical a {
  display: block;
  color: #eee;
  text-decoration: none;
  padding: 10px 15px;
  transition: 0.2s;
}


/* ALL A HOVER */

nav.vertical li:hover>a {
  background: #98ad38;
}


/* INNER UL HIDE */

nav.vertical ul ul {
  background: rgba(0, 0, 0, 0.1);
  padding-left: 20px;
  transition: max-height 0.2s ease-out;
  max-height: 0;
  overflow: hidden;
}


/* INNER UL SHOW */

nav.vertical li:hover>ul {
  max-height: 500px;
  transition: max-height 0.25s ease-in;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>

<div id="slideoutNav">
  <a href="javascript:;" id="slideoutBtn"></a>
  <div id="slideout_innerNav">
    <h3>Quick Links</h3>

    <nav class="vertical">
      <ul>
        <li><a href="index.html">Home</a></li>
        <li><a href="#">Church +</a>
          <ul>
            <li><a href="#">Welcome</a></li>
            <li><a href="#">What We Believe</a></li>
            <li><a href="#">Become a Member</a></li>
            <li><a href="#">Bible Studies</a></li>
            <li><a href="#">FAQs</a></li>
          </ul>
        </li>
        <li><a href="#">K-5 School +</a>
          <ul>
            <li><a href="#">Welcome</a></li>
            <li><a href="#">Admissions</a></li>
            <li><a href="#">Classrooms</a></li>
            <li><a href="#">Tuition</a></li>
            <li><a href="#">FAQs</a></li>
          </ul>
        </li>
        <li><a href="#">Preschool +</a>
          <ul>
            <li><a href="#">Welcome</a></li>
            <li><a href="#">Calendar</a></li>
            <li><a href="#">Lunch Menu &amp; news</a></li>
            <li><a href="#">Summer Care</a></li>
            <li><a href="#">FAQs</a></li>
            <li><a href="#">Tuition/Fees</a></li>
          </ul>
        </li>

      </ul>
    </nav>

  </div>
</div>
<!-- /#slideoutNav -->

【问题讨论】:

    标签: javascript jquery html css twitter-bootstrap


    【解决方案1】:

    我更新了你的 jsfiddle。

    https://jsfiddle.net/wtLge8te/6/

    但这里是你的 CSS 的主要变化。

    #slideoutNav {
      position: fixed;
      top: 85px;
      left: -285px;
      height: auto;
      width: 285px;
      /*padding: 12px 0;*/
      text-align: center;
      background: #568388;
      background-repeat: no-repeat;
      -webkit-transition-duration: 0.3s;
      -moz-transition-duration: 0.3s;
      -o-transition-duration: 0.3s;
      transition-duration: 0.3s;
      -webkit-border-radius: 0 5px 5px 0;
      -moz-border-radius: 0 5px 5px 0;
      border-radius: 0 5px 5px 0;
      z-index: 999;
    }
    #slideoutNav a#slideoutBtn {
      background: #568388 url("http://techtalk.pcpitstop.com/wp-content/uploads/menuClose.png") no-repeat 0px 0px;
      width: 35px;
      height: 75px;
      display:block;
      position: absolute;
      right: -35px;
      top: 0px;
    }
    #slideout_innerNav {
      background: #568388;
      width: 285px;
      padding: 25px 25px 10px 25px;
      height: auto;
      color: #fff;
    }
    
    #slideoutNav.hover {
        left: 0px;
    }
    

    【讨论】:

    • 谢谢mrdeleon!完美运行。所以,问题只是在我的CSS中。我确信它在我的 jQuery 中。你太棒了。
    【解决方案2】:

    我查看了您的总体结构,并提出了一种更高效、更精简的方法。您想在菜单上沿左边缘使用位置fixed,然后使用translateX(-100%) 将菜单移出屏幕。然后将打开/关闭链接放置在其中,absolute 位于顶部/右侧,并使用 translateX(100%) 将其推到菜单外。然后只需单击操作translateX() 的打开/关闭链接切换一个类,隐藏和显示菜单。转换transform 属性可以获得 GPU 加速并且不会导致动画性能问题。

    var $menu = $('.menu'),
        $open = $(".open");
    
    function setHover() {
      $menu.addClass('hover');
      $open.text('close');
    }
    
    $menu.not('.hover').on('mouseover', function() {
      setHover();
    });
    
    $open.on('click',function() {
      if ($menu.hasClass('hover')) {
        $(this).text('open');
        $menu.off('mouseover').removeClass('hover').on('transitionend', function() {
          $(this).removeClass('hover');
          $(this).on('mouseover', function() {
            setHover();
          }).off('transitionend');
        });
      } else {
        setHover();
      }
    })
    .menu {
      position: fixed;
      top: 0;
      left: 0;
      transform: translateX(-100%);
      transition: transform .25s;
    }
    
    .open {
      position: absolute;
      top: 0; right: 0;
      transform: translateX(100%);
    }
    
    .hover {
      transform: translateX(0);
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <div class="menu">
      sidemenu
      <a href="#" class="open">open</a>
    </div>

    【讨论】:

      猜你喜欢
      • 2016-12-20
      • 2022-01-09
      • 2022-08-05
      • 2016-04-02
      • 1970-01-01
      • 1970-01-01
      • 2016-03-15
      • 2021-02-24
      • 2016-04-13
      相关资源
      最近更新 更多