48-1 jQuery

一、jquery简介

1、jquery是什么 

通俗的讲,就是一些用JavaScript写好的函数打包放在一个js文件里,需要时直接调用即可(这叫框架)。其最大的优势是:简洁、超好的兼容性。

英文官网: http://jquery.com/
中文文档: http://jquery.cuishifeng.cn/

下载:
http://jquery.com/download/             # 右键单击:从链接另存文件为

调用:
<script src="jquery-3.2.1.js"></script>

注意:压缩版是在生产环境中用的,是将非压缩版中的缩进等统统去掉,所以查看时不容易分清逻辑结构。 

生产环境中的应用现状:

中小公司大量使用jquery,因为它大而全(小公司无力去写个自己的框架);而大公司不会原封不动的用jquery,而是会根据自己的实际情况开发出个框架,自己用自己的,这样效率更高。手机端不能用jQuery。

2、jquery对象

(1)jQuery对象是什么

jQuery 对象是由DOM对象封装产生的。符号表示为:$ 

$ <==> jQuery    # 符号"$"与符号"jQuery"等价

  对于同一个元素,通过jQuery方式获取得到的对象与通过DOM获取得到的对象其实是不一样的:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="di">test</div>
<script src="jquery-3.2.1.js"></script>
<script>

    var ret = document.getElementById("di");    // 获取DOM对象
    console.log(ret);

    var $ret2 = $("#di");                       // 获取jQuery对象
    console.log($ret2);

    for (i in $ret2){                           // ret2类似于一个字典,键为0的值就是DOM对象。
        console.log(i);
        console.log($ret2[i]);
    }

</script>
</body>
</html>
jQuery对象与DOM对象的区别

约定当获取的是 jQuery 对象时, 在变量前面加上“$”符号(根据变量的命名规则,首字符可以是"$"符号)。这样做完全是为了方便一看就知道是jQuery对象,并不是语法上的硬性规定,没有其他特殊含义。

var $variable = jQuery 对象
var variable = DOM 对象

所以:jQueryDOM对象的方法不可以混用, 如果一个对象是 jQuery 对象那么它只可以使用 jQuery 里的方法,比如: 

 $("#test").html()  <==>  document.getElementById(" test ").innerHTML; 

(2)jQuery对象与DOM对象的转换

DOM对象转为 jQuery对象:
$(document.getElementById("msg"))     // 通过$()转换成jquery对象

jQuery对象转为DOM对象:
$(this)[0]                            // 方式1:jQuery对象中,索引0对应的值就是DOM对象
$(this).get(0)                        // 方式2:通过jQuery自带的get方法

3、基本语法

$(selector).action() 

 

二、获取元素(重要的选择器和筛选器) 

1、选择器

(1)基本选择器

$("*")                 选择所有元素
$("#id")               根据元素id选择
$(".class")            根据类选择            
$("tag")               根据元素的标签选择
$(".class,p,div")      同时选择.class类的元素和所有的p、div标签的元素

(2)层级选择器

$(".outer div")        选择.outer类标签内的所有div元素
$(".outer>div")        仅在儿子一层找div标签
$(".outer+div")        毗邻:紧随的下一个div标签,中间不能有间隔的标签
$(".outer~div")        下一个div标签,中间可以有间隔的标签

(3)基本筛选选择器

$(".div2 li:first")    选择.div2类标签内的第一个li标签
$(".div2 li:last")     选择.div2类标签内的最后一个li标签
$(".div2 li:eq(2)")    选择索引值为2的标签(索引值从0开始)
$(".div2 li:lt(2)")    小于索引2的
$(".div2 li:gt(2)")    大于索引2的

(4)属性选择器

$("[alex]")            所有含alex属性的标签
$("[alex='lsb']")      所有alex属性等于lsb的标签

(5)表单选择器

是一种特殊的属性选择器。仅适用于找某种input标签。

$("[type='text']")   ----简写为--->   $(":text")
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="jquery-3.2.1.js"></script>
    <!--<style>-->
        <!--div{-->
            <!--color: red;-->
        <!--}-->
    <!--</style>-->
</head>
<body>
<div class="div1">hello div1</div>
<div class="div2">hello div2
    <ul>
        <li>111</li>
        <li>222</li>
        <li>333</li>
        <li>444</li>
        <li>555</li>
    </ul>
</div>
<p id="p1" alex="lsb">hello p1</p>
<p id="p2" alex="dsb">hello p2</p>
<div class="outer">
    <div>
        <p>hello p3</p>
    </div>
    <p>hello p4</p>
</div>
<div>hello div3</div>
<p id="p5">hello p5</p>


<input type="text">
<input type="button">

<script>
//    基本选择器
//    $("*").css("color", "red");
//    $("div").css("color", "red");
//    $("#p2").css("color", "red");
//    $(".div2").css("color", "red");

//    层级选择器
//    $(".div2, #p2").css("color", "red");
//    $(".outer p").css("color", "red");
//    $(".outer>p").css("color", "red");          // 仅在儿子一层找
//    $(".outer+p").css("color", "red");          //毗邻:紧随的下一个p标签,中间不能有间隔的标签
//    $(".outer~p").css("color", "red");          // 下一个p标签,中间可以有间隔的标签

//    基本筛选器
//    $(".div2 li:first").css("color", "red");
//    $(".div2 li:last").css("color", "red");
//    $(".div2 li:eq(2)").css("color", "red");     // 按索引,从0开始
//    $(".div2 li:lt(2)").css("color", "red");     // 小于索引2的
//    $(".div2 li:gt(2)").css("color", "red");     // 大于索引2的

