jQuery动画制作

事件的绑定
bind(type[,data],fn);
type:包括 blur/focus/load/resize/scroll/unload/click/dblclick/mousedown/error
mouseup/mousemove/mouseover/mouseout/mouseenter/mouseleave/change/select/submit/keydown/keypress/keyup等
还可以自定义名称
data:可选参数,作为event.data属性值传递给事件对象的额外数据对象
fn:用来绑定的处理函数

例子:
 $("#panel h5.head").bind("click",function(){
        var $content = $(this).next();
        if($content.is(":visible")){
            $content.hide();
        }else{           
                         $content.show();
        }   
               }
   )

也可以这样实现
 $("#panel h5.head").bind("mouseover",function(){
        $(this).next().show();
    });
 $("#panel h5.head").bind("mouseout",function(){
         $(this).next().hide();
    })


合成事件

hover方法
hover(enter,leave);//用于模拟光标悬停事件,当光标移动到元素上时
会触发指定的函数enter;当光标移出这个元素时,会触发指定的第二个函数(leave)

注意:
在IE6里仅有超级链接才用伪类选择符,对于其他元素,可以使用JQuery的hover方法
hover方法准确来说是代替bind("mouseenter")和bind("mouseleave")
当需要触发hover函数的时候,第二个参数需要用trigger("mouseleave")来触发


toggle()
toggle(fn1,fn2,...fnN)//用于模仿鼠标连续单击事件,当第一次单击元素,触发fn1
当第二次单击元素,触发fn2,过了后再重新从第一个函数开始
还有一个另外的作用:切换元素的可见状态
如果元素是可见的,单击切换则为隐藏,反之亦然



针对上面的例子修改为:
 $("#panel h5.head").hover(function(){
        $(this).next().show();
    },function(){
        $(this).next().hide();
       })

  $("#panel h5.head").toggle(function(){
    $(this).next().show();
    },function(){
    $(this).next().hide();
    })

  $("#panel h5.head").toggle(function(){
    $(this).next().toggle();
    },function(){
    $(this).next().toggle();
    })

