【问题标题】:Submenu - Fade in and Fade out submenu in menu bar子菜单 - 菜单栏中的淡入和淡出子菜单
【发布时间】:2013-07-23 10:56:03
【问题描述】:

我想创建一个菜单栏,在其中悬停时,相关的额外菜单应该出现在项目旁边,当鼠标指针消失时,它应该消失。

例如,当您将鼠标指针放在此页面顶部的用户名上时,您会看到一个包含活动、权限、注销等的菜单。

我想实现这样一个菜单。

切换额外菜单元素(例如 div)的可见性(或更改显示)属性是显而易见的。

但我的问题是我怎么能检测到鼠标指针悬停在额外的菜单上,并且在鼠标指针熄灭之前它不应该消失!

我不想使用 JQuery。

【问题讨论】:

  • 我担心你为什么不想使用 jQuery..
  • @VeeKayBee 因为它不是必需的,而且包含一个完整的库来做一些简单的 Javascript 可以做的事情(甚至只是 CSS3)也是一种浪费。
  • @Parrotmaster 是的,我同意,但是在考虑 Web 开发时,jQuery 可以在许多地方提供帮助,例如验证、ajax 等。 JavaScript 可以做任何事情,但 jQuery 提供了一种简单的方法,可以用更少的代码实现。
  • @VeeKayBee 可能是这样,但提出问题的人表示他不想使用 JQuery。也无需问为什么,因为任何非 JQuery 解决方案都更快、更轻量级。 (对于这个特定的问题)
  • 我不强迫他使用 jQuery。出于好奇,我只是问他为什么不尝试过 jQuery。就这些

标签: javascript html css navigation mouseover


【解决方案1】:

纯 CSS 方法

小提琴: http://jsfiddle.net/gvee/jrFse/

HTML

<ul>
    <li>Item 1
        <ul>
            <li>Subitem 1</li>
            <li>Subitem 2</li>
        </ul>
    </li>
    <li>Item2</li>
    <li>Item 3
        <ul>
            <li>Subitem 1</li>
        </ul>
    </li>
</ul>

CSS

ul
{
    list-style-type: none;
}

ul li
{
    padding: 5px;
    margin: 3px;
    border: 1px solid black;
}

ul li:hover
{
    background-color: lime;
}

li ul
{
    display: none;
}

li:hover ul
{
    display: block;
}

li ul li:hover
{
    background-color: red;
}

注意:还有一些样式需要你做,这只是为了说明原理。

