悬停在边距上时保持悬停状态

时间:2018-06-18 18:40:31

标签: html css

我想在保持边缘的同时保持悬停状态。当我移除位置absolute时,情况正常。从技术上讲,一切似乎都很好。具有边缘的元素位于正在悬停的元素的内部。是否是预期的行为,如果不是那么究竟是什么问题。



.dropbtn {
    background-color: #4CAF50;
    color: white;
    padding: 16px;
    font-size: 16px;
    border: none;
}

.dropdown {
    position: relative;
    display: inline-block;
}

.dropdown-content {
    display: none;
    position: absolute;
    margin-top:20px;
    background-color: #f1f1f1;
    min-width: 160px;
    box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
    z-index: 1;
}

.dropdown-content a {
    color: black;
    padding: 12px 16px;
    text-decoration: none;
    display: block;
}

.dropdown-content a:hover {background-color: #ddd;}

.dropdown:hover .dropdown-content {display: block;}

.dropdown:hover .dropbtn {background-color: #3e8e41;}

<div class="dropdown">
  <button class="dropbtn">Dropdown</button>
  <div class="dropdown-content">
    <a href="#">Link 1</a>
    <a href="#">Link 2</a>
    <a href="#">Link 3</a>
  </div>
</div>
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:1)

这是预期的行为。尽管.dropdown-content.dropdown的孩子,但由于.dropdown-content绝对定位,所以它好像在.dropdown之外浮动。如果您检查浏览器中的.dropdown元素,则会看到其大小仅涵盖.dropbtn且不包含.dropdown-content

解决此问题的一种方法是在.dropdown-content上使用填充而不是边距。然而,这将扩大内容的大小,而不会像使用保证金那样留下空白。

因此,如果您想在按钮和悬停菜单之间保持20px的差距,您可以在链接周围添加另一个div:

<div class="dropdown">
  <button class="dropbtn">Dropdown</button>
  <div class="dropdown-content">
    <div class="dropdown-inner">
      <a href="#">Link 1</a>
      <a href="#">Link 2</a>
      <a href="#">Link 3</a>
    </div>
  </div>
</div>

然后将背景/阴影样式放在内部div上:

.dropbtn {
    background-color: #4CAF50;
    color: white;
    padding: 16px;
    font-size: 16px;
    border: none;
}

.dropdown {
    position: relative;
    display: inline-block;
}

.dropdown-content {
    display: none;
    position: absolute;
    padding-top: 20px;
    min-width: 160px;
    z-index: 1;
}

.dropdown-inner {
    background-color: #f1f1f1;
    box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
}

https://codepen.io/anon/pen/RJxGmp

答案 1 :(得分:0)

实现这一目标的方法是使用伪元素(:before),这样你就可以在这两个元素的间隙上放置一个不可见的块,这样当你到达下拉容器的末尾时就不会失去悬停状态< / p>

.dropbtn {
    background-color: #4CAF50;
    color: white;
    padding: 16px;
    font-size: 16px;
    border: none;
    display:block;
}

.dropdown {
    position: relative;
    display: inline-block;
}
.dropdown:after{
   content:"";
   position:absolute;
   left:0px;
   bottom:-20px;
   display: none;
   vertical-align: bottom;
   width: 100%;
   min-width: 160px;
   height: 20px;
   background-color: transparent;
}
.dropdown-content {
    display: none;
    position: absolute;
    margin-top:20px;
    background-color: #f1f1f1;
    min-width: 160px;
    box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
    z-index: 1;
}

.dropdown-content a {
    color: black;
    padding: 12px 16px;
    text-decoration: none;
    display: block;
}

.dropdown-content a:hover {background-color: #ddd;}

.dropdown:hover .dropdown-content {display: block;}
.dropdown:hover:after{  display:inline-block;}

.dropdown:hover .dropbtn {background-color: #3e8e41;}
<div class="dropdown">
  <button class="dropbtn">Dropdown</button>
  <div class="dropdown-content">
    <a href="#">Link 1</a>
    <a href="#">Link 2</a>
    <a href="#">Link 3</a>
  </div>
</div>