.highlight{ background:#FF3300; }

  $("#panel h5.head").toggle(function(){
            $(this).addClass("highlight");
            $(this).next().show();
    },function(){
            $(this).removeClass("highlight");
            $(this).next().hide();
    });


事件冒泡
什么是冒泡?
页面上有多个事件,也可以多个元素响应同一个事件
假设页面上有两个元素,其中一个元素嵌套在另外一个元素里,并且都绑定了click事件,同时<body>
元素也绑定了click事件

<div id="content">   
外层div元素   
<span>内层span元素</span>
外层div元素</div>
 <div id="msg"></div>

// 为span元素绑定click事件
    $('span').bind("click",function(){
        var txt = $('#msg').html() + "<p>内层span元素被点击.<p/>";
        $('#msg').html(txt);
    });
// 为div元素绑定click事件
    $('#content').bind("click",function(){
        var txt = $('#msg').html() + "<p>外层div元素被点击.<p/>";
        $('#msg').html(txt);
    });
// 为body元素绑定click事件
    $("body").bind("click",function(){
        var txt = $('#msg').html() + "<p>body元素被点击.<p/>";
        $('#msg').html(txt);
    });
当点击内部<span>元素,触发<span>元素的cick事件时,会输出三条记录
而这个就是由事件冒泡引起的
引发事件顺序“冒泡”
(1)<span>
(2)<div>
(3)<body>
因为事件会按照DOM层次结构像水泡一样不断向上直至顶端,所以称为冒泡


停止冒泡的方法如下:

$('span').bind("click",function(event){
    var txt = $('#msg').html() + "<p>内层span元素被点击.<p/>";
    $('#msg').html(txt);
    event.stopPropagation();    //  阻止事件冒泡
    });

阻止默认行为

什么叫默认行为?
网页中的元素有自己默认的行为,例如,单击超链接后会跳转、单击提交按钮后表单会提交
而有时需要阻止默认行为的执行


阻止提交按钮
 $("#sub").bind("click",function(event){
        var username = $("#username").val();  //获取元素的值
         if(username==""){     //判断值是否为空   
         $("#msg").html("<p>文本框的值不能为空.</p>");  //提示信息
             event.preventDefault();  //阻止默认行为 ( 表单提交 )
         }
  })

如果需要既屏蔽默认行为又屏蔽冒泡,则用return false 即可



事件捕获
事件捕获是从最上到最下的过程,Jquery不支持事件捕获,用原生的javascript即可

事件对象的属性

event.type()
$("a").click(function(event) {
      alert(event.type);//获取事件类型
      return false;//阻止链接跳转
    });

event.preventDefault() //阻止默认行为

event.stopPropagation()//不允许事件冒泡

event.target()
$("a[href=http://google.com]").click(function(event) {
      alert(event.target.href);//获取触发事件的<a>元素的href属性值
      return false;//阻止链接跳转
    });

event.relatedTarget()

event.pageX()
$("a").click(function(event) {
 alert("Current mouse position: " + event.pageX + ", " + event.pageY );//获取鼠标当前相对于页面的坐标   
  return false;//阻止链接跳转
    });

e.which()
$("a").mousedown(function(e){
        alert(e.which)  // 1 = 鼠标左键 left; 2 = 鼠标中键; 3 = 鼠标右键
        return false;//阻止链接跳转

});


$("input").keyup(function(e){
        alert(e.which);//得到输入框内的asciii码
    })

e.metaKey
$("input").keyup(function(e){
        alert(e.metaKey +" "+e.ctrlKey );
        $(this).blur();   
})

event.originalEvent()
指向原始的事件对象



移除事件
unbind([type][,data]);
type为事件类型
data为将要移除的函数

如果没有参数,则删除所有绑定的事件
如果提供了事件类型作为参数,则只删除该类型的绑定事件
例子:

  $('#btn').unbind("click");})


 $('#btn').bind("click", myFun1 = function(){                     $('#test').append("<p>我的绑定函数1</p>");              }).           

     $('#test').append("<p>我的绑定函数1</p>");});
 $('#delTwo').click(function(){   
          $('#btn').unbind("click",myFun2);
       });


 $('#btn').one("click", myFun1 = function(){//只有第一次单击才有效,第二次无效                     $('#test').append("<p>我的绑定函数1</p>");       

      }).$('#test').append("<p>我的绑定函数1</p>");});


模拟操作

1.常用模拟

$('#btn').trigger("click");//自动触发btn的click事件

2.触发自定义事件

   $('#btn').bind("myClick", function(){
      $('#test').append("<p>我的自定义事件.</p>");
   });
       $('#btn').click(function(){   
        $(this).trigger("myClick");
       }).trigger("myClick");


 $('#btn').bind("myClick", function(event, message1, message2){
   $('#test').append( "<p>"+message1 + message2 +"</p>");
        });
  $('#btn').click(function(){
   $(this).trigger("myClick",["我的自定义","事件"]);
       }).trigger("myClick",["我的自定义","事件"]);//给自定义事件传递参数


3.执行默认操作
<button id="old">trigger</button>
<button id="new">triggerHandler</button>
<input />

 $('#old').bind("click", function(){
   $("input").trigger("focus");    //触发input元素的focus事件,也会使input获取输入焦点
    });
 $('#new').bind("click", function(){
   $("input").triggerHandler("focus");仅仅触发input元素的focus事件
        });
 $("input").focus(function(){ 
    $("body").append("<p>focus.</p>");})

4.绑定多个事件类型
$(function(){
$("div").bind("mouseover mouseout",fuction(){$(this).toggleClass("over");})

});


5.添加事件命名空间,便于管理
  $(function(){    $("div").bind("click.plugin",function(){
           $("body").append("<p>click事件</p>");    });
    $("div").bind("mouseover.plugin", function(){
           $("body").append("<p>mouseover事件</p>");
    });
    $("div").bind("dblclick", function(){
           $("body").append("<p>dblclick事件</p>");
    });
    $("button").click(function() {
        $("div").unbind(".plugin");
      })
  })