//    属性选择器
//    $("[alex]").css("color", "red");             //  所有含alex属性的标签
//    $("[alex='lsb']").css("color", "red");       // 所有alex属性等于lsb的标签

//    表单选择器
//    $(":button").css("width", "50px");               // input标签的属性选择,可以简写为这样的形式

</script>
</body>
</html>
选择器测试

 2、筛选器

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="jquery-3.2.1.js"></script>
</head>
<body>

<div class="div1">hello1
    <div class="div8">hello8</div>
    <div class="div10">hello10</div>
    <div class="div11">hello11</div>
    <div class="div2"> hello2
        <div class="div3"> hello3</div>
    </div>
    <div class="div3">hello4</div>
    <div class="div5">hello5</div>
    <div class="div6">hello6</div>
    <div class="div7">hello7</div>
</div>
<div class="div9">hello9</div>




<script>
//    $(".div1").children(".div3").css("color", "red");    // 只找儿子层的div3
//    $(".div1").find(".div3").css("color", "red");        // 找.div1类下所有层的div3


//    $(".div2").next().css("color","red");                  // 在.div2的同层级标签中,找.div2的下一个
//    $(".div2").nextAll().css("color","red");             // 在.div2的同层级标签中,找.div2的之后所有的
//    $(".div2").nextUntil(".div6").css("color","red");     // 往后直到div6,但不包括div6

//    $(".div2").prev().css("color", "red");
//    $(".div2").prevAll().css("color", "red");
//    $(".div2").prevUntil(".div8").css("color", "red");    // 往前直到div8,但不包括div8

//    $(".div3").parent().css("color", "red");
//    $(".div3").parents().css("color", "red");             //一直往外找,是一个集合。最后相当于所有的标签都会应用这一设置
//    $(".div3").parentsUntil(".div1").css("color", "red");    //一直往外找,直到div1这一层,且不包括div1这层

    $(".div2").siblings().css("color", "red");

</script>
</body>
</html>
筛选器测试

(1)过滤筛选器

$("li").first()                     选择第一个li标签
$("li").eq(2)                       选择索引为2个li标签
$("li").hasClass("test");           如果存在属于test类的li,则返回True

(2)查找筛选器

$(".div1").children(".div3")        只找.div1下儿子层的.div3
$(".div1").find(".div3")            找.div1下所有层的.div3
$(".div2").next()                   在.div2的同层级标签中,找.div2的下一个标签
$(".div2").nextAll()                在.div2的同层级标签中,找.div2的之后所有的标签
$(".div2").nextUntil(".div6")       往后直到.div6,但不包括.div6
$(".div2").prev()                   在.div2的同层级标签中,找.div2的前一个标签
$(".div2").prevAll()                在.div2的同层级标签中,找.div2的之前所有的标签
$(".div2").prevUntil(".div8")       往前直到div8,但不包括div8
$(".div3").parent()                 找.div3的父级标签
$(".div3").parents()                一直往外找,是一个集合。最后相当于所有的标签都会应用这一设置
$(".div3").parentsUntil(".div1")    一直往外找,直到div1这一层,且不包括div1这层
$(".div2").siblings()               找同胞。即与.div2同级的所有标签,但不包括.div2自身  
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>left_menu</title>

    <style>
          .menu{
              height: 500px;
              width: 30%;
              background-color: rgb(150, 150, 150);
              float: left;
          }
         .title{
             line-height: 50px;
             color: white;}
         .hide{
             display: none;
         }
         .con{
             background-color: rgb(200, 200, 200);
         }
    </style>
</head>
<body>

<div class="outer">
    <div class="menu">
        <div class="item">
            <div class="title" onclick="show(this);">菜单一</div>
            <div class="con hide">
                <div>111</div>
                <div>111</div>
                <div>111</div>
            </div>
        </div>
        <div class="item">
            <div class="title" onclick="show(this);">菜单二</div>
            <div class="con hide">
                <div>222</div>
                <div>222</div>
                <div>222</div>
            </div>
        </div>
        <div class="item">
            <div class="title" onclick="show(this);">菜单三</div>
            <div class="con hide">
                <div>333</div>
                <div>333</div>
                <div>333</div>
            </div>
        </div>
    </div>
</div>

    <script src="jquery-3.2.1.js"></script>
    <script>
          function show(self){
              $(self).next().removeClass("hide");
              $(self).parent().siblings().children(".con").addClass("hide");
          }
    </script>
</body>
</html>
实例:左侧菜单
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>tab</title>

    <style>
        *{
            margin: 0px;
            padding: 0px;
        }
        .tab_outer{
            margin: 0px auto;
            width: 60%;
        }
        .menu{
            background-color: #cccccc;
            /*border: 1px solid red;*/
            line-height: 40px;
        }
        .menu li{
            display: inline-block;
        }
        .menu a{
            border-right: 1px solid red;
            padding: 11px;
        }
        .content{
            background-color: tan;
            border: 1px solid green;
            height: 300px;
        }
        .hide{
            display: none;
        }
        .current{
            background-color: darkgray;
            color: yellow;
            border-top: solid 2px rebeccapurple;
        }
    </style>
