【问题标题】:CSS Scrolling menu - dropdown menu doesn't scroll properlyCSS 滚动菜单 - 下拉菜单无法正确滚动
【发布时间】:2018-11-09 21:40:02
【问题描述】:

我有一个水平滚动菜单,其中一些主菜单项有一个下拉菜单。问题是,如果我滚动主菜单,下拉菜单不会跟随(绝对定位),或者如果我让它们跟随(相对)它们会将主菜单向上推。

绝对:

亲戚:

CSS 是:

.navbar {
    width:100%;
    overflow-x: auto;
    overflow-y: hidden;
    white-space: nowrap;
}

.dropdown-content {
     display: none; //displayed on hover
     position: absolute; //or relative
     background-color: #f9f9f9;
     box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
     z-index: 1;
}

关于我能做些什么来解决这个问题有什么建议吗?

我正在寻找的是绝对版本 - 请注意下拉菜单落在滚动条上,而不是向下推 - 但子菜单正确对齐。

绝对定位的例子见 jsfiddle:

https://jsfiddle.net/9hjgo1qc/7/

【问题讨论】:

  • 也许先提供足够的样本来实际重现问题?几个 css 类并不是很有帮助,除非你希望有人只是给你写一个菜单,你知道这个朋友......
  • 没错。提供(至少)HTML 以查看您是如何实现这些菜单的。我猜,问题就在那里。
  • 这里不一定需要css,只要你的HTML就够了。也就是说,问题可能出在您的 HTML 中。您的绝对定位子菜单应该在其相应的父级内,并且该父级应该是 position: relative
  • @RGriffiths 好的,这非常难看,我在几分钟内就完成了,但我想它是有目的的。完全不需要定位。提供 jsfiddle 后,如果您希望使用更复杂和精细的代码,我可以写一个官方答案:)。 codepen.io/anon/pen/zMBjyP

标签: html css


【解决方案1】:

只需在.dropdown 类样式上添加vertical-align:top;。解决您的问题。

测试一下here

更新 1

使用 JQuery 解决问题。

here

更新 2

您可以通过对 jquery 方法的微小更改来实现多个菜单的相同功能。

here

【讨论】:

  • 谢谢,但是一件事解决了,又出现了另一个问题。这绝对不能解决问题。相对而言,它简单地解决了问题并将菜单向下推。见小提琴。
  • 如果你可以使用JQuery,那么修复它会更容易..jsfiddle.net/nimittshah/1vybc7fz
  • 再次感谢您的努力。这适用于一个子菜单,但如果有多个子菜单则不行。
  • 我已经用 Update 2 更新了答案。也可以查看here
  • 这太棒了 - 感谢您为此提供的所有帮助。
【解决方案2】:

就像我在评论中已经说过的那样,您实际上不需要任何定位来实现这一点。这只是一个好的 HTML 代码的问题。我已经提供了一个 codepen 示例,但它是匿名的,并且有人重写了它。

只需几行代码,您就可以完全实现您想要的。我已经开始编辑你的 jsfiddle,但我想我已经给了你我的 codepen 示例中需要的所有代码 :)

.navbar {
  margin: 200px auto;
  display: flex;
  width: 800px;
  overflow-x: scroll;
}

ul {
  min-width: 250px;
  list-style: none;
}

li { 
  display: inline-block;
  text-align: center;
  height: 40px;
  line-height: 40px; /* quick hack to center text vertically (assuming it is just one line), but I wouldn't use it for production - it is just for this quick example */
  background: beige;
  margin: 0;
  border: 1px solid white;
}

ul li:not(:first-child) {
  height: 0;
  transition: all .3s ease-in;
  visibility: hidden;
  /* alternatively you can use transform and scaleY
  transform: scaleY(0);
  transform-origin: 50% 0; */
}

ul:hover li:not(:first-child) {
  height: 40px;
  visibility: visible;
  /* transform: scaleY(1); */
}
<div class="navbar">
  <ul>
    <li>M1</li>
    <li>M1-1</li>
    <li>M1-2</li>
  </ul>
  <ul>
    <li>M2</li>
    <li>M2-1</li>
    <li>M2-2</li>
  </ul>
  <ul>
    <li>M3</li>
    <li>M3-1</li>
    <li>M3-2</li>
  </ul>
  <ul>
    <li>M4</li>
    <li>M4-1</li>
    <li>M4-2</li>
  </ul>
  <ul>
    <li>M5</li>
    <li>M5-1</li>
    <li>M5-2</li>
  </ul>
</div>

这是虚拟代码,但我认为您可以轻松地将其转换为您的示例。如果您需要我进一步解释,请告诉我。

【讨论】:

  • 这很好,但它会将菜单向下推。这实际上与相同的问题相反。再看看我的小提琴,“更多文本”是如何不动的(或菜单栏)。
  • 好吧,那我不明白你想要达到什么目的?你说他们要么不跟随,要么向上推菜单。对我来说,您希望下拉菜单向下打开是合乎逻辑的吗?我糊涂了。所以,如果你想澄清,请...
  • 我应该写“或滚动条”。如果您在子菜单打开时查看答案,则滚动条会下降。这不是我们想要的菜单效果——我们希望子菜单在滚动条上打开。看小提琴 - 它告诉你。感谢您的帮助。
  • 哦,太糟糕了。真的不清楚,但现在我明白了你的意思,是的 - 这在那种情况下没有帮助。祝你好运。
  • 感谢您的尝试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-25
  • 2016-02-07
  • 2016-12-16
  • 2020-10-10
  • 1970-01-01
相关资源
最近更新 更多