6.相当事件名称,不同命名空间执行方法
 $(function(){    $("div").bind("click",function(){
           $("body").append("<p>click事件</p>");
    });
    $("div").bind("click.plugin", function(){
           $("body").append("<p>click.plugin事件</p>");
    });
    $("button").click(function() {
          $("div").trigger("click!");    // 注意click后面的感叹号匹配所有不包含在命名空间中的命名方法
    });
  })
而如果都要被触发,可以写为 $("div").trigger("click"); 



动画
注意:用jquery做动画效果必须在文件头部包含如下的DTD定义,否则可能会引起动画的抖动
      Jquery任何动画效果都可以指定三种速度参数,slow(0.6秒) normal(0.4秒) fast(0.2秒)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


1.show()和hide()方法//改变的是元素的display属性

 $("#panel h5.head").toggle(function(){
         $(this).next().hide(600);
    },function(){
         $(this).next().show(600);//600可以写为slow(600秒内完成)/normal(400秒内完成)/fast(200秒内完成)
    })

2.fadeOut()和fadeIn()//改变元素的透明度,直到dispaly为none或者为block为止
$(function(){
    $("#panel h5.head").toggle(function(){
         $(this).next().fadeOut();
    },function(){
         $(this).next().fadeIn();//
    })
})

3.slideUp()和slideDown()//改变元素的高度
$(function(){
    $("#panel h5.head").toggle(function(){
         $(this).next().slideUp();
    },function(){
         $(this).next().slideDown();//当遇到一个display为none时,方法会将元素由上至下延伸显示
    })
})
4.自定义动画方法
animated (params,speed,callback);
params:一个包含样式属性及值的映射,比如{property1:"value1",peroperty2:"value2",...}
speed :速度参数
callback:在动画完成时执行的参数,可选

1.例子:
#panel {position: relative; width: 100px; height:100px;border: 1px solid #0050D0;background: #96E555; cursor: pointer}//前提是必须设置为position: relative;或者为

absolute
<div id="panel"></div>
$(function(){
    $("#panel").click(function(){
       $(this).animate({left: "500px"}, 3000);
    })
})

2.累加累减动画
上面的也可以写为
  $(this).animate({left: "+=500px"}, 3000);
  $(this).animate({left: "-=500px"}, 3000);

3.多重动画
(1)同时执行多个动画
$(this).animate({left: "500px",height:"200px"}, 3000);//既向右滑动,并且放大元素的高度

(2)按顺序执行多个动画
$(function(){
    $("#panel").click(function(){
         $(this).animate({left: "500px"}, 3000).animate({height: "200px"}, 3000);//将先向右然后再增大高度,这也叫动画队列
    })
})
4.综合动画

    $(function(){
       // $("#panel").css("opacity", "0.5");//设置不透明度
        $("#panel").click(function(){
              $(this).animate({left: "400px", height:"200px" ,opacity: "1"}, 3000)
                     .animate({top: "200px" , width :"200px"}, 3000 )
                     .fadeOut("slow");
        });
    });

$("#panel").click(function(){
              $(this).animate({left: "400px", height:"200px" ,opacity: "1"}, 3000)
                     .animate({top: "200px" , width :"200px"}, 3000 ,function(){
                         $(this).css("border","5px solid blue");
                     })
                     
        });
注意:假如把css方法放到第一个参数后面,将导致动画一开始就执行CSS方法,因为CSS方法不参与动画队列



停止动画

stop方法
stop([clearQueue][,gotoEnd])
clearQueue和gotoEnd都是可选参数
clearQueue:是否要清空未执行完的动画队列
gotoEnd:是否直接将正在执行的动画跳转到末状态

stop(true,true)//停止当前动画并直接到达当前动画的末状态并清空动画队列


2.判断元素是否处于动画状态
要避免动画累积而导致的动画于行为的不一致。
if (!$(element).is(":animated"))//判断元素是否正处于动画状态
{
//如果当前没有进行动画,则添加新动画

3.其他动画方法
toggle() //切换元素的可见状态
slideToggle()//通过高度变化来切换匹配元素的可见性
fadeTo()
}