</head>
<body>
      <div class="tab_outer">
          <ul class="menu">
              <li xxx="c1" class="current" onclick="tab(this);">菜单一</li>    <!--通过xxx属性值为c1与下面id为c1的标签建立联系-->
              <li xxx="c2" onclick="tab(this);">菜单二</li>
              <li xxx="c3" onclick="tab(this);">菜单三</li>
          </ul>
          <div class="content">
              <div id="c1">内容一</div>
              <div id="c2" class="hide">内容二</div>
              <div id="c3" class="hide">内容三</div>
          </div>
      </div>

    <script src="jquery-3.2.1.js"></script>
    <script>
           function tab(self){
               // 更改标签样式:
               $(self).addClass("current");     /*在DOM中取对象时直接self就表示对象了。jQuery都需要用$()包一下,封装成个jQuery对象*/
               $(self).siblings().removeClass("current");
               // 因为支持链式操作,所有上面两句可以简写为:
               // $(self).addClass("current").siblings().removeClass("current")

               // 更改内容样式:
               var s=$(self).attr("xxx");    // 获取xxx对象的属性值,DOM中用getAttribute
               $("#"+s).removeClass("hide");
               $("#"+s).siblings().addClass("hide");
           }
    </script>
</body>
</html>
实例:tab切换

 个人理解:选择器、筛选器两种方式获取标签,相当于两个维度,使jQuery对标签的定位功能变的非常强大,且简单 。

 

三、操作元素

1、操作元素的内容

$("p").text(value)                  设定p元素的内部文本为value。若value为空表示查看该text
$("p").html(value)                  设定p元素的内部html为value。若value为空表是查看该html。.html()相当于DOM的.innerHTML()
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="jquery-3.2.1.js"></script>
</head>
<body>
     <table border="1">
         <tr>
             <td><input type="checkbox"></td>
             <td>111</td>
         </tr>
         <tr>
             <td><input type="checkbox"></td>
             <td>222</td>
         </tr>
         <tr>
             <td><input type="checkbox"></td>
             <td>333</td>
         </tr>
         <tr>
             <td><input type="checkbox"></td>
             <td>444</td>
         </tr>
     </table>

<script>
// 用法一:通过选择器选中对象
//    $("table tr").each(function () {
//        console.log($(this).html())          // this表示所循环到的当前标签
//    })

// 用法二:自己手动传入对象
//    li=[10, 20, 30, 40];
//    $.each(li, function(i, x){
//        console.log(i, x);                    /* 第一参数是索引,第二参数是值 */
//    })

//    dic={name:"yuan", sex:"male"};
//    $.each(dic, function(i, x){
//        console.log(i, x);                   /* 第一参数是索引,第二参数是值 */
//    })
</script>
</body>
</html>

each遍历循环
each遍历循环

2、操作元素的属性

(1)属性

$(":checkbox").val(value)           设定type为checkbox的input标签的value值。若value为空表示查看该value值
$("select").val([1, 2, 3])          select框为多选时,设定其多选的预设值
 
$("#test").attr("alex")             查看#test标签的alex属性的值
$("#test").attr("alex","sb")        设定#test标签的alex属性的值为sb
 
$("#ck").attr("checked","checked")  选中
$("#ck").removeAttr("checked")      取消
$("#ck").prop("checked")            判断是否被点击选中,若被选中值为true,否则为false
$("#ck").prop("checked",true)       选中
$("#ck").prop("checked",false)      取消

(2)class类

$("#test").addClass("hide")         为每个匹配的元素添加指定的类名
$("#test").removeClass("hide")      从所有匹配的元素中删除全部或者指定的类
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="jquery-3.2.1.js"></script>
    <script>
             function selectall(){
                 $("table :checkbox").prop("checked",true)
             }

             function che(){
                 $("table :checkbox").prop("checked",false)
             }

             function reverse(){
                 $("table :checkbox").each(function(){
                     if ($(this).prop("checked")){
                         $(this).prop("checked",false)
                     }
                     else {
                         $(this).prop("checked",true)
                     }
                 });
             }

    </script>
</head>
<body>

 <button onclick="selectall();">全选</button>
 <button onclick="che();">取消</button>
 <button onclick="reverse();">反选</button>

 <table border="1">
     <tr>
         <td><input type="checkbox"></td>
         <td>111</td>
     </tr>
     <tr>
         <td><input type="checkbox"></td>
         <td>222</td>
     </tr>
     <tr>
         <td><input type="checkbox"></td>
         <td>333</td>
     </tr>
     <tr>
         <td><input type="checkbox"></td>
         <td>444</td>
     </tr>
 </table>
</body>
</html>
实例:全选反选取消

3、操作元素的样式

(1)样式

$("div").css("color");                                 # 取得第一个div标签的color样式属性的值
$("div").css("color","red");                           # 将所有div字体设为红色
$("p").css({ "color": "red", "font-size": "50px" });   # 将所有div字体设为红色,字号设为50px

(2)位置

① offset()

offset()始终返回元素相对于document边缘的距离。

$("#div2").offset();                                   # 返回值:{top: 50, left: 58}
$("#div2").offset().left;                              # 返回距窗口左边缘多少像素。js中字典可以用"."取值
$("#div2").offset().top;                               # 返回距窗口上边缘多少像素
$("#div2").offset({top:10,left:30});                   # 设定距窗口上边缘和距窗口左边缘的像素数

② position()

position()获取元素相对于它最近的具有相对位置(position:relative或position:absolute)的父级元素的距离,如果找不到这样的元素,则返回相对于document的距离。

