0

我正在尝试使用 CSS/HTML 创建一个菜单栏,悬停时会在列表元素中触发。当我尝试将列表排列成两列时遇到问题。

这是示例代码:http: //jsfiddle.net/Km922/1/

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Experiment</title>
    <style media="all">
        .navigation ul
        {
            margin: 0px;
            padding: 0px;
            list-style: none;
            left: 300px;
            position: relative;
            top: 200px;
        }
        .navigation ul li ul .second
        {
            float: right;
            width: 200px;
            position: relative;
            overflow: hidden;
        }
        .navigation li
        {
            float: left;
            height: 30px;
            margin-left: 15px;
            margin-right: 15px;
            position: relative;
            top: 30px; /*clear:left;*/
        }
        .navigation li a
        {
            text-decoration: none;
        }
        .navigation li a:hover
        {
            text-decoration: underline;
        }
        .navigation li ul
        {
            margin: 0px;
            padding: 0px;
            position: absolute;
            left: -9999px;
            height: 30px;
            top: 30px; /*display:inline-block;*/
        }
        .navigation li:hover ul
        {
            left: 0;
            width: 160px;
            visibility: visible;
        }
        .header-container
        {
            background: url(Images/nav-bg4.png) repeat-x scroll 0 0 transparent;
            height: 136px;
            left: 0;
            position: absolute;
            right: 0;
            top: 0;
            z-index: 901;
        }
        #apDiv1
        {
            position: absolute;
            width: 200px;
            height: 115px;
            z-index: 902;
            top: 29px;
        }
        .navigation ul li ul .first
        {
            float: left;
            width: 200px;
            position: absolute;
            overflow: hidden;
        }
    </style>
</head>
<body background="Images/global-splash-map.jpg">
    <header class="header-container">
  <div id="apDiv1"><img src="Images/levis-logo.png" /></div>
</header>
    <div class="navigation">
        <ul>
            <li><a href="#">menu1</a>
                <ul>
                    <li class="second">Canada</li>
                    <li class="first">United States</li>
                    <li class="second">Mexico</li>
                </ul>
            </li>
            <li><a href="#">menu2</a>
                <ul>
                    <li class="second">Argentina</li>
                    <li class="second">Brazil</li>
                    <li class="second">Bolivia</li>
                    <li class="second">Chile</li>
                    <li class="second">Colombia</li>
                    <li class="second">Ecuador</li>
                    <li class="first">Panama</li>
                    <li class="first">Paraguay</li>
                    <li class="first">Peru</li>
                    <li class="first">Uruguay</li>
                    <li class="first">Venezuela</li>
                </ul>
            </li>
            <li><a href="#">menu3</a>
                <ul>
                    <li>sub menu item 1</li>
                    <li>sub menu item 2</li>
                    <li>sub menu item 3</li>
                    <li>sub menu item 4</li>
                </ul>
            </li>
            <li><a href="#">menu3</a>
                <ul>
                    <li>sub menu item 1</li>
                    <li>sub menu item 2</li>
                    <li>sub menu item 3</li>
                    <li>sub menu item 4</li>
                </ul>
            </li>
            <li><a href="#">menu4</a>
                <ul>
                    <li>sub menu item 1</li>
                    <li>sub menu item 2</li>
                    <li>sub menu item 3</li>
                    <li>sub menu item 4</li>
                </ul>
            </li>
        </ul>
    </div>
</body>
</html>

当您将鼠标悬停在 menu1 上时,它会完美显示,但是当您将鼠标悬停在 menu2 上时,我看到应该出现在每一行中的列表元素正在出现并相互重叠。谁能帮我解决这个问题?

4

3 回答 3

1

你有几个问题。首先,浮动和绝对定位不兼容:

.navigation ul li ul .first {
    float: left;
    position: absolute;
}

接下来,您不能像这样堆叠列表项并将它们分成两列。花车不是这样工作的。

<ul>
  <li class="second">Argentina</li>
  <li class="second">Brazil</li>
  <li class="second">Bolivia</li>
  <li class="second">Chile</li>
  <li class="second">Colombia</li>
  <li class="second">Ecuador</li>
  <li class="first">Panama</li>
  <li class="first">Paraguay</li>
  <li class="first">Peru</li>
  <li class="first">Uruguay</li>
  <li class="first">Venezuela</li>
</ul>

没有特定 HTML 的多列列表是一个挑战。这是一篇可能会让您入门的文章:http: //alistapart.com/article/multicolumnlists

于 2013-02-20T21:47:47.690 回答
0

如前所述,您不能在同一元素上同时使用浮动和绝对定位。没关系,因为我们不想要任何一个。获得完美列的秘诀是使用 CSS 列模块。

我在您的 CSS 中进行了大量清理工作:

http://jsfiddle.net/uPzxb/4/(不包括前缀)

.navigation ul {
    margin: 0px;
    padding: 0px;
    list-style: none;
    left: 30px;
    position: relative;
    top: 20px;
}
.navigation > ul > li {
    float: left;
    height: 30px;
    margin-left: 15px;
    margin-right: 15px;
    position: relative;
}
.navigation li a {
   text-decoration: none;
}
.navigation li a:hover {
   text-decoration: underline;
}
.navigation li ul {
    margin: 0px;
    padding: 0px;
    position: absolute;
    top: 30px;
    display: none;
}
.navigation li:hover ul {
    left: 0;
    width: 160px;
    display: block;
    columns: 2; /* this here is the key */
}
.header-container {
    background: url(Images/nav-bg4.png) repeat-x scroll 0 0 transparent;
    height: 136px;
    left: 0;
    position: absolute;
    right: 0;
    top: 0;
    z-index: 901;
}
#apDiv1 {
    position: absolute;
    width: 200px;
    height: 115px;
    z-index: 902;
    top: 29px;
}

http://caniuse.com/#feat=multicolumn

于 2013-02-20T23:56:12.947 回答
0

对于将改变位置的元素,例如下拉列表项。将列表项从绝对定位更改为相对定位可能会更好。

position: relative;
于 2021-01-08T20:27:46.800 回答