【问题标题】:Closing an Overlay Div on Click单击时关闭覆盖 div
【发布时间】:2016-11-14 10:38:06
【问题描述】:

我有两个按钮可以打开和关闭覆盖 div。

.trigger-overlay 用于显示菜单,.overlay-close 用于与多个叠加层一起关闭它们。

.wrap 包装所有内容,并在通过添加类 .wrap-open

打开叠加层时向右滑动

这工作 .trigger-overlay 被点击但不是当 .overlay-close 被点击。 See example。 (点击第二张幻灯片中的链接 1 或链接 2)。

.overlay-close被点击时,我需要对下面的JS代码做些什么来删除.wrap-open

JS 小提琴: https://jsfiddle.net/cgx8zu2h/

工作示例: https://www.uk-cpi.com/temp-js/annual-review/

JavaScript

(function() {
  var triggerBttn = document.getElementsByClassName('trigger-overlay');
  var closeBttn = document.getElementsByClassName('overlay-close');
  var wrap = document.querySelector('div.wrap');
  transEndEventNames = {
      'WebkitTransition': 'webkitTransitionEnd',
      'MozTransition': 'transitionend',
      'OTransition': 'oTransitionEnd',
      'msTransition': 'MSTransitionEnd',
      'transition': 'transitionend'
    },
    transEndEventName = transEndEventNames[Modernizr.prefixed('transition')],
    support = {
      transitions: Modernizr.csstransitions
    };

  function toggleOverlay() {
    var overlay = document.getElementById(this.getAttribute('data-href'));

    // If overlay is open
    if (classie.has(overlay, 'zap')) {

      classie.remove(overlay, 'zap');
      classie.remove(wrap, 'wrap-open');
      classie.add(overlay, 'close');

      var onEndTransitionFn = function(ev) {
        if (support.transitions) {
          if (ev.propertyName !== 'visibility') return;
          this.removeEventListener(transEndEventName, onEndTransitionFn);
        }
        classie.remove(overlay, 'close');
      };

      if (support.transitions) {
        overlay.addEventListener(transEndEventName, onEndTransitionFn);
      } else {
        onEndTransitionFn();
      }
    }

    // If overlay isn't closed
    else if (!classie.has(overlay, 'close')) {
      classie.add(overlay, 'zap');
      classie.add(wrap, 'wrap-open');
    }
    // If overlay is closed
    else if (classie.has(overlay, 'close')) {
      classie.add(overlay, 'zap');
      classie.add(wrap, 'wrap-open');
    }
  }



  for (var i = 0; i < triggerBttn.length; i++) {
    triggerBttn[i].addEventListener('click', toggleOverlay);
  }

  //counts number of closeBttn and remove zap on click for all
  for (var i = 0; i < closeBttn.length; i++) {
    closeBttn[i].addEventListener('click', function() {
      this.parentNode.className = this.parentNode.className.replace(/(?:^|\s)zap(?!\S)/g, '');
    });
  }
})();

【问题讨论】:

标签: javascript jquery css


【解决方案1】:

如您所见 - 基本上我只是告诉 #menu 位于 z-index: 180 .. 但我也取消了您对 'classie' 的使用,因为jquery 已经有了。虽然你知道完成工作的纯 JS 方式很好,但如果你已经在加载 jquery 为什么不利用它呢? https://jsfiddle.net/te0s2e86/1/

#menu{ z-index: 180; }

【讨论】:

  • 谢谢,您提高了效率。快到了。 1. .wrap-open 应在单击链接时添加到 .wrap(但不是在单击主菜单按钮时) 2. 单击主菜单按钮第一次有效,但当您不断重复单击菜单时会注意到按钮,它以倾斜的预动画状态显示菜单文本。
  • 嗯。你的 jsfiddle 里面没有完整的 wrap-open 东西。我很快就破解了它——但这会导致一系列全新的问题。我已经插入了一个快速检查我们是否在菜单链接上调用它..但是现在这会导致导航链接在您关闭滑入式视图中的菜单后显示...一些重新思考/这里需要重新组合/重新编码! :-/ jsfiddle.net/te0s2e86/3
  • 现在运行良好。将菜单显示在另一个叠加层的顶部很好,因为它可以让用户保持控制。我的最后一个问题是让菜单导航项关闭所有覆盖。有什么想法吗?
  • jsfiddle.net/te0s2e86/4 - 这尊重用户在导航链接中点击的任何内容(!)。本质上: if(!is_menu) $('.wrap-open,.close,.zap').removeClass('wrap-open close zap');
  • 随着这一变化,需要将 wrap-open 从 wrap 中移除,否则用户在单击菜单项时只会看到一个空白页面。
猜你喜欢
  • 2018-05-22
  • 2017-12-28
  • 2021-09-21
  • 2017-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多