$("#div2").position()                                    # 返回值:{top: 0, left: 0}  
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        #outer{
            width:200px;
            height:200px;
            background-color:yellow;
            position:relative;
            left:100px;
        }
        #inner{
            width:100px;
            height:100px;
            background-color:blue;
            position:absolute;
            left:50px;
            top:60px;
        }
    </style>
</head>

<body>
<div id="outer">
    <div id="inner"></div>
</div>

<script src="jquery-3.2.1.js"></script>
<script>
    console.log($("#inner").position().left);               //输出:50
    console.log($("#inner").position().top);                //输出:60

    console.log($("#outer").position().left);               //输出:108
    console.log($("#outer").position().top);                //输出:8

    console.log($("#inner").offset().left);                 //输出:$("#outer").offset().left+50
    console.log($("#inner").offset().top);                  //输出:$("#outer").offset().top+60
</script>
</body>
</html>
offset()与position()的区别

 ③scrollTop、scrollLeft

获取或设定滚动条中滑块的位置。

 

$('div').scrollTop()                                     # 获取div元素相对滚动条顶部的偏移
$('div').scrollTop(20)                                   # 跳转到指定偏移
$(window).scrollTop()                                    # 获取当前窗口相对滚动条顶部的偏移  
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        div{
            height:500px;
            width:200px;
            background-color: yellow;
            overflow:auto;                  /*内容太多,超出本层是自动添加滚轮*/
        }
    </style>
    <script src="jquery-3.2.1.js"></script>
</head>
<body>
<div onscroll="func1()">                    <!--onscroll监听滚轮的滚动-->
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
</div>

<script>
    function func1(){
        console.log($('div').scrollTop());     /* 量化滚动的多少*/
    }
</script>
</body>
</html>
示例 

(3)尺寸

$("p").height();                                         # 获取第一个p元素的高度
$("p").height(20);                                       # 设定所有p元素的高度为20px
$("p").width();                                          # 获取第一个p元素的宽度
$("p").width(20);                                        # 设定所有p元素的宽度为20px

$("p").innerHeight();                                    # 获取第一个匹配元素内部区域高度(包括补白、不包括边框)
$("p").innerWidth();                                     # 获取第一个匹配元素内部区域宽度(包括补白、不包括边框)

$("p").outerHeight();                                    # 获取第一个匹配元素外部高度(默认包括补白和边框)
$("p").outerWidth();                                     # 获取第一个匹配元素外部宽度(默认包括补白和边框)
# 补充:outerHeight([options]),设置为 true 时,计算边距在内,默认为false

4、元素本身的新增、删除、清空、复制、替换

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="jquery-3.2.1.js"></script>
</head>
<body>
<div id="div1">
    <div id="div2"></div>
    <div id="div3"></div>
</div>
<div id="div4">
    <p>hello p</p>
    <span>hello span</span>
</div>
<script>
//    var son_element=$("p");
//    var parent_element=$("#div1");
//     parent_element.append(son_element);          // 放在 parent_element标签儿子层的最后一个位置。
//     son_element.appendTo(parent_element);        // 同上
//     parent_element.prepend(son_element);         // 放在 parent_element标签儿子层的最前一个位置。
//     son_element.prependTo(parent_element);
//
//     parent_element.before(son_element);          // 放在 parent_element同层的parent_element之前一个位置。
//     son_element.insertBefore(parent_element);    // 同上
//     parent_element.after(son_element);           // 放在 parent_element同层的parent_element之前一个位置。
//     son_element.insertAfter(parent_element);     // 同上

//     $("span").replaceWith($("#div3"));           // 将span替换为div标签
//     $("span").remove()                           // 删除span标签
//     $("span").empty()                            // 将span标签的内容清空

</script>
</body>
</html>
示例

(1)新增

# 内部插入
parent_element.append(son_element);          // 放在 parent_element标签儿子层的最后一个位置。
son_element.appendTo(parent_element);        // 同上
parent_element.prepend(son_element);         // 放在 parent_element标签儿子层的最前一个位置。
son_element.prependTo(parent_element);

# 外部插入
parent_element.before(son_element);          // 放在 parent_element同层的parent_element之前一个位置。
son_element.insertBefore(parent_element);    // 同上
parent_element.after(son_element);           // 放在 parent_element同层的parent_element之前一个位置。
son_element.insertAfter(parent_element);     // 同上

(2)删除

$("span").remove()                            // 删除span标签 

(3)清空

$("span").empty()                             // 将span标签的内容清空

(4)复制

$("span").clone()
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="outer">
    <div class="item">
        <input type="button" value="+" onclick="func1(this)">
        <input type="text">
    </div>
</div>


<script src="jquery-3.2.1.js"></script>
<script>
    function func1(self){
        var Cln = $(self).parent().clone();
        Cln.children(":button").val("-");
        Cln.children(":button").attr("onclick","func2(this)");
        $("#outer").append(Cln);
    }

    function func2(self){
        $(self).parent().remove();
    }
</script>
</body>
</html>
View Code

(5)替换

$("span").replaceWith($("#div3"));           // 将span替换为div标签

 

四、事件绑定

1、事件绑定的方式

(1)基本的

$("p").click(function(){
    alert(123)              # 注意格式,要绑定的函数被包裹在 function(){...}中
});

(2)最新的

# 最新的:
$("p").on("click",function(){
    alert(123);
})

# 原来的:
$("p").bind("click",function(){
    alert(123);
})
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<p>helop</p>
<ul>
    <li>111</li>
    <li>222</li>
    <li>333</li>
    <li>444</li>
