我们如何在鼠标悬停时交换DIV? (jquery?)
时间:2020-03-05 18:45:01 来源:igfitidea点击:
这是第二简单的翻转效果,但我仍然找不到任何简单的解决方案。
想要:我有一个项目清单和一个相应的幻灯片(DIV)清单。加载后,应该选择第一个列表项(粗体),并且应该可以看到第一张幻灯片。当用户将鼠标悬停在另一个列表项上时,应改为选择该列表项,并显示相应的幻灯片。
以下代码有效,但是效果很糟。如何以一种优雅的方式获得这种行为? jQuery具有数十种动画效果和复杂的过渡效果,但是我没有想出这种效果的干净方法。
<script type="text/javascript"> function switchTo(id) { document.getElementById('slide1').style.display=(id==1)?'block':'none'; document.getElementById('slide2').style.display=(id==2)?'block':'none'; document.getElementById('slide3').style.display=(id==3)?'block':'none'; document.getElementById('slide4').style.display=(id==4)?'block':'none'; document.getElementById('switch1').style.fontWeight=(id==1)?'bold':'normal'; document.getElementById('switch2').style.fontWeight=(id==2)?'bold':'normal'; document.getElementById('switch3').style.fontWeight=(id==3)?'bold':'normal'; document.getElementById('switch4').style.fontWeight=(id==4)?'bold':'normal'; } </script> <ul id="switches"> <li id="switch1" onmouseover="switchTo(1);" style="font-weight:bold;">First slide</li> <li id="switch2" onmouseover="switchTo(2);">Second slide</li> <li id="switch3" onmouseover="switchTo(3);">Third slide</li> <li id="switch4" onmouseover="switchTo(4);">Fourth slide</li> </ul> <div id="slides"> <div id="slide1">Well well.</div> <div id="slide2" style="display:none;">Oh no!</div> <div id="slide3" style="display:none;">You again?</div> <div id="slide4" style="display:none;">I'm gone!</div> </div>
解决方案
回答
这段代码唯一的错误(至少对我而言)是我们没有使用循环来处理所有元素。除此之外,为什么不那样做呢?
对于循环,我的意思是通过JQuery抓取容器元素,并基本上对所有子元素进行单行迭代。
回答
这是jQuery版本:
<script type="text/javascript" src="http://jqueryjs.googlecode.com/files/jquery-1.2.6.min.js"></script> <script type="text/javascript"> $(function () { $("#switches li").mouseover(function () { var $this = $(this); $("#slides div").hide(); $("#slide" + $this.attr("id").replace(/switch/, "")).show(); $("#switches li").css("font-weight", "normal"); $this.css("font-weight", "bold"); }); }); </script> <ul id="switches"> <li id="switch1" style="font-weight:bold;">First slide</li> <li id="switch2">Second slide</li> <li id="switch3">Third slide</li> <li id="switch4">Fourth slide</li> </ul> <div id="slides"> <div id="slide1">Well well.</div> <div id="slide2" style="display:none;">Oh no!</div> <div id="slide3" style="display:none;">You again?</div> <div id="slide4" style="display:none;">I'm gone!</div> </div>
回答
<html> <head> <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript"> $(document).ready( function(){ $( '#switches li' ).mouseover( function(){ $( "#slides div" ).hide(); $( '#switches li' ).css( 'font-weight', 'normal' ); $( this ).css( 'font-weight', 'bold' ); $( '#slide' + $( this ).attr( 'id' ).replace( 'switch', '' ) ).show(); } ); } ); </script> </head> <body> <ul id="switches"> <li id="switch1" style="font-weight:bold;">First slide</li> <li id="switch2">Second slide</li> <li id="switch3">Third slide</li> <li id="switch4">Fourth slide</li> </ul> <div id="slides"> <div id="slide1">Well well.</div> <div id="slide2" style="display:none;">Oh no!</div> <div id="slide3" style="display:none;">You again?</div> <div id="slide4" style="display:none;">I'm gone!</div> </div> </body> </html>
回答
我不是在JS关闭的情况下显示所有幻灯片(这可能会破坏页面布局),而是将其放置在开关LIs real A内,指向服务器端代码的链接,该代码返回在正确的开关上预设了"活动"类的页面/滑动。
$(document).ready(function() { switches = $('#switches > li'); slides = $('#slides > div'); switches.each(function(idx) { $(this).data('slide', slides.eq(idx)); }).hover( function() { switches.removeClass('active'); slides.removeClass('active'); $(this).addClass('active'); $(this).data('slide').addClass('active'); }); });
#switches .active { font-weight: bold; } #slides div { display: none; } #slides div.active { display: block; }
<html> <head> <title>test</title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script type="text/javascript" src="switch.js"></script> </head> <body> <ul id="switches"> <li class="active">First slide</li> <li>Second slide</li> <li>Third slide</li> <li>Fourth slide</li> </ul> <div id="slides"> <div class="active">Well well.</div> <div>Oh no!</div> <div>You again?</div> <div>I'm gone!</div> </div> </body> </html>
回答
这是我的轻标记jQuery版本:
<script type="text/javascript" src="jquery.js"></script> <script type="text/javascript"> function switchTo(i) { $('#switches li').css('font-weight','normal').eq(i).css('font-weight','bold'); $('#slides div').css('display','none').eq(i).css('display','block'); } $(document).ready(function(){ $('#switches li').mouseover(function(event){ switchTo($('#switches li').index(event.target)); }); switchTo(0); }); </script> <ul id="switches"> <li>First slide</li> <li>Second slide</li> <li>Third slide</li> <li>Fourth slide</li> </ul> <div id="slides"> <div>Well well.</div> <div>Oh no!</div> <div>You again?</div> <div>I'm gone!</div> </div>
如果用户关闭了javascript,使用很少的HTML标记并且javascript可读性强,这具有显示所有幻灯片的优势。 switchTo
函数采用一个索引号,其中的<li>/
<div>`对被激活,将所有相关元素重置为其默认样式(列表项为非粗体,列表项为" display:none")。 DIV),然后将所需的" list-item"和" div"设置为" bold"和" display"。只要客户端启用了javascript,其功能将与原始示例完全相同。