【问题标题】:Bootstrap clickable menu on hover悬停时引导可点击菜单
【发布时间】:2013-12-27 02:38:40
【问题描述】:

我使用 jquery 自定义了引导导航,无需单击以启用下拉菜单,您只需将鼠标悬停即可。但是,我正在尝试获取它,因此第一个菜单是可点击的,因为目前它不是。例如,目前 BLOG 是不可点击的,但我希望它是。其他类别可点击。

有人在引导方面有这方面的经验吗?它是建立在 wordpress 上的。我用来让菜单在悬停时显示的 jquery 是:

jQuery(document).ready(function() {

    var mq = window.matchMedia('(min-width: 768px)');
  if (mq.matches) {
    jQuery('ul.navbar-nav li').addClass('hovernav');
  } else {
    jQuery('ul.navbar-nav li').removeClass('hovernav');
  };
    /*
    The addClass/removeClass also needs to be triggered
  on page resize <=> 768px
    */
  if (matchMedia) {
    var mq = window.matchMedia('(min-width: 768px)');
    mq.addListener(WidthChange);
    WidthChange(mq);
  }
    function WidthChange(mq) {
    if (mq.matches) {
      jQuery('ul.navbar-nav li').addClass('hovernav');
    } else {
      jQuery('ul.navbar-nav li').removeClass('hovernav');
    }
  };


});

css 是:

@media (min-width: 768px) {
    .navbar-nav .caret {
        display:none;
    }

    .navbar-nav .open ul {
        display:none;
    }

    .navbar-default .navbar-nav > .open > a,.navbar-default .navbar-nav > .open > a:hover,.navbar-default .navbar-nav > .open > a:focus,.navbar-default .navbar-nav > .active > a,.navbar-default .navbar-nav > .active > a:hover,.navbar-default .navbar-nav > .active > a:focus {
        color:#555;
        background:none;
    }

    .navbar-inverse .navbar-nav > .open > a,.navbar-inverse .navbar-nav > .open > a:hover,.navbar-inverse .navbar-nav > .open > a:focus,.navbar-inverse .navbar-nav > .active > a,.navbar-inverse .navbar-nav > .active > a:hover,.navbar-inverse .navbar-nav > .active > a:focus {
        color:#969696;
        background:none;
    }

    .navbar-default .navbar-nav > .hovernav > a {
        color:#555;
    }

    .navbar-inverse .navbar-nav > .hovernav > a {
        color:#969696;
    }

    .navbar-default .navbar-nav > .hovernav:hover > a,.navbar-default .navbar-nav > .hovernav:hover > a:hover,.navbar-default .navbar-nav > .hovernav:hover > a:focus {
        color:#333;
        background:transparent;
    }

    .navbar-inverse .navbar-nav > .hovernav:hover > a,.navbar-inverse .navbar-nav > .hovernav:hover > a:hover,.navbar-inverse .navbar-nav > .hovernav:hover > a:focus {
        color:#F7F7F7;
        background:transparent;
    }

    .navbar-default .navbar-nav > li:hover {
        background:#e7e7e7;
    }

    .navbar-inverse .navbar-nav > li:hover {
        background:#080808;
    }

    .navbar-nav .hovernav:hover > .dropdown-menu {
        display:block;
    }
}

【问题讨论】:

  • 请问你有 JSFiddle 吗?

标签: jquery css twitter-bootstrap


【解决方案1】:

使用 matchMedia/媒体查询来完成你正在做的事情的问题:

许多触控设备的媒体查询与桌面设备相同。

触摸时不存在悬停。 IOS悬停,单击触发下拉2单击链接,BUUUT android不能以这种方式工作。因此,在触摸设备上,这些下拉菜单将无法访问。如何正确地做到这一点:

  1. 在 Android、IOS 和 Windows 8 手机上检测触摸和非触摸。

  2. 删除 .dropdown 链接上的属性数据切换 -- 删除 这允许点击在该切换上起作用。

  3. 如果没有触摸,则将删除属性包装在 if 语句中

  4. 将悬停脚本封装在非接触式 if 语句中

  5. 为触摸设备提供后备方案,以便他们可以访问第一个菜单 项目


演示:http://jsbin.com/ejAXoda/1/

编辑:http://jsbin.com/ejAXoda/1/edit


CSS

.touch .mobile-link {display:block;}
.no-touch .mobile-link {display:none}

脚本

/* ----- Detect touch or no-touch */
/*  Detects touch support and adds appropriate classes to html and returns a JS object
 *  Copyright (c) 2013 Izilla Partners Pty Ltd
 *  http://www.izilla.com.au
 *  Licensed under the MIT license
 *  https://coderwall.com/p/egbgdw
 */
var supports = (function () {
    var a = document.documentElement,
        b = "ontouchstart" in window || navigator.msMaxTouchPoints;
    if (b) {
        a.className += " touch";
        return {
            touch: true
        }
    } else {
        a.className += " no-touch";
        return {
            touch: false
        }
    }
})();

// -------- DO the stuff only on no-touch devices only