</ul>
<input type="button" value="+" onclick="add()">
<script src="jquery-3.2.1.js"></script>
<script>
//     $("ul li").click(function(){           // 基本写法的问题:新加入的li不会被绑定上事件
//         alert(123);
//     });


        $("ul").on("click","li",function(){   // 新加入的li也会被绑定上事件
           alert(123);
        });


    function add(){
       $("ul").append("<li>555</li>")
    }

</script>
</body>
</html>
基本写法与on写法的小区别
# on写法传入 data 参数
$("p").on("click", {foo2:"bar"},func1);
function func1(event){
   alert(event.data.foo2);    //如何去取传入的对象
}

2、各种事件 

(1) ready()

等同于DOM中window.onload

通过使用这个方法,可以在DOM载入就绪能够读取并操纵时立即调用你所绑定的函数,而99.99%的JavaScript函数都需要在那一刻执行。

$(document).ready(function(){
    $("p").css("color","red");
});

# 简写为:
$(function(){
    $("p").css("color","red");
})

(2)mouse相关

mousemove        当鼠标指针在指定的元素中移动时,就会发生 mousemove 事件
mousedown        当鼠标指针移动到元素上方,并按下鼠标按键时,会发生 mousedown 事件
mouseup          当在元素上放松鼠标按钮时,会发生 mouseup 事件
mouseout         当鼠标指针从元素上移开时,发生 mouseout 事件
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <div style="border: 1px solid #ddd;width: 600px;position: absolute;">
        <div id="title" style="background-color: black;height: 40px;color: white;">标题</div>
        <div style="height: 300px;">内容</div>
    </div>
<script type="text/javascript" src="jquery-3.2.1.js"></script>
<script>
    $(function(){                                             // ready事件,页面加载完成之后自动执行下面代码
        $('#title').mouseover(function(){                     // mouseover事件
            $(this).css('cursor','move');
        }).mousedown(function(e){                             // mousedown事件、链式操作
            var _event = e;                                   // 或者写等于 window.event也可以;
            var ord_x = _event.clientX;                       // 原始鼠标横纵坐标位置
            var ord_y = _event.clientY;                       // 原始鼠标横纵坐标位置
            var parent_left = $(this).parent().offset().left;
            var parent_top = $(this).parent().offset().top;

            $(this).bind('mousemove', function(e){             // mousemove事件
                var _new_event = e;                            // 或者写等于 window.event也可以;
                var new_x = _new_event.clientX;
                var new_y = _new_event.clientY;
                var x = parent_left + (new_x - ord_x);
                var y = parent_top + (new_y - ord_y);

                $(this).parent().css('left',x+'px');
                $(this).parent().css('top',y+'px');

            })
        }).mouseup(function(){                                 // mouseup事件
            $(this).unbind('mousemove');                       // 解除mousemove事件
        });
    })
</script>
</body>
</html>
实例:拖动面板

(3)scroll

当用户滚动(拖动元素旁边的滑块或滚动鼠标滚轮)指定的元素时,会发生 scroll 事件。scroll 事件适用于所有可滚动的元素和 window 对象(浏览器窗口)。

  • 监听元素的滚动事件

当元素里面内容的高度超出元素本身的高度,且此元素的 overflow 设为auto时,元素右侧会自动添加滚动条。可滚动查看到被隐藏的内容。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        div{
            height:500px;
            width:200px;
            background-color: yellow;
            overflow:auto;                  /*内容太多,超出本层是自动添加滚轮*/
        }
    </style>

</head>
<body>
<div id="dp">
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>
    <p>p</p>

</div>

<script src="jquery-3.2.1.js"></script>
<script>
    $("#dp").scroll(function(){               <!--scroll监听滚轮的滚动-->
        func1()
    });

    function func1(){
        console.log($('#dp').scrollTop());     /* 量化滚动的多少*/
    }
</script>
</body>
</html>
View Code
  • 监听窗口的滚动事件

当整个 document 文档的高度超出当前浏览器窗口本身的高度时,浏览器窗口右侧会自动添加滚动条。可滚动查看到被隐藏的内容。

$(window).scroll( function() { /* ...do something... */ } );

在应用滚动事件时,常涉及到的3个高度:

$(document).height()                // 文档高度
$(window).height()                  // 浏览器窗口高度
$('#dp').scrollTop()                // 滚动条滑动了多少
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="jquery-3.2.1.js"></script>
    <style>
        .menu{
            position:absolute;
            left:200px;
            top:48px;
            bottom:0;
            width:220px;
            border:1px solid red;
        }

        .menu a{
            display:block;
        }

        .fix{
            position:fixed;
            top: 0;
        }

        .active{
            color:white;
            background-color: #366db0;
        }


    </style>