【讨论】:

    【解决方案2】:

    CSS 有属性

    element:hover{}
    

    要更美观的菜单,请使用 javascript

    另外,如果你想在父元素悬停时改变子元素的样式,你可以使用

    parentElement:hover childElement{}
    

    所以想法可能是在其中获取一个外部 div(parentElement) 和一个标签以及另一个 div(childElement)。在 parentElement 悬停时,修改 childElement 的 display 属性,如上面的 sn-p 所示。

    【讨论】:

    • 感谢简单的 Javascript 和 CSS3,这些事情不再需要 JQuery。 element:hover{visibility: visible;} 的问题是您需要将鼠标悬停在元素本身上才能使其可见,这将无法正常工作。
    • 感谢您提供一个不错的简单解决方案。我想我明白了。增加同一个 div 的宽度是一个聪明的解决方案。但我认为我应该使用 javascript 来设置一些延迟。我对吗?我现在要测试这个解决方案:)
    • @user1422847 如果你想要淡入淡出效果,你可以使用 Javascript。但是你也可以使用这个:bavotasan.com/2011/a-simple-fade-with-css3
    • :hover 选择器的问题是,IE 直到 v.7 只接受 标签。这是一个参考msdn.microsoft.com/en-us/library/ie/cc848866(v=vs.85).aspxcss 转换的计数相同,但我猜你必须使用 IE 10
    • @MaxPressburger 老实说,您永远不应该考虑使用 Internet Explorer 进行编程。甚至 IE10 都是一个笑话,它已经过时了。我个人建议最多支持 IE8,即使这样也有点过分了。
    【解决方案3】:

    您可以使用以下内容来创建弹出菜单。您要做的就是以您想要的方式重组它。您可以在here 进行演示。

    HTML

        <div>
     <input type="button" ID="lnkModel"  OnClick="DisplayModal();" Text="OK" />
        </div>
        <div id="overlay"></div>
        <div id="modalMsg" style="width: 200px; height: 100px; border-color: Black; border-style: solid;
            color: Red;" class="HideModal">
            This is modalpopup window
            <input type="button" ID="lnkOk"  OnClick="return RemoveModal();" Text="OK" />
        </div>
    

    CSS

    .ShowModal
     {
                    top: 200px;
                    left: 250px;
                    z-index: 1000;
                    position: absolute;
                    background-color: White;
                    display: block;
                }
                .HideModal
                {
                    display: none;
                }
                .OverlayEffect
                {
                    background-color: black;
                    filter: alpha(opacity=70);
                    opacity: 0.7;
                    width: 100%;
                    height: 100%;
                    z-index: 400;
                    position: absolute;
                    top: 0;
                    left: 0;
                }
    

    JavaScript

    function DisplayModal()
                {
                    alert("Hai");
                    document.getElementById("overlay").style.height = document.body.clientHeight + 'px';
                    document.getElementById("overlay").className = "OverlayEffect";
                    document.getElementById("modalMsg").className = "ShowModal";
                }
                function RemoveModal()
                {
                    document.getElementById("modalMsg").className = "HideModal";        
                    document.getElementById("overlay").className = "";
                    return false;
                }
    

    更新

    根据这个问题,您可以使用this 方式触发悬停

    <div onmouseover="document.getElementById('input').style.backgroundColor='Blue';">
    <input id="input">
    </div>
    

    查看此问题以了解更多关于 css 和 js 悬停事件之间的区别。 css hover vs. javascript mouseover上面提到的问题)。

    【讨论】:

      【解决方案4】:

      您必须使用 Javascript 来更改要使其可见的元素的 CSS 属性。

      element.style.visibility='visible' 将使您的元素可见,但它也会为元素保留空间,这应该不是问题,因为我假设该元素将具有更高的 z-index。

      对于鼠标交互,请在此处查找 Javascript "onmouseover" 事件: http://www.w3schools.com/jsref/event_onmouseover.asp

      【讨论】:

      • 查看标签,只有css
      • @Saksham 抱歉,您没有指定您只需要 CSS,只需使用 CSS 标记即可。您至少还应该添加一个 HTML 标记,因为这就是问题的相关内容。
      【解决方案5】:

      我建议使用 jQuery 来处理这类事情,但这里是解决悬停问题的方法:

      将动画附加到菜单的鼠标事件和用户名上。

       var elem =  getelementbyid("yourTrigger");
       var elem2 = getelementbyid("yourElementToShow");
       elem.onmouseover = function(e) {
              elem2.style.display = "block";
          };
          elem.onmouseout = function(e) {
              elem2.style.display = "none";
          };
          elem2.onmouseover = function(e) {
              elem2.style.display = "block";
          };
          elem2.onmouseout = function(e) {
              elem2.style.display = "none";
          };
      

      【讨论】:

      • 查看标签,只有css
      • 标签一定是被编辑过的——也许这就是为什么所有人都写javascript解决方案的原因。只是说
      • 顺便说一句,您删除了该标签,并且没有写过它必须在没有 javascript 的情况下完成。
      • @Saksham 标签没有定义问题的可能解决方案。如果您不想使用某种技术,则应始终在问题本身中说明。
      • @Saksham 所以你更改了任务,然后否决了为原始问题完成的所有答案?似乎不那么合法。
      【解决方案6】:

      感谢大家的帮助和想法。

      我想我已经解决了这个问题:

      首先我创建了一个简单的 fixed 宽度和高度属性:

      <div id="menu" style="width:200px; height:50px; overflow:visible;">
      
      </div>
      

      然后我添加了另一个INSIDE菜单DIV!

      这里我使用 relative 位置来使用 z-index 属性。 (绝对位置也可以。)

      left 属性让我的子菜单出现在正确的位置。

      显示属性设置为无;在 javascript 代码中更改它会显示 DIV。

      <div id="menu" style="width:200px; height:50px; overflow:visible;">
          <div id="sub-menu" style="width:200px; height:300px; position:relative; left:200px; display:none">
              ... items in sub-menu
          </div>
      </div>
      

      之后我为 MouseOver 和 MouseOut 添加了两个 javascript 函数:

      <div id="menu" style="width:200px; height:50px; overflow:visible;" onmouseover="javascript: MouseOver();" onmouseout="javascript: MouseOut();">
          <div id="sub-menu" style="width:200px; height:300px; position:relative; left:200px; display:none">
              ... items in sub-menu
          </div>
      </div>
      

      Javascript:

      function MouseOver(){
          document.getElementById("sub-menu").style.display = "inline-block";
      }
      
      function MouseOut(){
          document.getElementById("sub-menu").style.display = "none";
      }
      

      这样当鼠标指针经过菜单DIV时,会出现子菜单DIV,当鼠标指针经过子菜单DIV时,它也仍然在菜单DIV上,所以不会调用MouseOut函数!

      诀窍只是在主菜单 DIV 内添加子菜单 DIV,并使用相对位置!更改显示属性很明显;)

      请原谅我的错误解释。 谢谢。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多