Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使twitter引导子菜单在左侧打开?_Javascript_Jquery_Css_Twitter Bootstrap - Fatal编程技术网

Javascript 如何使twitter引导子菜单在左侧打开?

Javascript 如何使twitter引导子菜单在左侧打开?,javascript,jquery,css,twitter-bootstrap,Javascript,Jquery,Css,Twitter Bootstrap,我试图在下拉菜单中创建twitter引导子菜单,但我遇到了一个问题:我在页面的右上角有一个下拉菜单,该菜单还有一个子菜单。但是,当子菜单打开时,它不适合窗口,并且向右移动太多,所以用户只能看到第一个字母。如何使该子菜单不向右打开,而是向左打开?您使用的是最新版本的引导程序吗?我已经从中改编了html,如下所示。我添加了一个下拉列表,并通过添加pull right类将其放置在最右侧。当鼠标悬停在下拉菜单上时,它会自动向左拉,并且不会隐藏任何内容-所有菜单文本都可见。我没有使用任何自定义css &l

我试图在下拉菜单中创建twitter引导子菜单,但我遇到了一个问题:我在页面的右上角有一个下拉菜单,该菜单还有一个子菜单。但是,当子菜单打开时,它不适合窗口,并且向右移动太多,所以用户只能看到第一个字母。如何使该子菜单不向右打开,而是向左打开?

您使用的是最新版本的引导程序吗?我已经从中改编了html,如下所示。我添加了一个下拉列表,并通过添加
pull right
类将其放置在最右侧。当鼠标悬停在下拉菜单上时,它会自动向左拉,并且不会隐藏任何内容-所有菜单文本都可见。我没有使用任何自定义css

<div class="navbar navbar-inverse navbar-fixed-top">
  <div class="navbar-inner">
    <div class="container-fluid">
      <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </a>
      <a class="brand" href="#">Project name</a>
      <div class="nav-collapse collapse">
        <ul class="nav pull-right">
          <li class="active"><a href="#">Home</a></li>
          <li><a href="#about">About</a></li>
          <li><a href="#contact">Contact</a></li>
          <li class="dropdown open">
            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown <b class="caret"></b></a>
            <ul class="dropdown-menu">
              <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="nav-header">Nav header</li>
              <li><a href="#">Separated link</a></li>
              <li><a href="#">One more separated link</a></li>
            </ul>
          </li>
        </ul>
        <p class="navbar-text pull-right">
          Logged in as <a href="#" class="navbar-link">Username</a>
        </p>
      </div><!--/.nav-collapse -->
    </div>
  </div>
</div>

    • 导航标头

登录为


当前类
。下拉子菜单>。下拉菜单
左:100%。所以,如果您想打开左侧的子菜单,请将这些设置覆盖到负左侧位置。例如
左侧:-95%。现在您将在左侧获得子菜单,您可以调整其他设置以获得完美的预览

这是


编辑:OP的问题和我的答案来自2012年8月。同时,引导改变了,所以现在你有了。向左拉类。当时,我的回答是正确的。现在你不必手动设置css,你就可以了。向左拉类


编辑2:演示不起作用,因为引导更改了它们的URL。只需在JSFIDLE中更改外部资源,并用新资源替换它们。

我创建了一个javascript函数,它可以查看右侧是否有足够的空间。 如果有,他将在右侧显示,否则他将在左侧显示

测试地点:

  • Firefox(mac)
  • 乔姆(mac)
  • 狩猎(mac)
Javascript:

$(document).ready(function(){
    //little fix for the poisition.
    var newPos     = $(".fixed-menuprofile .dropdown-submenu").offset().left - $(this).width();
    $(".fixed-menuprofile .dropdown-submenu").find('ul').offset({ "left": newPos });

    $(".fixed-menu .dropdown-submenu").mouseover(function() {
        var submenuPos = $(this).offset().left + 325;
        var windowPos  = $(window).width();
        var oldPos     = $(this).offset().left + $(this).width();
        var newPos     = $(this).offset().left - $(this).width();

        if( submenuPos > windowPos ){
            $(this).find('ul').offset({ "left": newPos });
        } else {
            $(this).find('ul').offset({ "left": oldPos });
        }
    });
});
因为我不想在每个菜单项上添加此修复程序,所以我在其上创建了一个新类。 将固定菜单放在ul上:

<ul class="dropdown-menu fixed-menu">
我希望这对你有用


注:safari和chrome中的小错误,第一次悬停将把它放到左边的mutch,如果我修复了它,它将更新此帖子。

最简单的方法是将
左拉
类添加到
下拉菜单中