</head>
<body style="margin: 0;">
    <div style="height: 48px;background-color: #303a40"></div>
    <div id="div2" class="menu">
        <a b="1">菜单一</a>
        <a b="2">菜单二</a>
        <a b="3">菜单三</a>
        <a b="4">菜单四</a>
    </div>
    <div id="content" style="position:absolute;left:420px;right:200px;top:48px;bottom:0;border:1px solid green;">
        <div id="div1" a="1" style="height:500px; background-color: rebeccapurple"></div>
        <div a="2" style="height:900px; background-color: #303a40"></div>
        <div a="3" style="height:1000px; background-color: #84a42b"></div>
        <div a="4" style="height:800px; background-color: #336699"></div>
    </div>


    <script>
        /* 监听窗口的滚动事件 */
        $(window).scroll(function(){
            /* 获取滚动了多少,即当前窗口中的内容相对窗口滚动条顶部的偏移 */
            var st=$(window).scrollTop();

            /* 设置窗口左侧菜单的样式 */
            if(st>48){
                /* 偏移大于48px时,对div2进行定位设置 */
                $('#div2').addClass('fix');
            }else{
                /* 偏移小于48px时,取消对div2的定位设置 */
                $('#div2').removeClass('fix');
                /* 偏移小于48px时,取消对div2的所有孩子的样式设置 */
                $('#div2').children().removeClass('active');
            }

            /* 窗口右侧内容区的滚动对左侧菜单样式的影响 */
            $("#content").children().each(function(){
                /* 每一个孩子的顶端距窗口(或者说最右侧窗口滚动条)顶端的,当前距离 */
                var winTop=$(this).offset().top-st;
                /* 每一个孩子的底端距窗口(或者说最右侧窗口滚动条)顶端的,当前距离 */
                var winBottom=winTop+$(this).height();
                /* 通过内容区孩子的展示情况,影响左侧菜单样式 */
                if (winTop<=0 && winBottom>0){
                    var a=$(this).attr("a");
                    $(".menu a[b='"+a+"']").addClass("active").siblings().removeClass("active"); /*注意传入变量的写法*/
                    return;                       /*这里return的作用是终止后续循环*/
                }
            });


            /* 当前文档的总高度 */
            docHeight=$(document).height();
            /* 当前窗口的总高度 */
            winHeight=$(window).height();
            /* 文档已经到最底部时,最后一个菜单,必须设置为激活样式*/
            if(st+winHeight==docHeight){
                $(".menu :last").addClass("active").siblings().removeClass("active");
            }
         })
    </script>
</body>
</html>
实例:滚动菜单

 

3、动画效果

(1)显示隐藏

$("p").hide(1000);                  // 用1000ms时间渐渐隐藏
$("p").show(1000);                  // 用1000ms时间渐渐显示
$("p").toggle();                    //用于切换被选元素的 hide() 与 show() 方法
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="jquery-3.2.1.js"></script>
    <script>
        $(document).ready(function(){
            $("#hide").click(function(){
                $("p").hide(1000);                     // 用1000ms时间渐渐隐藏
            });
            $("#show").click(function(){
                $("p").show(1000);
            });
            $("#toggle").click(function(){             //用于切换被选元素的 hide() 与 show() 方法。
                $("p").toggle();
            });
        });
    </script>
    <link type="text/css" rel="stylesheet" href="style.css">
</head>
<body>
    <p>hello</p>
    <button id="hide">隐藏</button>
    <button id="show">显示</button>
    <button id="toggle">隐藏/显示</button>
</body>
</html>
示例

(2)淡入淡出

$("#id1").fadeIn(1000);             // 用1000ms时间淡入
$("#id1").fadeOut(1000);            // 用1000ms时间淡出
$("#id1").fadeToggle(1000);         // 在淡入和淡出间切换
$("#id1").fadeTo(1000,0.4);         // 淡化到某一个透明度,第二参数是透明度
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="jquery-3.2.1.js"></script>
    <script>
    $(document).ready(function(){
        $("#in").click(function(){
           $("#id1").fadeIn(1000);
           $("#id2").fadeIn(1000);
           $("#id3").fadeIn(1000);
        });
        $("#out").click(function(){
           $("#id1").fadeOut(1000);
           $("#id2").fadeOut(1000);
           $("#id3").fadeOut(1000);
        });
        $("#toggle").click(function(){
           $("#id1").fadeToggle(1000);
           $("#id2").fadeToggle(1000);
           $("#id3").fadeToggle(1000);
        });
        $("#fadeto").click(function(){
           $("#id1").fadeTo(1000,0.4);   /* 第二参数为透明度 */
           $("#id2").fadeTo(1000,0.5);
           $("#id3").fadeTo(1000,0);
        });
    });
    </script>
</head>
<body>
      <button id="in">fadein</button>
      <button id="out">fadeout</button>
      <button id="toggle">fadetoggle</button>
      <button id="fadeto">fadeto</button>

      <div id="id1" style="display:none; width: 80px;height: 80px;background-color: blueviolet"></div>
      <div id="id2" style="display:none; width: 80px;height: 80px;background-color: orangered "></div>
      <div id="id3" style="display:none; width: 80px;height: 80px;background-color: darkgreen "></div>

</body>
</html>
示例

(3)滑入滑出

$("#content").slideDown(1000);      // 用1000ms时间滑出
$("#content").slideUp(1000);        // 用1000ms时间滑入
$("#content").slideToggle(1000);    // 在滑入滑出间切换
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="jquery-3.2.1.js"></script>
    <script>
        $(document).ready(function(){
             $("#flipshow").click(function(){
                  $("#content").slideDown(1000);
             });
             $("#fliphide").click(function(){
                  $("#content").slideUp(1000);
             });
             $("#toggle").click(function(){
                  $("#content").slideToggle(1000);
             })
        });
    </script>
    <style>
        #flipshow,#content,#fliphide,#toggle{
            padding: 5px;
            text-align: center;
            background-color: blueviolet;
            border:solid 1px red;
        }
        #content{
            padding: 50px;
            display: none;
        }
    </style>
</head>
<body>
    <div id="flipshow">出现</div>
    <div id="fliphide">隐藏</div>
    <div id="toggle">toggle</div>
    <div id="content">helloworld</div>
</body>
</html>
示例

(4)回调

