• 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,  这是我这次记录所获得的最大感受。

  • 相关阅读:
    Google recaptcha在webform中的使用
    User control's property loses value after a postback
    share memory cache across multi web application
    Losing session data in ASP.NET
    What is the difference between UserControl, WebControl, RenderedControl and CompositeControl?
    maven跳过单元测试-maven.test.skip和skipTests的区别
    @RequestMapping @ResponseBody 和 @RequestBody 注解的用法与区别
    SpringBoot-@PathVariable
    pick王菊?作为“菊外人”的程序员能做点什么?
    数据库CRUD操作
  • 原文地址:https://www.cnblogs.com/cleaverlove/p/6373697.html
Copyright © 2020-2023  润新知