实例:
<script type="text/javascript">
$(function(){
    var page = 1;
    var i = 4; //每版放4个图片
    //向后 按钮
    $("span.next").click(function(){    //绑定click事件
         var $parent = $(this).parents("div.v_show");//根据当前点击元素获取到父元素
         var $v_show = $parent.find("div.v_content_list"); //寻找到“视频内容展示区域”
         var $v_content = $parent.find("div.v_content"); //寻找到“视频内容展示区域”外围的DIV元素
         var v_width = $v_content.width() ;
         var len = $v_show.find("li").length;
         var page_count = Math.ceil(len / i) ;   //只要不是整数,就往大的方向取最小的整数
         if( !$v_show.is(":animated") ){    //判断“视频内容展示区域”是否正在处于动画
              if( page == page_count ){  //已经到最后一个版面了,如果再向后,必须跳转到第一个版面。
                $v_show.animate({ left : '0px'}, "slow"); //通过改变left值,跳转到第一个版面
                page = 1;
                }else{
                $v_show.animate({ left : '-='+v_width }, "slow");  //通过改变left值,达到每次换一个版面
                page++;
             }
         }
         $parent.find("span").eq((page-1)).addClass("current").siblings().removeClass("current");
   });
    //往前 按钮
    $("span.prev").click(function(){
         var $parent = $(this).parents("div.v_show");//根据当前点击元素获取到父元素
         var $v_show = $parent.find("div.v_content_list"); //寻找到“视频内容展示区域”
         var $v_content = $parent.find("div.v_content"); //寻找到“视频内容展示区域”外围的DIV元素
         var v_width = $v_content.width();
         var len = $v_show.find("li").length;
         var page_count = Math.ceil(len / i) ;   //只要不是整数,就往大的方向取最小的整数
         if( !$v_show.is(":animated") ){    //判断“视频内容展示区域”是否正在处于动画
              if( page == 1 ){  //已经到第一个版面了,如果再向前,必须跳转到最后一个版面。
                $v_show.animate({ left : '-='+v_width*(page_count-1) }, "slow");
                page = page_count;
            }else{
                $v_show.animate({ left : '+='+v_width }, "slow");
                page--;
            }
        }
        $parent.find("span").eq((page-1)).addClass("current").siblings().removeClass("current");
    });
});


</script>


<div class="v_show">
    <div class="v_caption">
        <h2 class="cartoon" title="卡通动漫">卡通动漫</h2>
        <div class="highlight_tip">
            <span class="current">1</span><span>2</span><span>3</span><span>4</span>
        </div>
        <div class="change_btn">
            <span class="prev" >上一页</span>
            <span class="next">下一页</span>
        </div>
        <em><a href="#">更多>></a></em>
    </div>
    <div class="v_content">
        <div  class="v_content_list">
            <ul>
                <li><a href="#"><img src="img/01.jpg" alt="海贼王" /></a><h4><a href="#">海贼王</a></h4><span>播放:<em>28,276</em></span></li>
                <li><a href="#"><img src="img/01.jpg" alt="海贼王" /></a><h4><a href="#">海贼王</a></h4><span>播放:<em>28,276</em></span></li>
                <li><a href="#"><img src="img/01.jpg" alt="海贼王" /></a><h4><a href="#">海贼王</a></h4><span>播放:<em>28,276</em></span></li>
                <li><a href="#"><img src="img/01.jpg" alt="海贼王" /></a><h4><a href="#">海贼王</a></h4><span>播放:<em>28,276</em></span></li>
                <li><a href="#"><img src="img/02.jpg" alt="哆啦A梦" /></a><h4><a href="#">哆啦A梦</a></h4><span>播放:<em>33,326</em></span></li>
                <li><a href="#"><img src="img/02.jpg" alt="哆啦A梦" /></a><h4><a href="#">哆啦A梦</a></h4><span>播放:<em>33,326</em></span></li>
                <li><a href="#"><img src="img/02.jpg" alt="哆啦A梦" /></a><h4><a href="#">哆啦A梦</a></h4><span>播放:<em>33,326</em></span></li>
                <li><a href="#"><img src="img/02.jpg" alt="哆啦A梦" /></a><h4><a href="#">哆啦A梦</a></h4><span>播放:<em>33,326</em></span></li>
                <li><a href="#"><img src="img/03.jpg" alt="火影忍者" /></a><h4><a href="#">火影忍者</a></h4><span>播放:<em>28,276</em></span></li>
                <li><a href="#"><img src="img/03.jpg" alt="火影忍者" /></a><h4><a href="#">火影忍者</a></h4><span>播放:<em>28,276</em></span></li>
                <li><a href="#"><img src="img/03.jpg" alt="火影忍者" /></a><h4><a href="#">火影忍者</a></h4><span>播放:<em>28,276</em></span></li>
                <li><a href="#"><img src="img/03.jpg" alt="火影忍者" /></a><h4><a href="#">火影忍者</a></h4><span>播放:<em>28,276</em></span></li>
                <li><a href="#"><img src="img/04.jpg" alt="龙珠" /></a><h4><a href="#">龙珠</a></h4><span>播放 <em>57,865</em></span></li>
                <li><a href="#"><img src="img/04.jpg" alt="龙珠" /></a><h4><a href="#">龙珠</a></h4><span>播放 <em>57,865</em></span></li>
                <li><a href="#"><img src="img/04.jpg" alt="龙珠" /></a><h4><a href="#">龙珠</a></h4><span>播放 <em>57,865</em></span></li>
                <li><a href="#"><img src="img/04.jpg" alt="龙珠" /></a><h4><a href="#">龙珠</a></h4><span>播放 <em>57,865</em></span></li>
             </ul>
        </div>
    </div>