$("p").hide(1000,function(){        // 回调:每一个动画执行完毕之后所能执行的函数方法
    alert('动画结束')
});
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="jquery-3.2.1.js"></script>
    <script>

    $(document).ready(function(){
        $("button").click(function(){
            $("p").hide(1000,function(){   <!--4 效果-回调:每一个动画执行完毕之后所能执行的函数方法或者所能做的一件事-->
                alert('动画结束')
            });
        })
    });
    </script>
</head>
<body>
  <button>隐藏</button>
  <p>helloworld helloworld helloworld</p>

</body>
</html>
示例

4、扩展机制

 通过extend自定义方法。

(1)类的层面写的扩展,必须通过类调用

$.extend({
    getmax:function(a, b){    // 通过键值对,定义方法
        return a>b?a:b;       // 三元运算:如果a>b成立返回a,否则返回b。三元指的>?:三个运算符
    }
});

alert($.getmax(5,8))

(2)实例层面写的方法,必须通过标签(即实例)调用

$.fn.extend({
    print:function(){
        console.log($(this).html());
    }
});

$("p").print();

 生产环境中常用的写法:

将扩展方法放在自执行函数里面。意义:放到私有域里面,避免与其他内容产生冲突

(function($){
    $.fn.extend({
        print:function(){
            console.log($(this).html());
        }
    });
})(jQuery);

  

<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta name="viewport" content="width=device-width">
    <meta http-equiv="X-UA-Compatible" content="IE=8">
    <title>购物商城</title>
    <style>

        *{
            margin: 0;
            padding: 0;
        }

        .hide{
            display:none;
        }

        .header-nav {
            height: 39px;
            background: #c9033b;
        }

        .header-nav .container .menuEvent {
            display: block;
            width: 100px;
            line-height: 39px;
            text-align: center;
            text-decoration: none;
            color: #fff;
            font-size: 15px;
            font-weight: bold;
            font-family: 微软雅黑;
        }

        .header-menu a{
            color:#656565;
        }

        .header-menu .menu-catagory{
            position: absolute;
            background-color: #fff;
            border-left:1px solid #fff;
            height: 316px;
            width: 230px;
            z-index: 4;
            float: left;
        }

        .header-menu .menu-catagory .catagory {
            border-left:4px solid #fff;
            height: 104px;
            border-bottom: solid 1px #eaeaea;
        }

        .header-menu .menu-catagory .catagory:hover {
            height: 102px;
            border-left:4px solid #c9033b;
            border-bottom: solid 1px #bcbcbc;
            border-top: solid 1px #bcbcbc;
        }

        .header-menu .menu-content .item{
            margin-left:230px;
            position:absolute;
            background-color:white;
            height:314px;
            width:500px;
            z-index:4;
            float:left;
            border: solid 1px #bcbcbc;
            border-left:0;
            box-shadow: 1px 1px 5px #999;
        }

    </style>
</head>
<body>

<div class="pg-header">

    <div class="header-nav">
        <div class="container">
            <a id="all_menu_catagory" href="#" class="menuEvent">
                <strong class="catName">全部商品分类</strong>
            </a>
        </div>
    </div>
    
    <div class="header-menu">
        <div class="container hide">
            <div id="nav_all_menu" class="menu-catagory">
                <div class="catagory" float-content="one">
                    <div class="title">家电</div>
                    <div class="body">
                        <a href="#">空调</a>
                    </div>
                </div>
                <div class="catagory" float-content="two">
                    <div class="title">床上用品</div>
                    <div class="body">
                        <a href="http://www.baidu.com">床单</a>
                    </div>
                </div>
                <div class="catagory" float-content="three">
                    <div class="title">水果</div>
                    <div class="body">
                        <a href="#">橘子</a>
                    </div>
                </div>
            </div>

            <div id="nav_all_content" class="menu-content">
                <div class="item hide" float-id="one">

                    <dl>
                        <dt><a href="#" class="red">厨房用品1</a></dt>
                        <dd>
                            <span>| <a href="#" target="_blank" title="勺子">勺子</a> </span>
                        </dd>
                    </dl>
                    <dl>
                        <dt><a href="#" class="red">厨房用品2</a></dt>
                        <dd>
                            <span>| <a href="#" target="_blank" title="菜刀">菜刀</a> </span>

                        </dd>
                    </dl>
                    <dl>
                        <dt><a href="#" class="red">厨房用品3</a></dt>
                        <dd>
                            <span>| <a href="#">菜板</a> </span>
                        </dd>
                    </dl>
                    <dl>
                        <dt><a href="#" class="red">厨房用品4</a></dt>
                        <dd>
                            <span>| <a href="#" target="_blank" title="碗">碗</a> </span>

                        </dd>
                    </dl>

                </div>
                <div class="item hide" float-id="two">
                    <dl>
                        <dt><a href="#" class="red">厨房用品</a></dt>
                        <dd>
                            <span>| <a href="#" target="_blank" title="">角阀</a> </span>

                        </dd>
                    </dl>
                    <dl>
                        <dt><a href="#" class="red">厨房用品</a></dt>
                        <dd>
                            <span>| <a href="#" target="_blank" title="角阀">角阀</a> </span>

                        </dd>
                    </dl>
                    <dl>
                        <dt><a href="#" class="red">厨房用品</a></dt>
                        <dd>
                            <span>| <a href="#" target="_blank" title="角阀">角阀</a> </span>

                        </dd>
                    </dl>

                </div>
                <div class="item hide" float-id="three">
                    <dl>
                        <dt><a href="#" class="red">厨房用品3</a></dt>
                        <dd>
                            <span>| <a href="#" target="_blank" title="角阀">角阀3</a> </span>

                        </dd>
                    </dl>
                    <dl>
                        <dt><a href="#" class="red">厨房用品3</a></dt>
                        <dd>
                            <span>| <a href="http://www.meilele.com/category-jiaofa/" target="_blank" title="角阀">角阀3</a> </span>

                        </dd>
                    </dl>
                </div>
            </div>
        </div>
    </div>

