当相对于可用的浏览器窗口没有水平空间时,以相反的方向打开CSS子菜单

Open CSS sub menus in the opposite direction, when there is no horizontal space relative to the browser window available

本文关键字:方向 菜单 CSS 空间 浏览器 相对于 窗口 水平      更新时间:2023-09-26

我已经创建了一个CSS菜单,看起来像这样。

$(document).ready(function() {
    $("a:only-child").addClass("only-child");
});
#main_nav {
    padding: 0;
    margin: 0;
    display:inline-block;
    width: 100%;
    background: #888;
    z-index: 300 !important;
}
#main_nav ul {
    list-style:none;
    position:relative;
    float:left;
    margin:0;
    padding:0;
    background: #888;
    z-index: 300 !important;
    min-width: 150px;
    white-space: nowrap;
}
#main_nav a:hover {
    color: #FFFAF0;
    -webkit-transform: translateY(-1px);
    -ms-transform: translateY(-1px);
    transform: translateY(-1px);
}
#main_nav ul a {
    display:block;
    text-decoration:none;
    font-size:12px;
    line-height:32px;
    padding:3px 15px;
    color: #fff;
    font-family: "Helvetica Neue", Helvetica, Arial, Verdana, sans-serif;
}
#main_nav ul li {
    position:relative;
    float:left;
    margin:0;
    padding:0;
}
#main_nav ul li.current-menu-item {
    background:#ddd;
}
#main_nav ul li:hover {
    background: #777;
}
#main_nav ul ul {
    display:none;
    position:absolute;
    top:100%;
    left:0;
    background:#888;
    padding:0;
}
#main_nav ul ul li {
    float:none;
    white-space: nowrap;
    width: 100%;
}
#main_nav ul ul a {
    line-height:120%;
    padding:10px 15px;
}
#main_nav ul ul ul {
    top:0;
    left:100%;
}
#main_nav ul li:hover > ul {
    display:block;
}
#main_nav > ul > li {
    display: inline-block;
    float: none;
    margin: 0 -3px 0 0;
}
.menu li:last-of-type { border-right: none; }
.menu li > a:after {position: absolute; right: 5px; content: ''25BA'; }
.menu > li > a:after {position: absolute; right: 0px; content: ''25BC'; }
.menu li > a.only-child:after { margin-left: 0; content: ''; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="main_nav">
    <ul class="menu">
        <li class="current-menu-item"><a href="#">Home</a></li>
        <li><a href="#">Menu 1</a>
            <ul>
                <li><a href="#">Sub Menu 1</a></li>
                <li><a href="#">Sub Menu 2</a>
                    <ul>
                        <li><a href="#">Deep Menu 1</a>
                            <ul>
                                <li><a href="#">Deep Menu 3</a>
                                    <ul>
                                        <li><a href="#">Deep Menu 5</a>
                                            <ul>
                                                <li><a href="#">Deep Menu 7</a>
                                                    <ul>
                                                        <li><a href="#">Deep Menu 9</a>
                                                            <ul>
                                                                <li><a href="#">Deep Menu 11</a>
                                                                    <ul>
                                                                        <li><a href="#">Deep Menu 13</a>
                                                                            <ul>
                                                                                <li><a href="#">Category 1</a></li>
                                                                                <li><a href="#">Category 2</a></li>
                                                                                <li><a href="#">Category 3</a></li>
                                                                                <li><a href="#">Category 4</a></li>
                                                                                <li><a href="#">Category 5</a></li>
                                                                            </ul>
                                                                        </li>
                                                                        <li><a href="#">Deep Menu 14</a></li>
                                                                    </ul>
                                                                </li>
                                                                <li><a href="#">Deep Menu 12</a></li>
                                                            </ul>
                                                        </li>
                                                        <li><a href="#">Deep Menu 10</a></li>
                                                    </ul>
                                                </li>
                                                <li><a href="#">Deep Menu 8</a></li>
                                            </ul>
                                        </li>
                                        <li><a href="#">Deep Menu 6</a></li>
                                    </ul>
                                </li>
                                <li><a href="#">Deep Menu 4</a></li>
                            </ul>
                        </li>
                        <li><a href="#">Deep Menu 2</a></li>
                    </ul>
                </li>
                <li><a href="#">Sub Menu 3</a></li>
                <li><a href="#">Sub Menu 4</a></li>
                <li><a href="#">Sub Menu 5</a></li>
            </ul>
        </li>
        <li><a href="#">Menu 2</a>
            <ul>
                <li><a href="#">Sub Menu 1</a></li>
                <li><a href="#">Sub Menu 2</a></li>
                <li><a href="#">Sub Menu 3</a></li>
                <li><a href="#">Sub Menu 4</a></li>
                <li><a href="#">Sub Menu 5</a></li>
            </ul>
        </li>
        <li><a href="#">Menu 3</a></li>
        <li><a href="#">Menu 4</a></li>
        <li><a href="#">Menu 5</a></li>
    </ul>
</div>

在其中一个子菜单中,许多子菜单一个接一个地打开,导致水平溢出,当许多子菜单顺序打开后没有足够的空间容纳子菜单时。

是否有可能打开一个子菜单在相反的方向,当没有足够的水平空间相对于浏览器窗口左,以容纳最后的子菜单打开使用任何可以使它成为可能-纯CSS, JavaScript/jQuery?

我明白你的问题,但如果你浮动子菜单的左边,它会重叠前一个子菜单。你试过吗?试着这样做:

#main_nav ul ul ul ....

直到需要左浮动的位置,然后添加左浮动。这是我唯一知道的。您还可以做的是让menu1垂直折叠(子菜单的to)。

你也可以让大菜单垂直折叠而不是水平折叠

使用媒体查询,你将达到预期的结果:如果viewport的宽度等于或大于500px,菜单将浮动到右边,否则将浮动到左边。你可以根据需要调整宽度

.menu {
    display: flex;
  }
  .menu li {
    list-style: none;
    position: relative;
        background-color: yellow;
  }
  .menu li:hover > ul {
    display: block;
  }
  .sub-menu li {
        background-color: red;
  }
  .menu ul {
    display: none;
    position: absolute;
    top: 100%;
    min-width: 150px;
        background-color: red;
    right: 0;
  }
  @media (min-width: 500px) {
    .menu ul {
      left: 0;
    }
  }
  .menu a {
    display: block;
    padding: 10px 20px;
    text-decoration: none;
  }
<ul class="menu">
  <li><a href="#">Menu item 1</a>
    <ul class="sub-menu">
      <li><a href="#">Submenu item 1</a></li>
      <li><a href="#">Submenu item 2</a></li>
      <li><a href="#">Submenu item 3</a></li>
    </ul>
  </li>
  <li><a href="#">Menu item 2</a>
    <ul class="sub-menu">
      <li><a href="#">Submenu item 1</a></li>
      <li><a href="#">Submenu item 2</a></li>
      <li><a href="#">Submenu item 3</a></li>
    </ul>
  </li>
  <li><a href="#">Menu item 3</a></li>
</ul>