如何消除Tab抖动动画?JQuery悬停交互问题求助
解决Tab悬停时的抖动问题
嘿,作为JavaScript初学者遇到这个问题很正常,我来帮你分析并解决这个抖动问题~
抖动原因分析
你遇到的抖动问题,本质是鼠标事件的反复触发:当.tab从右侧滑入时,它的位置会靠近甚至覆盖#demo的区域,导致鼠标在#demo和.tab之间来回切换,反复触发mouseover和mouseleave事件,进而让动画不断重启,产生抖动效果。另外你的CSS里还存在一个拼写错误(backgound-color应该是background-color),虽然不直接导致抖动,但也需要修正。
修复方案
我们可以通过将两个元素放入统一容器,绑定容器的mouseenter/mouseleave事件来避免事件冲突;同时用mouseenter/mouseleave代替mouseover/mouseout,因为前者不会冒泡,只会在进入/离开容器时触发一次,不会因为鼠标在容器内元素间移动而反复触发。
下面是修改后的完整代码:
HTML部分
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="hover-container"> <button id="demo">Hover here!</button> <div class="tab">First Panel</div> </div>
CSS部分
.hover-container { position: relative; width: 380px; /* 容纳#demo和.tab的总宽度 */ height: 100%; } #demo { padding: 5px; font-size: 18px; text-align: center; background-color: #555; color: white; border: solid 1px #666; border-radius: 3px; position:absolute; margin-left: 10px; width:190px; height:100%; opacity: 0.5; background-color: yellow; } #demo.hovered { background-color: #000; /* 修正拼写错误 */ } .tab { margin-left: 200px; /* 调整为#demo的宽度+margin,避免重叠 */ width: 0px; height:100%; opacity: 0.5; background-color: #876; position:absolute; }
JavaScript部分
$(document).ready(function () { // 绑定容器的mouseenter/mouseleave事件 $('.hover-container').mouseenter(function(event) { $('.tab').stop().animate({ opacity : '1', marginLeft: '200px', /* 和CSS初始值对应 */ width:'190px' }, 300, function() { $('#demo').removeClass('hovered'); }); }); $('.hover-container').mouseleave(function(event) { $('.tab').stop().animate({ opacity : '0.5', marginLeft: '390px', /* 滑到容器外 */ width:'0px' }, 600, function() { $('#demo').addClass('hovered'); }); }); });
关键修改点说明
- 统一容器:把
#demo和.tab放入.hover-container,这样鼠标在容器内的任何位置都不会触发离开事件,避免动画反复重启。 - 事件替换:用
mouseenter/mouseleave代替mouseover/mouseout,这两个事件不会冒泡,只会在进入/离开容器时触发一次,彻底解决事件反复触发的问题。 - 调整位置:修改
.tab的初始margin-left为200px(#demo的宽度190px + margin-left10px),避免和#demo重叠;离开时滑到容器外(390px = 容器宽度380px + 10px),确保动画结束后不会干扰鼠标事件。 - 修正CSS错误:把
backgound-color改为正确的background-color。
这样修改后,Tab的动画就会平滑触发,不会再出现抖动啦~
内容的提问来源于stack exchange,提问作者Lâm Thị Thúy Vi
相关产品推荐
相关产品推荐