</div>


<script src="jquery-3.2.1.js"></script>

<script type="text/javascript">
    $(document).ready(function () {
        Change_Menu('#all_menu_catagory','#nav_all_menu', '#nav_all_content');
    });

    function Change_Menu(all_menu_catagory,menu, content) {
        $all_menu_catagory = $(all_menu_catagory);
        $menu = $(menu);
        $content = $(content);

        $all_menu_catagory.bind("mouseover", function () {
            $menu.parent().removeClass('hide');
        });
        $all_menu_catagory.bind("mouseout", function () {
            $menu.parent().addClass('hide');
        });

        $menu.children().bind("mouseover", function () {
            $menu.parent().removeClass('hide');
            $item_content = $content.find('div[float-id="' + $(this).attr("float-content") + '"]');
            $item_content.removeClass('hide').siblings().addClass('hide');
        });
        $menu.bind("mouseout", function () {
            $content.children().addClass('hide');
            $menu.parent().addClass('hide');
        });

        $content.children().bind("mouseover", function () {
            $menu.parent().removeClass('hide');
            $(this).removeClass('hide');
        });
        $content.children().bind("mouseout", function () {
            $(this).addClass('hide');
            $menu.parent().addClass('hide');
        });
    }
</script>
</body>
</html>
实例:商城菜单
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        *{
            margin: 0;                /* 去掉浏览器的自带的margin */
            padding: 0;               /* 去掉浏览器的自带的padding */
        }

        ul{
            list-style: none;         /* 去掉列表项前的小圆点 */
        }

        .outer{
            margin: 50px auto;        /* 盒子在body中margin为:上下50px, 左右居中 */
            width: 790px;
            height: 340px;
            position: relative;
        }

        .img li{
            position: absolute;
            top: 0;
            left: 0;
        }

        .num{
            position: absolute;
            bottom: 10px;
            width: 100%;              /* 因为 .num已经脱离文档流,不设定宽度默认为自身宽度 */
            text-align: center;
        }

        .num li{
            display: inline-block;
            height: 20px;
            width: 20px;
            background-color: gray;
            color: white;
            text-align: center;       /* 文本水平居中 */
            line-height: 20px;        /* 文本垂直居中 */
            border-radius: 50%;
            margin: 0 5px;
        }

        .btn{
            position: absolute;
            top: 50%;                 /* 是将 .btn 左上顶点放在外层盒子垂直方向50%的位置 */
            margin-top: -30px;
            height: 60px;
            width: 30px;
            background-color: gray;
            color: white;
            text-align: center;
            line-height:60px;
            opacity: 0.8;
            display: none;
        }

        .outer:hover .btn{
            display: block;
        }

        .left_btn{
            left:0;
        }

        .right_btn{
            right:0;
        }

        .current{
            background-color: red!important;
        }

    </style>
</head>
<body>
<div class="outer">
    <ul class="img">
        <li><a><img src="img/01.jpg"></a></li>
        <li><a><img src="img/02.jpg"></a></li>
        <li><a><img src="img/03.jpg"></a></li>
        <li><a><img src="img/04.jpg"></a></li>
    </ul>

    <ul class="num">
        <li class="current">1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
    </ul>

    <div class="left_btn btn"> < </div>
    <div class="right_btn btn"> > </div>
</div>

<script src="jquery-3.2.1.min.js"></script>
<script>
    // 自动轮播
    var time=setInterval(move, 3000);     /* 定时器,每隔1.5s执行move */
    i=0;
    function move(){
        if (i==3){
            i=-1
        }
        i=i+1;
        $(".num li").eq(i).addClass("current").siblings().removeClass("current");
        $(".img li").eq(i).stop().fadeIn(1000).siblings().stop().fadeOut(1000);
    }
    $(".outer").hover(function(){      /* hover后可加两个函数,第一个函数鼠标移入时执行,第二步函数鼠标移除时执行 */
        clearInterval(time);               /* 鼠标移入时,停止move */
    },function(){
        time=setInterval(move, 3000);    /* 鼠标移出时,恢复move */
    });


    // 手动轮播——数字标控制
    $(".num li").mouseover(function(){
        $(this).addClass("current").siblings().removeClass("current");          /* 操作数字标变色 */
        var index=$(this).index();                                              /* 获取当前li再ul中的索引 */
        i=index;                                                                /* 手动轮播打断自动轮播时,给自动重设i */
        $(".img li").eq(index).show().fadeIn(1000).siblings().fadeOut(1000);
    });


    // 手动轮播——左右按钮控制
    $(".right_btn").click(function(){
        move()
    });

    $(".left_btn").click(function(){
        move()  /*自己写往左的函数moveL  略*/
    })
</script>
</body>
</html>
轮播图

 

 

参考:

http://www.cnblogs.com/yuanchenqi/articles/5663118.html

posted @ 2017-09-14 11:26  seaidler  阅读(156)  评论(0)    收藏  举报