</div>

* { margin:0; padding:0; word-break:break-all; }
body { background:#FFF; color:#333; font:12px/1.5em Helvetica, Arial, sans-serif; }
h1, h2, h3, h4, h5, h6 { font-size:1em; }
a { color:#2B93D2; text-decoration:none; }
a:hover { color:#E31E1C; text-decoration:underline; }
ul, li { list-style:none; }
fieldset, img { border:none; }

/* v_show style */
.v_show { width:595px; margin:20px 0 1px 60px; }
.v_caption { height:35px; overflow:hidden; background:url(img/btn_cartoon.gif) no-repeat 0 0; }
.v_caption h2 { float:left; width:84px; height:35px; overflow:hidden; background:url(img/btn_cartoon.gif) no-repeat; text-indent:-9999px; }
.v_caption .cartoon { background-position: 0 -100px; }
.v_caption .variety { background-position:-100px -100px; }
.highlight_tip { display:inline; float:left; margin:14px 0 0 10px; }
.highlight_tip span { display:inline; float:left; width:7px; height:7px; overflow:hidden; margin:0 2px; background:url(img/btn_cartoon.gif) no-repeat 0 -320px; text-

indent:-9999px; }
.highlight_tip .current { background-position:0 -220px; }
.change_btn { float:left; margin:7px 0 0 10px; }
.change_btn span { display:block; float:left; width:30px; height:23px; overflow:hidden; background:url(img/btn_cartoon.gif) no-repeat; text-indent:-9999px;

cursor:pointer; }
.change_btn .prev { background-position:0 -400px;  }
.change_btn .next { width:31px; background-position:-30px -400px; }
.v_caption em { display:inline; float:right; margin:10px 12px 0 0; font-family:simsun; }
.v_content { position:relative; width:592px; height:160px; overflow:hidden; border-right:1px solid #E7E7E7; border-bottom:1px solid #E7E7E7; border-left:1px solid

#E7E7E7; }
.v_content_list { position:absolute; width:2500px;top:0px; left:0px; }
.v_content ul {float:left;}
.v_content ul li { display:inline; float:left; margin:10px 2px 0; padding:8px; background:url(img/v_bg.gif) no-repeat; }
.v_content ul li a { display:block; width:128px; height:80px; overflow:hidden; }
.v_content ul li img {  width:128px; height:96px; }
.v_content ul li h4 { width:128px; height:18px; overflow:hidden; margin-top:12px; font-weight:normal; }
.v_content ul li h4 a { display:inline !important; height:auto !important; }
.v_content ul li span { color:#666; }
.v_content ul li em { color:#888; font-family:Verdana; font-size:0.9em; }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值