<li class="dropdown-submenu pull-left">

  • jsiddle:

    如果您使用较少的CSS,我编写了一个小mixin来移动带有连接箭头的下拉列表:

    .dropdown-menu-shift( @num-pixels, @arrow-position: 10px ) {  // mixin to shift the dropdown menu
        left: @num-pixels;
        &:before { left: -@num-pixels + @arrow-position; }        // triangle outline
        &:after  { left: -@num-pixels + @arrow-position + 1px; }  // triangle internal
    }
    
    然后,要移动id为
    dropdown-menu-x
    .dropdown menu
    ,例如,您可以执行以下操作:

    #dropdown-menu-x {
        .dropdown-menu-shift( -100px );
    }
    

    执行此任务的正确方法是:

    /* Submenu placement itself */
    .dropdown-submenu > .dropdown-menu { left: auto; right: 100%; }
    /* Arrow position */
    .dropdown-submenu { position: relative; }
    .dropdown-submenu > a:after { position: absolute; left: 7px; top: 3px; float: none; border-right-color: #cccccc; border-width: 5px 5px 5px 0; }
    .dropdown-submenu:hover > a:after { border-right-color: #ffffff; }
    

    如果我理解正确的话,bootstrap为这种情况提供了一个CSS类。将“向右拉”添加到菜单“ul”:

    <ul class="dropdown-menu pull-right">
    

    …最终结果是菜单选项显示右对齐,与它们从中下拉的按钮一致。

    事实上-如果您可以浮动
    下拉列表
    包装器-我发现将
    导航栏右
    添加到
    下拉列表
    非常简单

    这看起来像作弊,因为它不在导航栏中,但对我来说很好

    <div class="dropdown navbar-right">
    ...
    </div>
    
    。。。或者作为它的包装

    <div class="pull-left">
      <div class="dropdown navbar-right">
      ...
      </div>
    </div>
    
    
    ...
    
    如果您使用的是bootstrap v4,那么有一种新的方法可以做到这一点

    您应该在
    .dropdown menu
    元素上使用
    .dropdown menu right

    <div class="btn-group">
      <button type="button" class="btn btn-secondary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
        Right-aligned menu
      </button>
      <div class="dropdown-menu dropdown-menu-right">
        <button class="dropdown-item" type="button">Action</button>
        <button class="dropdown-item" type="button">Another action</button>
        <button class="dropdown-item" type="button">Something else here</button>
      </div>
    </div>
    
    
    右对齐菜单
    行动
    另一个动作
    还有别的吗
    

    链接到代码:

    如果您只有一个级别,并且使用bootstrap 3,则向
    ul
    元素添加
    pull right

    <ul class="dropdown-menu pull-right" role="menu">
    

    我创建了一个javascript函数,用于查看右侧是否有足够的空间。如果有,他将在右侧显示,否则他将在左侧显示。同样,如果它在右侧有足够的空间,它将显示右侧。这是一个循环

    $(document).ready(function () {
    
    $('body, html').css('overflow', 'hidden');
    var screenWidth = $(window).width();
    $('body, html').css('overflow', 'visible');
    
    if (screenWidth > 767) {
    
        $(".dropdown-submenu").hover(function () {
    
            var dropdownPosition = $(this).offset().left + $(this).width() + $(this).find('ul').width();
            var newPosition = $(this).offset().left - $(this).find('ul').width();
            var windowPosition = $(window).width();
    
            var oldPosition = $(this).offset().left + $(this).width();
            //document.title = dropdownPosition;
            if (dropdownPosition > windowPosition) {
                $(this).find('ul').offset({ "left": newPosition });
            } else {
                $(this).find('ul').offset({ "left": oldPosition });
            }
        });
    
    }
    

    }))

    你唯一要做的就是


    您要在右侧显示的菜单的一部分。

    这不是我所需要的。这只是一个下拉列表(我也使用“向右拉”或“向左拉”)。但我需要在子菜单中打开子菜单并使其向左打开(下拉菜单中的箭头应指示存在子菜单,该子菜单应向左打开,而不是像标准菜单那样向右打开)。发布代码片段。在引导程序4中,在
    容器上添加
    。向右拉
    。下拉菜单
    容器。谢谢。几乎正是我需要的,然而,应该有
    左:-90%(否则我无法将鼠标移动到该子菜单,因为它会消失)。正如我所说,这正是您需要做的。很高兴我得到了帮助:)你的例子只适用于某些情况。请看这里:这不是正确的答案,因为引导类应该像Schmalzy和Matt的帖子中提到的那样使用。这篇帖子比它老了整整一年。同时,bootstrap也发生了变化,因此Schmalzy的回答更加优雅。当时,Bootstrap没有拉左类。+1:我做了一些更改,但这让我找到了一个可行的解决方案。很棒的解决方案!这个答案和Matt在UL级别的答案是在使用bootstrap时实现这一点的正确方法。OP的问题和我的答案来自2012年8月。同时,Bootstrap是ch
    
    $(document).ready(function () {
    
    $('body, html').css('overflow', 'hidden');
    var screenWidth = $(window).width();
    $('body, html').css('overflow', 'visible');
    
    if (screenWidth > 767) {
    
        $(".dropdown-submenu").hover(function () {
    
            var dropdownPosition = $(this).offset().left + $(this).width() + $(this).find('ul').width();
            var newPosition = $(this).offset().left - $(this).find('ul').width();
            var windowPosition = $(window).width();
    
            var oldPosition = $(this).offset().left + $(this).width();
            //document.title = dropdownPosition;
            if (dropdownPosition > windowPosition) {
                $(this).find('ul').offset({ "left": newPosition });
            } else {
                $(this).find('ul').offset({ "left": oldPosition });
            }
        });
    
    }