if ($("html").hasClass("no-touch")) {


// ------- REMOVE THE DATA TOGGLE ONLY ON "no-touch" devices and get the link to work
  $('.dropdown > a').removeAttr("data-toggle");  


// Hover dropdown for Bootstrap 3.x wrapped in this no-touch var
    /*
     * Project: Bootstrap Hover Dropdown
     * Author: Cameron Spear
     * Contributors: Mattia Larentis
     *
     * Dependencies: Bootstrap's Dropdown plugin, jQuery
     *
     * A simple plugin to enable Bootstrap dropdowns to active on hover and provide a nice user experience.
     *
     * License: MIT
     *
     * http://cameronspear.com/blog/bootstrap-dropdown-on-hover-plugin/
     */
    (function (e, t, n) {
        if ("ontouchstart" in document) return;
        var r = e();
        e.fn.dropdownHover = function (n) {
            r = r.add(this.parent());
            return this.each(function () {
                var i = e(this),
                    s = i.parent(),
                    o = {
                        delay: 500,
                        instantlyCloseOthers: !0
                    }, u = {
                        delay: e(this).data("delay"),
                        instantlyCloseOthers: e(this).data("close-others")
                    }, a = e.extend(!0, {}, o, n, u),
                    f;
                s.hover(function (n) {
                    if (!s.hasClass("open") && !i.is(n.target)) return !0;
                    a.instantlyCloseOthers === !0 && r.removeClass("open");
                    t.clearTimeout(f);
                    s.addClass("open");
                    s.trigger(e.Event("show.bs.dropdown"))
                }, function () {
                    f = t.setTimeout(function () {
                        s.removeClass("open");
                        s.trigger("hide.bs.dropdown")
                    }, a.delay)
                });
                i.hover(function () {
                    a.instantlyCloseOthers === !0 && r.removeClass("open");
                    t.clearTimeout(f);
                    s.addClass("open");
                    s.trigger(e.Event("show.bs.dropdown"))
                });
                s.find(".dropdown-submenu").each(function () {
                    var n = e(this),
                        r;
                    n.hover(function () {
                        t.clearTimeout(r);
                        n.children(".dropdown-menu").show();
                        n.siblings().children(".dropdown-menu").hide()
                    }, function () {
                        var e = n.children(".dropdown-menu");
                        r = t.setTimeout(function () {
                            e.hide()
                        }, a.delay)
                    })
                })
            })
        };
        e(document).ready(function () {
            e('[data-hover="dropdown"]').dropdownHover()
        })
    })(jQuery, this);

 } //END IF no-touch for hover script & removeAttr for the links to work

带有后备链接的 HTML 示例:

 <!-- Static navbar -->
  <div class="navbar navbar-default" role="navigation">
    <div class="navbar-header">
      <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
        <span class="sr-only">Toggle navigation</span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <a class="navbar-brand" href="#">Project name</a>
    </div>
    <div class="navbar-collapse collapse">
      <ul class="nav navbar-nav">
        <li class="active"><a href="#">Link</a></li>
        <li><a href="#">Link</a></li>
        <li><a href="#">Link</a></li>
        <li class="dropdown">
          <a href="http://getbootstrap.com" data-toggle="dropdown" data-hover="dropdown" data-delay="1000" data-close-others="false">Blog <b class="caret"></b></a>
          <ul class="dropdown-menu">


            <!-- add for touch they won't be able to get to the link -->
            <li class="mobile-link"><a href="blog.html">Latest News</a></li>

            <li><a href="#">Action</a></li>
            <li><a href="#">Another action</a></li>
            <li><a href="#">Something else here</a></li>
            <li class="divider"></li>
            <li class="dropdown-header">Nav header</li>
            <li><a href="#">Separated link</a></li>
            <li><a href="#">One more separated link</a></li>
          </ul>
        </li>
      </ul>
      <ul class="nav navbar-nav navbar-right">
        <li class="active"><a href="./">Default</a></li>
        <li><a href="../navbar-static-top/">Static top</a></li>
        <li><a href="../navbar-fixed-top/">Fixed top</a></li>
      </ul>
    </div><!--/.nav-collapse -->
  </div>

我在 Android 上对此进行了测试。在授予/接受之前在 IOS、Windows 8 和其他设备上进行测试。应该可以顺利运行。

【讨论】:

  • 我看不出它在移动设备上是如何工作的,父链接不会指向它的 href。它只是展开和折叠子级别。 (在安卓上测试)
  • 仔细阅读。触摸设备上没有悬停,因此单击可以打开链接或切换下拉菜单,但两者都不会。在此设置中,它会在触摸设备和非触摸设备上切换下拉菜单,它会悬停,以便您可以单击父级或使用下拉菜单。
  • 但是让它只在桌面上工作有什么意义呢?在我看来,菜单应该在所有设备中具有相同的功能。因此,如果你不能让它在任何地方都能正常工作,最好不要使用引导程序构建它......
  • 与 Bootstrap 无关。点击菜单在桌面和触控上都可以工作,悬停不是在触控设备上工作的功能,所以你必须做一个解决方法。这样做更多的学习。
  • 我不是在谈论悬停和点击,我是在谈论在桌面上进行父项工作(导航)而不是在移动设备上导航的意义。与更多的学习无关。这个概念从一开始就是错误的。本主题的标题是“Bootstrap clickable menu on hover”。您提供了桌面解决方案,但没有提供移动解决方案。
【解决方案2】:
$('body').on('mouseover', '.dropdown-toggle', function(e){
    $(e.currentTarget).trigger('click')
})

或者代替“.dropdown-toggle”,你可以使用触发下拉的元素的id

【讨论】:

    【解决方案3】:

    你有没有尝试添加一个

    $("#blog").click(function(){
        window.location.href="blog.html";
    });
    

    并添加&lt;div id="blog"&gt;&lt;/div&gt;?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-27
      • 1970-01-01
      • 2013-03-09
      • 2018-05-06
      • 1970-01-01
      • 2016-08-05
      • 1970-01-01
      • 2013-10-10
      相关资源
      最近更新 更多