【问题标题】:Hover menu items悬停菜单项
【发布时间】:2020-11-11 11:38:38
【问题描述】:

帮我实现一个悬停菜单。 底线是当悬停到菜单项时,红色圆圈平滑地接近悬停项。当光标离开该点时,圆平滑地上升到它的坐标。 提前致谢。

nav{
  position: relative;
}
.circle{
  height: 10px;
  width: 10px;
  display: inline-blick;
  background-color: red;
  border-radius: 50px;
  position: absolute;
  top: 50%;
  left: 0;
  transform: translateY(-50%);
}
.menu{
  margin: 0;
  padding: 0 0 0 30px;
  height: audo;
  width: 100%;
  display: inline-blick;
  list-style: none;  
}
.menu li{
  cursor: pointer;
}
<nav>
  <div class="circle"></div>
  <ul class="menu">
  <li>Menu 1</li>
  <li>Menu 2</li>
  <li>Menu 3</li>
</ul>
</nav>

Example here

【问题讨论】:

  • 您愿意使用 javascript 还是尝试使用纯 CSS 来实现它?
  • 抱歉,如果我理解正确,如果您将鼠标悬停在菜单项上,您希望红点向菜单项移动吗?
  • 什么意思-the circle smoothly rises to its coordinates?我们在说什么坐标?
  • 我需要在 javascript 中实现这个,当光标从菜单中移出到开始的位置后,圆圈应该返回

标签: javascript html menu hover jquery-animate


【解决方案1】:

您可以通过多种方式做到这一点。我在下面创建了一些方法。您还可以在给定的代码中添加动画。 我正在考虑 div &lt;div class="circle"&gt;&lt;/div&gt; 不强制放在&lt;ul&gt; Tag 之前

function chbg(elem,color) {
elem.firstChild.style.backgroundColor=color;
}
var circle = '<div class="circle" style="background-color: red;"></div>';
var menu = document.getElementsByClassName('menu2')[0];
for (var i = 0; i < menu.children.length; i++) {
    menu.children[i].addEventListener("mouseout", function () {
      this.innerHTML =this.innerHTML.replaceAll(circle,'')
    });

    menu.children[i].addEventListener("mouseover", function () {
if(this.innerHTML.indexOf(circle)==-1)
       this.innerHTML =this.innerHTML+circle
    });
}
nav{
  position: relative;
}

.circle{
  float:left;
  height: 10px;
  width: 10px;
  display: inline-blick;
  border-radius: 50px;
  top: 50%;
  left: 0;
}
.menu, .menu2, .menu3{
  margin: 0;
  padding: 0 0 0 30px;
  height: audo;
  width: 100%;
  display: inline-blick;
  list-style: none;  
}

.menu3 li:before { 
opacity:0;
content: ''; 
background-color: red;
float:left;
  height: 10px;
  width: 10px;
  display: inline-blick;
  border-radius: 50px;
  top: 50%;
  left: 0;
  }
  .menu3 li:hover:before{
  opacity:1;
  }
<h1>method 1 using javascript</h1>
<nav>
  <ul class="menu">
  <li onmouseover="chbg(this,'red')" onmouseout="chbg(this,'white')"><div class="circle"></div>Menu 1</li>
  <li onmouseover="chbg(this,'red')" onmouseout="chbg(this,'white')"><div class="circle"></div>Menu 2</li>
  <li onmouseover="chbg(this,'red')" onmouseout="chbg(this,'white')"><div class="circle"></div>Menu 3</li>
</ul>
</nav>

<h1>method 2 using javascript</h1>
<nav>
  <ul class="menu2">
  <li>Menu 1</li>
  <li>Menu 2</li>
  <li>Menu 3</li>
</ul>
</nav>

<h1>method 3 using CSS</h1>
<nav>
  <ul class="menu3">
  <li>Menu 1</li>
  <li>Menu 2</li>
  <li>Menu 3</li>
</ul>
</nav>

【讨论】:

    【解决方案2】:

    此脚本的工作原理:

    获取id="menu" 中的所有&lt;li&gt; 项目并将它们设置为mouseovermouseout 的“事件监听器”

    当悬停在&lt;li&gt; 元素上时,脚本会从顶部和高度获取其位置。这些坐标作为内联样式传递给#circle 元素。

    当鼠标光标位于&lt;li&gt;元素中的mouseout时,内联样式被移除,红点回到原来的位置。

    你可以通过 CSS transition: 0.8s;改变移动速度

    var menu = document.getElementById('menu');
    var li = menu.getElementsByTagName('li');
    var dot = document.getElementById('circle');
    
    for (var i = 0; i < li.length; i++) {
        li[i].addEventListener("mouseover", function () {
            setAnimation(this);
        });
    
        li[i].addEventListener("mouseout", function () {
            dot.setAttribute('style', '');
        });
    }
    
    function setAnimation(el) {
        var pos = el.offsetTop;
        var h = el.offsetHeight;
        dot.setAttribute('style', 'top:' + (pos + h / 2) + 'px;');
    }
    nav {
        position: relative;
    }
    
    #circle {
        height: 10px;
        width: 10px;
        display: inline-blick;
        background-color: red;
        border-radius: 50px;
        position: absolute;
        top: 50%;
        left: 0;
        transform: translateY(-50%);
    
        -webkit-transition: 0.8s;
        -moz-transition: 0.8s;
        transition: 0.8s;
    }
    
    #menu {
        margin: 0;
        padding: 0 0 0 30px;
        height: audo;
        width: 100%;
        display: inline-blick;
        list-style: none;
    }
    
    #menu li {
        cursor: pointer;
    }
    <nav>
        <div id="circle"></div>
        <ul id="menu">
            <li>Menu 1</li>
            <li>Menu 2</li>
            <li>Menu 3</li>
            <li>Menu 4</li>
            <li>Menu 5</li>
        </ul>
    </nav>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-15
      • 1970-01-01
      • 2013-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多