JQuery仿购物网站放大镜特效所遇问题及思考

        JQuery仿购物网站放大镜特效所遇问题及思考

    先贴下效果图,然后描述起来也就不会不知道我在说什么了。

           

    我碰到的问题一: 一开始我自己总结了是因为两个小原因导致的①使用了mouseover,mouseout事件②因为层叠样式(z-index)的原因。一开始的HTML结构如图:

1 <ul>
2     <li class="first">
3         <img src="./image/ep.jpg" alt="">
4         <div class="tipbox"></div> 
5     </li>
6     <div class="firBox">
7         <img src="./image/ep.jpg" alt="">
8     </div>
9 </ul>

    我的思路是:一开始.firBox,  .tipbox是隐藏的,当鼠标mouseover到li元素时,出现放大镜(.tipbox)和相应的放大区域(.firBox);而鼠标mouseout出li元素时,则隐藏二者。问题就出在这里了,我鼠标移动到li元素中,放大镜出现后就会莫名奇妙的消失了。然后我分析了是因为层叠样式导致的(并没有深刻理解mouseover,mouseout会冒泡,移入移出子元素也会触发mouseover,mouseout事件)。为搞清楚触发的顺序和层叠样式产生的影响,我参考了W3C的mouseover,mouseenter的区别例子,并在原来代码的基础上进行了测试。得出了结论:① 不论子元素的层叠样式多大,mouseover,mouseout在子元素还是会触发,而mouseenter,mouseleave在子元素还是不会触发。②若从父元素到子元素则会触发父元素的mouseout事件再触发子元素的mouseover事件,若从子元素到父元素则会触发子元素的mouseout事件再出来子元素的mouseover事件。贴出我改动的代码,感兴趣的可以按照自己需求改,得出自己的结论。

 1 <html>
 2   <head>
 3     <style>
 4           .over > h2 {
 5            position: absolute;
 6            z-index: 10;
 7           display: none; 
 8         }
 9          .enter > h2{
10            position: absolute;
11            z-index: 10;
12          }
13     </style>
14 <script type="text/javascript" src="/jquery/jquery.js"></script>
15 <script type="text/javascript">
16   x=0;
17   y=0;
18 $(document).ready(function(){
19   $("div.over").mouseover(function(e){
20     $("div.over").find("h2").css('display', 'block');
21     $(".over span").text(x+=1);
22     alert('over'+ e.target);
23   });
24   $("div.over").mouseout(function(e) {
25      $("div.over").find("h2").css('display', 'none');
26     alert('out'+e.target);
27   });
28   $("div.enter").mouseenter(function(){
29     $(".enter span").text(y+=1);
30     alert('enter');
31   });
32   $("div.enter").mouseleave(function(){
33     alert('leave');
34   })
35 });
36 </script>
37    </head>
38    <body>
39        <p>不论鼠标指针穿过被选元素或其子元素,都会触发 mouseover 事件。</p>
40        <p>只有在鼠标指针穿过被选元素时,才会触发 mouseenter 事件。</p>
41        <div class="over" style="background-color:lightgray;padding:20px;40%;float:left;height: 100px">
42            <h2 style="background-color:white;height: 90px;">被触发的 Mouseover 事件:<span></span></h2>
43        </div>
44        <div class="enter" style="background-color:lightgray;padding:20px;40%;float:right;height: 100px">
45             <h2 style="background-color:white;">被触发的 Mouseenter 事件:<span></span></h2>
46        </div>
47    </body>
48 </html>

    最后我得出了结论是因为事件的冒泡导致的,和层叠颜样式并无关系。然后我进行了改进使用一个空的透明DIV,宽高与li元素一样大小,覆盖在其上,z-index为2,.tipbox的z-index为1。最后对空的透明DIV使用JQ的hover()方法和mousemove()方法可完美解决。(注意:hover()方法是用来替代mouseenter,mouseleaver事件的,因此没有冒泡存在).

   HTML结构:

 1 <ul>
 2     <li class="first">
 3         <img src="./image/ep.jpg" alt="">
 4         <!--  空的透明DIV -->
 5         <div class="zzc"></div>
 6         <div class="tipbox"></div>
 7     </li>
 8     <div class="firBox">
 9         <img src="./image/ep.jpg" alt="">
10     </div>
11 </ul>

    .zzc的CSS样式:

1 .zzc {
2     width: 100%;
3     height: 100%;
4     left: 0;
5     top: 0;
6     z-index: 2;
7     cursor: crosshair;
8 }

    .tipbox的CSS样式:

.tipbox {
    width: 80px;
    height: 60px;
    bottom: 0;
    left: 0;
    background: rgba(0,0,0,0.5);
    display: none;
    z-index: 1;
}

    看来虽然内容不多,但是在第一次做的过程中还是躺了,然后各种找办法解决。分析完且解决完后有稍微记录了下大概是什么问题,问题出在哪里。但是有了一点知识的沉淀后,你再去看,再分析,再去测试会发现不同的东西,推翻以前的结论,往深处又走了一步,这时候我感觉我获得的成就感会是double,  这是我这次记录所获得的最大感受。

原文地址:https://www.cnblogs.com/cleaverlove/p/6373697.html