第四篇 前端学习之JQuery基础

一 jQuery是什么?  

jQuery就是一个JavaScript的库。

<1> jQuery由美国人John Resig创建,至今已吸引了来自世界各地的众多 javascript高手加入其team。

<2>jQuery是继prototype之后又一个优秀的Javascript框架。其宗旨是——WRITE LESS,DO MORE!

<3>它是轻量级的js库(压缩后只有21k) ,这是其它的js库所不及的,它兼容CSS3,还兼容各种浏览器(IE6.0+, FF 1.5+, Safari 2.0+, Opera 9.0+);

<4>jQuery是一个快速的,简洁的javaScript库,使用户能更方便地处理HTMLdocuments、events、实现动画效果,并且方便地为网站提供AJAX交互。

  AJAX:实现前端向后端发送数据——非常重要

<5>jQuery还有一个比较大的优势是,它的文档说明很全,而且各种应用也说得很详细,同时还有许多成熟的插件可供选择。

参考JQuery文档:http://jquery.cuishifeng.cn/

二 什么是jQuery对象?

 jQuery 对象就是通过jQuery包装DOM对象后产生的对象。

 jQuery 对象是 jQuery 独有的

 如果一个对象是 jQuery 对象那么它就可以使用 jQuery 里的方法: $(“#test”).html();

$("#test").html()    
       //意思是指:获取ID为test的元素内的html代码。其中html()是jQuery里的方法 

       // 这段代码等同于用DOM实现代码: document.getElementById(" test ").innerHTML; 

       //虽然jQuery对象是包装DOM对象后产生的,但是jQuery无法使用DOM对象的任何方法,同理DOM对象也不能使用jQuery里的方法.乱使用会报错

       //约定:如果获取的是 jQuery 对象, 那么要在变量前面加上$. 

var $variable = jQuery 对象    定义jquery对象时,变量前就加个 $符号,明确告诉人家这是jQuery对象
var variable = DOM 对象

$variable[0]:jquery对象转为dom对象      $("#msg").html(); $("#msg")[0].innerHTML

jquery的基础语法:$(selector).action()

幸福生活的开始从导入jQuery库开始

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div>hello</div>

    <!--要使用JQuery,必选先通过script引入jQueryku才行-->
    <script src="jquery-3.3.1.js"></script>
    <script>
        // $符号:就代表JQuery对象,里面有无穷尽的语法,全在$里
        // 找到div标签: $("div")
        // 对div标签进行样式设置:$("div").css("color","red");
        
        $("div").css("color","red");
        // 当然也可以用jQuery,但是用$符号更简单
        jQuery("div").css("color","red");

    </script>
</body>
</html>

 

三 寻找元素(选择器和筛选器) 

3.1   选择器

3.1.1 基本选择器      

$("*"): 对所有标签进行操作
$("#id"):通过id找标签
$(".class") :通过class属性找
$("element") :通过标签名字找
$(".class,p,div"):可以一次找多个元素
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div>hello</div>
    <p id="p1">ppp</p>
    <a href="">click</a>

    <div class="outer">
        outers
        <div class="inner">inner</div>
    </div>

    <div class="outer">helllllllo</div>
    <!--要使用JQuery,必选先通过script引入jQueryku才行-->
    <script src="jquery-3.3.1.js"></script>
    <script>

        // $("*").css("color","red");
        // $("#p1").css("color","blue");
        // $(".inner").css("color","green");
        // $(".outer").css("color","brown"); // jQuery自己做了遍历
        // $(".inner,p,div").css("color","red");
        $("p").css("color","red"); // 通过element找,即通过标签的名字去找



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

3.1.2 层级选择器:处理层级嵌套, 后代(儿子)选择器      

$(".outer div")  :后代选择器
$(".outer>div") :子代选择器
$(".outer+div") :向下找紧挨着的兄弟标签
$(".outer~div") :向下找兄弟标签,可以不紧挨着outer的,也能找到
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div>hello</div>
    <p id="p1">ppp</p>
    <a href="">click</a>

    <div class="outer">
        outers
        <div class="inner">
            inner
            <p>innerP</p>
        </div>
        <p>alex</p>
    </div>
    <div>lalal</div>
    <p>隔着一个,向下也能找到兄弟标签</p>
    <p>向下紧挨着的兄弟标签</p>

    <!--<div class="outer">helllllllo</div>-->
    <!--要使用JQuery,必选先通过script引入jQueryku才行-->
    <script src="jquery-3.3.1.js"></script>
    <script>
        // 后代选择器:
        // 找到class属性值为outer的下面的所有 p 标签,不管是子代,孙子代,还是重孙子代都找到
        $(".outer p").css("color","red");
        // 子代选择器:
        // 找到找到class属性值为outer的下面的所有 p 标签且找到的p标签都是outer的儿子代
        $(".outer > p").css("color","red");
        // 向下紧挨着的兄弟标签
        // $(".outer + p").css("color","blue");
        // 向下找兄弟标签(同级的),可以不紧挨着
        $(".outer ~ p").css("color","green");

    </script>
</body>
</html>
层级选择器示例

3.1.3 基本筛选器      

选择出后再过滤一遍的意思

$("li:first")  
$("li:eq(2)")  
$("li:even") 
$("li:gt(1)")
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<ul>
    <li>111</li>
    <li>222</li>
    <li>333</li>
    <li>444</li>
    <li>555</li>
    <li>666</li>
    <li>777</li>
    <li>888</li>
</ul>

<script src="jquery-3.3.1.js"></script>
<script>
    console.log($("li"));
   // 对第一个li标签操作
    $("li:first").css("color","red");
    // 对最后一个li标签操作
    $("li:last").css("color","red");
//    对其他第n个操作
    $("li:eq(1)").css("color","blue");
    // 控制偶数行,从0开始的
    $("li:even").css("color","green");
    //控制奇数行
    $("li:odd").css("color","brown");
    //筛选出的是大于索引为3的标签,不包含索引3
    $("li:gt(3)").css("color","brown");
    //筛选出的是小于索引为3的标签,不包含索引3
    $("li:lt(3)").css("color","red");


</script>
</body>
</html>
基本筛选器

3.1.4 属性选择器    

通过标签的属性来查找属性。自己也可以添加属性

$('[id="div1"]')   
$('[alex="sb"][id]') 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div>hello</div>
    <p id="p1" alex="bbb">ppp属性选择器</p>
    <p id="p2" alex="bbb">ppp属性选择器</p>
    <p id="p3" alex="bbb">ppp属性选择器</p>
    <a href="">click</a>

    <!--<div class="outer">helllllllo</div>-->
    <!--要使用JQuery,必选先通过script引入jQueryku才行-->
    <script src="jquery-3.3.1.js"></script>
    <script>
        // 通过属性选择器查找
        $("[alex='bbb']").css("color","red");
    //    如果有多个属性标签属性名相同,可以多层选择
        $("[alex='bbb'][id='p2']").css("color","blue");
    </script>
</body>
</html>
属性选择器

3.1.5 表单选择器     

$("[type='text']")----->$(":text")         注意 :只适用于input标签
$("input:checked")
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<input type="text">
<input type="checkbox">
<input type="submit">

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

    // $("[type='text']").css("width","200px");
    //只有input表单选择器才可以通过冒号的形式筛选
    $(":text").css("width","400px");

</script>
</body>
</html>
表单选择器

 

实例之左侧菜单

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>left_menu</title>

    <style>
          .menu{
              height: 500px;
              width: 30%;
              background-color: gainsboro;
              float: left;
          }
          .content{
              height: 500px;
              width: 70%;
              background-color: rebeccapurple;
              float: left;
          }
         .title{
             line-height: 50px;
             background-color: #425a66;
             color: forestgreen;}


         .hide{
             display: none;
         }


    </style>
</head>
<body>

<div class="outer">
    <div class="menu">
        <div class="item">
            <div class="title">菜单一</div>
            <div class="con">
                <div>111</div>
                <div>111</div>
                <div>111</div>
            </div>
        </div>
        <div class="item">
            <div class="title">菜单二</div>
            <div class="con hide">
                <div>111</div>
                <div>111</div>
                <div>111</div>
            </div>
        </div>
        <div class="item">
            <div class="title">菜单三</div>
            <div class="con hide">
                <div>111</div>
                <div>111</div>
                <div>111</div>
            </div>
        </div>

    </div>
    <div class="content"></div>

</div>
<script src="jquery-3.2.1.js"></script>
<script>
           $(".item .title").click(function () {
                $(this).next().removeClass("hide").parent().siblings().children(".con").addClass("hide");

//                $(this).next().removeClass("hide");
//                $(this).parent().siblings().children(".con").addClass("hide");
           })
</script>


</body>
</html>
View Code

实例之tab切换

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>tab</title>
    <script>
           function tab(self){
               var index=$(self).attr("xxx");
               $("#"+index).removeClass("hide").siblings().addClass("hide");
               $(self).addClass("current").siblings().removeClass("current");

           }
    </script>
    <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>
              <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>
</body>
</html>
View Code

3.2 筛选器

 3.2.1  过滤筛选器    

与3.1.3基本筛选器实现的功能一样,但是推荐以后都用过滤筛选器这种方式实现。应该筛选条件是写在外面的,更灵活

$("li").eq(2)  
$("li").first()
$("ul li").hasclass("test")
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<ul>
    <li>111</li>
    <li>222</li>
    <li>333</li>
    <li>444</li>
    <li>555</li>
    <li>666</li>
    <li>777</li>
    <li>888</li>
</ul>

<input type="text">
<input type="checkbox">
<input type="submit">

<script src="jquery-3.3.1.js"></script>
<script>
    $("li").eq(2).css("color","red");
    $("li").first().css("color","red");
    $("li").last().css("color","red");



</script>
</body>
</html>
过滤筛选器示例
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <li class="title">ll</li>

    <script src="jquery-3.3.1.js"></script>
    <script>
        // 查询某标签是否具有某属性
       console.log($("li").hasClass("title2"));
    </script>
</body>
</html>
查询某标签是否具有某属性

3.2.2  查找筛选器(基本四组)

非常重要,没有项目不用到这种筛选方法。

1. 找子代
$("div").children(".test")
$("div").find(".test")

2.找下一个 $(
".test").next()
$(".test").nextAll()
$(".test").nextUntil()

3. 找上一个,完全与next组对应的 $(
"div").prev()
$("div").prevAll()
$("div").prevUntil()

4. $(
".test").parent()
$(".test").parents()
$(".test").parentUntil()
$(
"div").siblings()
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>


<p id="p1" alex="sb">pppp</p>
<p id="p2" alex2="sb">pppp2</p>

<div class="outer"> outer
    <div class="inner">
        inner
        <p>孙子p标签</p>
    </div>
    <p>儿子p标签</p>
</div>
<div class="outer2">Yuan</div>
<p>先走一步</p>


<ul>
    <li>111</li>
    <li class="begin">222</li>
    <li>333</li>
    <li>444</li>
    <li>555</li>
    <li>666</li>
    <li id="end">777</li>
    <li>888</li>
</ul>

<input type="text">
<input type="checkbox">
<input type="submit">

<script src="jquery-3.3.1.js"></script>
<script>
    // 1. 根据一个已知的标签找到它的子代标签
    // 只找子标签
    $(".outer").children("p").css("color","red");
    // 找到.outer下的所有p标签
    $(".outer").find("p").css("color","red");

//    2.next组查找
//    找到索引为2的li标签的下一个标签
    $("li").eq(2).next().css("color","red");
//    找到索引为2的li标签后面的所有标签
    $("li").eq(2).nextAll().css("color","red");
//    从索引为2的li标签开始,一直找到 id=end的li标签,左开右开区间)
    $("li").eq(2).nextUntil("#end").css("color","red");

//    3.prev组查找:向上找
//    找到索引为2的li标签的上一个标签
    $("li").eq(2).prev().css("color","red");

    //    找到索引为2的li标签上面的所有标签
    $("li").eq(2).prevAll().css("color","red");

    //    从索引为5的li标签开始,一直找到 id=end的li标签,左开右开区间)
    $("li").eq(5).prevUntil(".begin").css("color","red");

//    4. parent 组查找
    $(".outer .inner p").parent().css("color","red");
    $(".outer .inner p").parents().css("color","red");


    // 常用
    $(".outer .inner p").parentsUntil("body").css("color","red");

// siblings 用的最多的. 找兄弟标签,上下的全部兄弟标签都找出来,除了.outer
   $(".outer").siblings().css("color", "red");
    
</script>
</body>
</html>

示例
示例

 

四 操作元素(属性,css,文档处理)

4.1 属性操作

--------------------------属性: attr 和 prop的使用方法和作用是完全一样的。区别只在于,attr既能处理固有属性,又能处理自定义属性,而prop只能处理固有属性
$("").attr(); -->常用的属性标签:既可以取到属性值,也可以给属性设置值;既可以处理固有属性,也可以处理自定义属性,推荐attr只用来处理自定义属性
$("").removeAttr();
$("").prop();-->获取属性,如果存在返回true,如果不存在返回false,用于判断使用;只能处理固有的属性,所以推荐对所有固有属性,都用prop处理
$("").removeProp();
--------------------------CSS类
$("").addClass(class|fn)   --> 见左侧菜单实例
$("").removeClass([class|fn])-->见左侧菜单实例
--------------------------HTML代码/文本/
要处理的标签内部如果是html,就得用html()处理;
要处理的标签内部如果是text,就得用text()处理; $(
"").html([val|fn]) --> 用html,可以区别出里面是文本还是标签,然后进行替换 $("").text([val|fn]) --> text,()里的内容全部当做纯文本来处理,去替换 $("").val([val|fn|arr])--> val不能随便用,只能处理固有属性:input,option,select,表单类都有value属; 可以获取值也可以替换原来的值
---------------------------
$("").css("color","red")

 需求:

 常见的web项目左侧有个菜单,点击某个菜单,该菜单下面的子菜单显示,其他菜单隐藏

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!--2. 再处理布局-->
    <style>
        .outer{
            height: 1000px;
            width: 100%;
            background-color: gray;
        }

        .menu{
            float: left;
            background-color: rebeccapurple;
            width: 30%;
            height: 500px;
        }
        .title{
            background-color: lightgreen;
        }

        .hide{
            display: none;
        }
    </style>
</head>
<body>

    <!--步骤:1. 先写html-->
    <div class="outer">
        <div class="menu">
            <div class="item">
                <div class="title" onclick="show(this)">菜单一</div>
                <!--默认进来菜单一不是折叠的,可以去掉hide属性,如果是折叠的,就像下面那样写上hide-->
                <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 class="content"></div>
    </div>

    <!--3.JQuery实现功能-->
    // 先引入Jquery
    <script src="jquery-3.3.1.js"></script>
    <script>
        // this表示找到当前点击的元素,function函数里用self接
        function show(self) {
            // 1)实现点哪个菜单,该菜单下面的子菜单展示出来;
            // 用到JQuery的属性操作知识了,找到当前点击的菜单,移除它的hide属性
            $(self).next().removeClass("hide");
            // 2)同时其他菜单的子菜单全部折叠
            // 先找到当前点击菜单的父元素,再通过siblings找到父元素的所有兄弟元素,然后找到所有兄弟元素下面的子元素
            // 里的 con属性,为其增加 hide属性
            // 如果没有hide属性,就增加,如果已经有hide属性就不增加
            $(self).parent().siblings().children(".con").addClass("hide");
        }
    </script>
</body>
</html>
左侧菜单显示折叠实例:addClass, removeClass
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div class="div1" con="c1"></div>
    <input type="checkbox" checked="checked"> 是否可见1
    <input type="checkbox" > 是否可见2
    <script src="jquery-3.3.1.js"></script>
    <script>

        // 1. attr()属性
        // attr属性,取出con属性的值
        console.log($("div").attr("con"));
        // attr属性,给con属性设置值;本来没有con1属性,还可以新增这个属性并设置属性值
        console.log($("div").attr("con","c2"));
        console.log($("div").attr("con1","c3"));

    //    2.取input标签的属性,看prop和attr的区别
        console.log($(":checkbox:first").attr("checked"));
        console.log($(":checkbox:last").attr("checked"));

        // prop返回的是属性的值,存在是true,不存在是false,方便用于判断
        // prop主要用来处理固有属性,比如上面自定义的con属性找不到的;
        // 如果是自己定义的属性,都用attr,更好的区分固有属性和自定义属性
        console.log($(":checkbox:first").prop("checked")); // attr和prop括号内都是些的属性名称,而不是具体的属性值
        console.log($(":checkbox:last").prop("checked"));
        // 自定义属性,找不到的
        console.log($(":checkbox:last").prop("con"));
        
    </script>
</body>
</html>
attr和prop的区别
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/html">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div class="div1" con="c1"></div>
    <input type="checkbox" checked="checked"> 是否可见1
    <input type="checkbox" > 是否可见2  </br>
    <input type="text" value="请输入你的大名">
    <div value = "234">测试value是否可以检测到</div>

    <div id="id1">
        uuuuu
        <p>ppppp</p>
    </div>
    <script src="jquery-3.3.1.js"></script>
    <script>
        // html()把标签里面的所有内容都取出来了,有其他标签也会取出来
        console.log($("#id1").html());
        // text()只会把下面的文本内容取出来,带标签的文本,也只会把文本取出来
        console.log($("#id1").text());
        // html()里面如果加了内容,会把下面原理所有的内容都会用新内容替换,相当于重新设值了
        console.log($("#id1").html("<h1>Ma Ge</h1>>"));
        console.log($("#id1").html("用文本替换"));

        // 如果是text(),就会把text里面的所有内容都当做纯文本来处理的
        // console.log($("#id1").text("<h1>Ma Ge</h1>>"));


    //    val不能随便用,只能处理固有属性:input,option,select,表单类都有value属性
        console.log($(":text").val());
        // 替换掉原来的值
        console.log($(":text").val("把你的大名换掉"));

        console.log($(":text").next().val());  // div本身没有value属性,所以取不到

    //    css 修改样式
    //    css都是一个个键值对,第一个参数是属性,第二个参数是值
        $("div").css("color","red");
    //    如果想设置多个样式可以用字典的方式做
        $("div").css({"color":"red","background-color":"green"});

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

jQuery循环

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <p>哦哦哦哦哦</p>
    <p>哦哦哦哦哦</p>
    <p>哦哦哦哦哦</p>
    <p>哦哦哦哦哦</p>
    <p>哦哦哦哦哦</p>

    <script src="jquery-3.3.1.js"></script>
    <script>
        arr = [11,22,33,44,55];

        //jQuery的循环方式1

        // $.each(obj:遍历对象; callback:就是函数)
        // function(x,y):两个参数,x:表示索引,y:表示索引对应的值
        $.each(arr,function (x,y) {
            console.log(x);
            console.log(y);
        });


        //jQuery的循环方式二,也是最常用的方式
        // 原理:
        // 1. 通常都是先拿到一个要遍历的标签对象集合,$("p"):即先找到要遍历的标签集合
        // 2. 然后对该集合里的标签进行遍历: .each(function(){}),这个each里就只有一个参数了,直接写function就行
        // 因为要遍历的对象是$("p")已经在前面了,each就是对它进行遍历的,所有只有一个参数

        //.each其实就已经对拿到的标签集合进行了处理,所以接下来关键的就是如何表示每一个标签,如何对遍历到的每个标签进行处理
        // 答案就是强大的this, $(this)就表示遍历到的标签集合里你当前要操作的标签;
        $("p").each(function () {
            // $(this) 就是用来表示集合$("p")里每一个标签,
            console.log($(this))  //$(this) 就代表当前的标签对象
            $(this).html("<h1>把哦哦哦哦哦改成嘎嘎嘎嘎嘎</h1>")
        })

        // JQuery和js可以混搭着用
        // for(var i = 0; i<arr.length;i++){
        //     $("p").eq(i).html(arr[i])
        // }

    </script>
</body>
</html>
jQuery的两种循环方式
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <button onclick="selectAll()">全选</button>
    <button onclick="reverse()">反选</button>
    <button onclick="cancle()">取消</button>

    <table border="1px">
        <tr >
            <td><input type="checkbox"></td>
            <td>111</td>
            <td>111</td>
            <td>111</td>
        </tr>

        <tr >
            <td><input type="checkbox"></td>
            <td>222</td>
            <td>222</td>
            <td>222</td>
        </tr>

        <tr >
            <td><input type="checkbox"></td>
            <td>333</td>
            <td>333</td>
            <td>333</td>
        </tr>
    </table>

    <script src="jquery-3.3.1.js"></script>
    <script>
        // 还是要先绑定一个函数,这个绑定方式还是按照js的绑定方式走的

        // 全选
        function selectAll() {
            // 在函数内部用jQuery进行遍历,然后把checked属性改为true
            $(":checkbox").each(function () {
                $(this).prop("checked",true)
            })
        }

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

            })

        }

        // 取消
        function cancle() {
            $(":checkbox").each(function () {
                $(this).prop("checked",false)
            })

        }
    </script>

</body>
</html>
jQuery之正反选实例

 模态:

就是执行一个操作,弹出一个透明页遮挡,让透明页底部的元素不可操作,透明页上面的元素可以操作

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .content{
            height: 1800px;
            background-color: antiquewhite;
        }

        .shade{
            position: fixed;
            /*占满屏,设置下面四个参数为0*/
            top:0;
            left:0;
            right: 0;
            bottom:0;
            background-color: gray;
            opacity: 0.7; /*透明度*/
        }

        .model{
            width:200px;
            height: 200px;
            background-color: bisque;
            border: #FF0000;
            /*居中*/
            position: absolute;
            top:50%;
            left: 50%;
            margin-top: -100px;
            margin-left: -100px;

        }

        .hide{
            display: none;
        }
    </style>
</head>
<body>

    <!-- 第一层:正常显示的网页内容-->
    <div class="content">
        <button onclick="show(this)">show</button>
    </div>

    <!--第二层:遮挡层:是有透明度的,且固定住不可让content内容再上下滑动了-->
    <div class="shade hide"></div>

    <!--第三层:点击show后显示在最上面的对话框-->
    <div class="model hide">
        <button onclick="cancle(this)">取消</button>
    </div>

    <script src="jquery-3.3.1.js"></script>
    <script>
        function show(self) {
            $(self).parent().siblings().removeClass("hide")
        }

        function cancle(self) {
            // 方式1:链式寻找法操作
            $(self).parent().addClass("hide").prev().addClass("hide");
            
            // 方式2:先找到当前元素的父级,再找到父级的父级,然后父级下面的子级里有shade属性的标签,执行操作
            $(self).parent().parent().children(".models,.shade").addClass("hide")


        }

    </script>

</body>
</html>
模态实例

4.2 文档处理

用于处理节点的增删改查

//创建一个标签对象
    $("<p>")


//内部插入  -- 插入的对象变成了儿子
   
  append是加到当前标签下面 $("").append(content|fn) ----->$("p").append("<b>Hello</b>"); 就是把append里的内容添加到前面的对象($("p"))里面去,= 给前面的对象加了个儿子 $("").appendTo(content) ----->$("p").appendTo("div"); 与append功能完全一样,只是写法不同,按正常顺序往下写的;将$("p")追加到"div"的下面 prepend是加到当前标签的上面
   $(
"").prepend(content|fn) ----->$("p").prepend("<b>Hello</b>");将对象添加到$("p")的前面; $("").prependTo(content) ----->$("p").prependTo("#foo"); //外部插入 -- 插入的对象变成了兄弟, 原理类似 上面的内部插入 $("").after(content|fn) ----->$("p").after("<b>Hello</b>"); $("").before(content|fn) ----->$("p").before("<b>Hello</b>"); $("").insertAfter(content) ----->$("p").insertAfter("#foo"); $("").insertBefore(content) ----->$("p").insertBefore("#foo"); //替换 $("").replaceWith(content|fn) ----->$("p").replaceWith("<b>Paragraph. </b>"); //删除 $("").empty() $("").remove([expr]) //复制 $("").clone([Even[,deepEven]])
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div class="c1">
        <p>P级父标签</p>
    </div>

    <button class="b1">add</button>
    <script src="jquery-3.3.1.js"></script>
    <script>

        // append 内部插入 ---插入到下面

        // 点击add 按钮,给p标签下面添加一个 h1标签
        // 先找到button标签,给绑定一个click事件,然后给click事件一个函数,执行某功能
        $("button").click(function () {
            var $ele = $("<h1></h1>");   // 定义一个jquery变量,令该变量是一个h1标签;通变量写活了
            $ele.html("Hello World").css("color","red"); // 给该标签对象赋值

            $(".c1").append($ele);  // 将$els对象添加到 p级标签的下面

               // appendTo :将要添加的对象$ele添加到".c1"的下面,按顺序写,更好看懂
        // 实现的功能与append是完全一样的,只是写法不同
            $ele.appendTo(".c1");
        });


        // prepend 内部插入--插入到上面
        
        // 点击add 按钮,给p标签下面添加一个 h1标签
        // 先找到button标签,给绑定一个click事件,然后给click事件一个函数,执行某功能
        $(".b1").click(function () {
            var $ele1 = $("<h1></h1>");   // 定义一个jquery变量,令该变量是一个h1标签;通变量写活了
            $ele1.html("加到当前标签的上面").css("color","green"); // 给该标签对象赋值

            $(".c1").prepend($ele1);  // 将$els对象添加到 p级标签的下面

            $ele1.prependTo(".c1");
        });

        // 第二种方式,直接append,只不过写死了
        $(".c1").append("<h2>直接添加h2标签</h2>").css("color","green");

    </script>
</body>
</html>
内部插入示例append, prepend
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div class="c1">
        <p>P级父标签</p>
    </div>

    <button class="b1">add</button>
    <script src="jquery-3.3.1.js"></script>
    <script>

        // after 外部插入 ---插入到当前对象的下面,变成了二弟

        $("button").click(function () {
            var $ele = $("<h1></h1>");
            $ele.html("插入到当前对象的下面,变成了二弟").css("color","red");
            // 插入方式1
            $(".c1").after($ele);
            // 插入方式2
            // $ele.insertAfter(".c1");
        });


        // before 外部插入--插入到当前对象的上面,变成了大哥

        $(".b1").click(function () {
            var $ele1 = $("<h1></h1>");
            $ele1.html("插入到当前对象的上面,变成了大哥").css("color","green");
            // $(".c1").before($ele1);

            $ele1.insertBefore(".c1");
        });



    </script>
</body>
</html>
外部插入before,after
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div class="c1">
        <p>P级父标签</p>
    </div>

    <button class="b1">add</button>
    <script src="jquery-3.3.1.js"></script>
    <script>

        $(".b1").click(function () {
            var $ele1 = $("<h1></h1>");
            $ele1.html("替换掉P标签").css("color","green");
            $(".c1").replaceWith($ele1);
        });

    </script>
</body>
</html>
替换:replaceWith
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div class="c1">
        <p>P级父标签</p>
        <h1>h1能清空吗</h1>
    </div>

    <button class="b1">删除</button>
    <script src="jquery-3.3.1.js"></script>
    <script>
        
        $(".b1").click(function () {
            // empty:h1这个当前标签还在,只是下面的p标签没了
            $(".c1 h1").empty();

            // remove:c1这个当前标签也被删除了
            $(".c1").remove();
        });

    </script>
</body>
</html>
删除和清空:empty和remove
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div class="c1">
        <p>P级父标签</p>
        <h1>h1能清空吗</h1>
    </div>

    <button class="b1">复制</button>
    <script src="jquery-3.3.1.js"></script>
    <script>

        $(".b1").click(function () {
            $(".c1").clone().insertAfter(".c1")
        });

    </script>
</body>
</html>
复制:clone

但是,这个clone有个问题,执行添加多次,是成倍的复制的,下面的示例来解决这个问题

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <div class="outer">
        <div class="item">
            <button onclick="clone_obj(this)"> + </button>
            <input type="text">
        </div>
    </div>


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

        function conle_obj(self) {
            // 定义个变量,通过this可以找到本标签,然后找到本标签的父级item,复制
            var $conle_object = $(self).parent().clone();
            // 然后将复制的标签插入到.outer的下面
            $conle_object.insertAfter(".outer");
        };


    </script>
</body>
</html>
解决成倍复制的问题

新需求:让新复制的变成减号,点击减号可以删除标签

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <div class="outer">
        <div class="item">
            <button onclick="clone_obj(this)"> + </button>
            <input type="text">
        </div>
    </div>


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

        function clone_obj(self) {
            // 1.定义个变量,通过this可以找到本标签,然后找到本标签的父级item,复制
            var $conle_object = $(self).parent().clone();

            // 2. children("button").html("-")是找到子标签然后改成 -
            // attr("onclick","remove_obj(this)") 是添加一个onclick点击属性,属性名remove_obj(this)
            $conle_object.children("button").html("-").attr("onclick","remove_obj(this)");

            // 3. 然后再把该对象添加到.outer下面
            $conle_object.appendTo(".outer");
        };

        // 4.点击减号的时候可以删除
        function remove_obj(self){
            $(self).parent().remove()

        }
    </script>
</body>
</html>
可以复制,也可以remove

4.3 css操作

CSS
        $("").css(name|pro|[,val|fn])
    位置
        $("").offset([coordinates]):标签相当于视口(当前窗口)的偏移量
        $("").position():相对于已经定位了的父标签的偏移量
$(
"").scrollTop([val]):scrollTop:表示举例顶部的距离 $("").scrollLeft([val]) 尺寸 $("").height([val|fn]):拿到的就是内容的高度,还可以改值,比如加上参数:height("300px"),高度就变成了300px了 $("").width([val|fn]):拿到的是内容的宽度 $("").innerHeight():拿到的是包括了padding,没包括boder的 $("").innerWidth() $("").outerHeight([options]):拿到的是包括了padding和boder的;如果再加个options 为 true的参数,就会包括margin了 $("").outerWidth([options])
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <style>
        /*  将 body的边距设置位0 */
        body{
            margin: 0px;
            padding: 0px;
        }

        .div1,.div2{
            height: 200px;
            width: 200px;
        }

        .div1{
            background-color: red;
        }
        .div2{
            background-color: rebeccapurple;
        }

    </style>

</head>
<body>
    <div class="div1"></div>
    <div class="div2"></div>


    <script src="jquery-3.3.1.js"></script>
    <script>
        // offset 和 position都只有两个方法:top 和 left
        // offset方法的参照对象都是当前视口(能看见的窗口)
        console.log($(".div1").offset().top);
        console.log($(".div1").offset().left);
        // position的参数对象是已经定位了的父级标签
        // 该示例中,它的父级标签就是body,body默认就是已经定位了的
        console.log($(".div2").position().top);
        console.log($(".div2").position().left);
    </script>
</body>
</html>
位置:offset和position
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <style>
        /*  将 body的边距设置位0 */
        body{
            margin: 0px;
            padding: 0px;
        }

        .div1,.div2{
            height: 200px;
            width: 200px;
        }

        .div1{
            background-color: red;
        }
        .div2{
            background-color: rebeccapurple;
        }

        .outer{
            position: relative;
            height: 400px;
            width: 400px;
            background-color: green;
        }

    </style>

</head>
<body>
    <div class="div1"></div>

    <div class="outer">
        <div class="div2"></div>
    </div>


    <script src="jquery-3.3.1.js"></script>
    <script>
        // offset 和 position都只有两个方法:top 和 left
        // offset方法的参照对象都是当前视口(能看见的窗口)
        console.log($(".div1").offset().top);
        console.log($(".div1").offset().left);
        // position的参数对象是已经定位了的父级标签
        // 该示例中,它的父级标签就是outer,outer已经定位了
        // 所以此时,再看他的位置,就是相对于outer来说的,变成了0,0
        console.log($(".div2").position().top);
        console.log($(".div2").position().left);
    </script>
</body>
</html>
位置:position相对于已经定位的父级标签标签
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <style>
        /*  将 body的边距设置位0 */
        body{
            margin: 0px;
            padding: 0px;
        }

        .div1,.div2{
            height: 200px;
            width: 200px;
        }

        .div1{
            background-color: red;
            border: 6px solid black;
            padding: 20px;
            margin: 3px;

        }
        .div2{
            background-color: rebeccapurple;
        }

        .outer{
            position: relative;
            height: 400px;
            width: 400px;
            background-color: green;
        }

    </style>

</head>
<body>
    <div class="div1"></div>

    <div class="outer">
        <div class="div2"></div>
    </div>


    <script src="jquery-3.3.1.js"></script>
    <script>
        // height: 拿到的就是内容的大小 --- 用的最多
        // innerHeight: 取出的是带着padding的大小
        // outerHeight: 取出的是带着padding 和 boder的大小

        console.log($(".div1").height());   // 200
        console.log($(".div1").height("300px"));   // 340 可以改值
        console.log($(".div1").innerHeight()); // 240
        console.log($(".div1").outerHeight()); // 252
        console.log($(".div1").outerHeight(true)); // 258 加上参数true,就包括了外边距margin了。

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

实例:返回顶部

需求:

1. 出现滚动条;2;随着滚动条的下滑,底部出现"返回顶部",点击页面滚动条返回到顶部

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <style>

        .div1,.div2{
            height: 2000px;
            width: 100%;
        }

        .div1{
            background-color: red;
        }
        .div2{
            background-color: rebeccapurple;
        }

        /*让返回顶部固定到右下角*/
        .return-to-top{
            width: 80px;
            height: 50px;
            position: fixed;
            right: 20px;
            bottom: 20px;
            background-color: bisque;
            line-height: 50px;
            text-align: center;
        }
        /*隐藏某个标签,给它加个hide 属性,然后display =none 这都是套路*/
        .hide{
            display: none;
        }


    </style>

</head>
<body>
    <div class="div1"></div>

    <div class="outer">
        <div class="div2"></div>
    </div>

    <div class="return-to-top hide" onclick="returnTop()">返回顶部</div>


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

        // window.onscroll 通过窗口的onscrool属性来监听滚动事件

        window.onscroll = function f() {
            // 可以看到滚动条当前的位置与窗口顶部的举例
            console.log($(window).scrollTop());

        //  滚动条滑动过程中才出现返回顶部,默认不显示返回顶部
        //  需要用到判断
        //    $(window).scrollTop()得到的是距离窗口顶部的距离,是一个具体的值
        //    当该值>800时,将hide属性移除,就显示了返回顶部
            if ($(window).scrollTop()>800){
                $(".return-to-top").removeClass("hide")
            }
            // 当该值小于800时,就添加hide属性,返回顶部就隐藏了
            else {
                $(".return-to-top").addClass("hide")
            }


        };

        function returnTop() {

            //以window为作为当前窗口,是个参照物;事件监听对象
            // scrollTop(0):表示举例window窗口顶部距离为0
            // 这样就实现了点击返回顶部的功能
            $(window).scrollTop(0)

        }

    </script>
</body>
</html>
返回顶部实例
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <style>

        .div1,.div2{
            height: 2000px;
            width: 100%;
        }

        /*overflow: auto表示内容填充满后会自动产生一个滚动条,而不会再溢出内容 */
        .div1{
            background-color: red;
            height: 300px;
            width: 300px;
            overflow: auto;
        }
        .div2{
            background-color: rebeccapurple;
        }

        /*让返回顶部固定到右下角*/
        .return-to-top{
            width: 80px;
            height: 50px;
            position: fixed;
            right: 20px;
            bottom: 20px;
            background-color: bisque;
            line-height: 50px;
            text-align: center;
        }
        /*隐藏某个标签,给它加个hide 属性,然后display =none 这都是套路*/
        .hide{
            display: none;
        }


    </style>

</head>
<body>
    <div class="div1">
        <p>111</p>
        <p>111</p>
        <p>111</p>
        <p>111</p>
        <p>111</p>
        <p>111</p>
        <p>111</p>
        <p>111</p>
        <p>111</p>
        <p>111</p>
        <p>111</p>
        <p>111</p>
        <p>111</p>
        <p>111</p>
        <p>111</p>
        <p>111</p>
        <p>111</p>
        <p>111</p>
        <p>111</p>
        <p>111</p>
        <p>111</p>
        <p>111</p>
        <p>111</p>
        <p>111</p>
        <p>111</p>
        <p>111</p>
        <p>111</p>
        <p>111</p>
        <p>111</p>
        <p>111</p>
    </div>

    <div class="outer">
        <div class="div2">
                <button class="return-top" onclick="returnTop()">returntop</button>
        </div>
    </div>


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

        // 监听局部div1,让一点returntop button,就返回顶部
        function returnTop() {
            //$(".div1"):要监听哪个,就找哪个,不一定非得是监听Window
            $(".div1").scrollTop(0)

        }

    </script>
</body>
</html>
监听div,返回顶部

 

五 事件页面载入


页面载入

   
ready(fn)
//当DOM载入就绪可以查询及操纵时绑定一个要执行的函数。 页面载入语法1:
$(document).ready(function(){
   函数代码
})

页面载入语法2:是语法一的简写方式:
$(function(){
   函数代码
}) 事件委托(.on)---终极版的绑定方法 $(
"").on(eve,[selector],[data],fn) // 在选择元素上绑定一个或多个事件的事件处理函数。 // .on的selector参数是筛选出调用.on方法的dom元素的指定子元素,如: // $('ul').on('click', 'li', function(){console.log('click');})就是筛选出ul下的li给其绑定click事件;
// 语法解析:就是给ul标签绑定了click事件,然后ul把这个事件委托给它下面的所有li标签,使所有li标签都具有click的事件
[selector]参数的好处: 好处在于.on方法为动态添加的元素也能绑上指定事件;如: //$('ul li').on('click', function(){console.log('click');})的绑定方式和 //$('ul li').bind('click', function(){console.log('click');})一样;
     
    
  我通过js给ul添加了一个
//li:$('ul').append('<li>js new li<li>');这个新加的li是不会被绑上click事件的 //但是用$('ul').on('click', 'li', function(){console.log('click');}方式绑定,然后动态添加 //li:$('ul').append('<li>js new li<li>');这个新生成的li被绑上了click事件 [data]参数的调用: function myHandler(event) { alert(event.data.foo); } $("li").on("click", {foo: "bar"}, myHandler)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

</head>
<body>
    <ul>
        <li>111</li>
        <li>222</li>
        <li>333</li>
        <li>444</li>
        <li>555</li>

    </ul>

    <script src="jquery-3.3.1.js"></script>
    <script>
        // 在js里找到li标签,没法直接按照下面的方式用,需要遍历后才能用
        // var eles = document.getElementsByTagName("li");
        // eles.onclick = function () {
        //     alert(123)
        // }

        // 来看看jquery的方便之处
    //    ul,li标签都没有绑定任何事件


    //    1. 下面看Jquer的事件绑定————简写方式

        // 用jquery绑定事件,就已经帮你做了内部遍历了
        $("ul li").click(function () {
            alert("Jquety之事件绑定简写方式")

        });

    //  2.事件绑定的完整写法
    //    上面的简写方式如果写完整了就是下面的样子,把click 和 function作为参数传递进去
    //    首先还是得先找到要绑定的标签
        $("ul li").bind("click",function () {
            alert("Jquety之事件绑定的完整写法")
        });

    //    3. 有事件绑定,就有事件解绑
        $("ul li").unbind("click");



    </script>
</body>
</html>
事件绑定示例
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

</head>
<body>
    <ul>
        <li>111</li>
        <li>222</li>
        <li>333</li>
        <li>444</li>
        <li>555</li>
    </ul>

    <button>add</button>

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

    // 事件绑定  --- 平时就用事件绑定就够了
        $("ul li").click(function () {
            alert("Jquety之事件绑定简写方式")

        });

    //    on:事件委托
    // 但是上面新增的标签却没有点击事件,只是把标签加上了而已,如何才能动态给新增的标签也绑定事件呢?
    //    用事件委托的方式解决这个问题----用 on方法
    // on(第一个参数是事件,此例子是click事件,第二个参数是对谁起作用,本利是li标签,第三个参数是具体的函数)
    // 这个事件委托本质就是给ul绑定了一个事件,然后ul把这个事件委托给了ul下面的所有的li,这个时候,其实主语就变成了ul
    // 遇到动态绑定,就需要用到事件委托了
    $("ul").on("click","li",function () {
        alert("Jquety之事件委托方式")

    });

    //  给button标签绑定事件,一点击就新增衣蛾li标签,并数字也变化
        $("button").click(function () {
        //    1. 先创建一个li标签
            var $eli = $("<li>");
            // 2. 获取li标签的长度
            var len = $("ul li").length;
            // 3. 给新增的li标签加1再*1111,用来作为新增的li标签的文本
            $eli.html((len+1)*111);
        //    4. 然后将li标签添加到ul里去
            $eli.appendTo("ul");
        })

    </script>
</body>
</html>
on:事件委托
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
        <script src="jquery-3.3.1.js"></script>
    <script>

        // 如果直接把jquery放到head里,这个功能就无法生效,因为上面的加载完了,下面的body的代码还没加载完,找不到 "ul li"
        // $("ul li").html(5)

    //    所以就引入一个页面载入,等所有页面就加载完成后再执行函数
    //    1. 完整写法方式
        $(document).ready(function () {
            $("ul li").html(5)
        });

        // 2. 页面加载简写方式
        $(function () {
            $("ul li").html(5)
        })

    </script>

</head>
<body>
    <ul>
        <li>111</li>
        <li>222</li>
        <li>333</li>
        <li>444</li>
        <li>555</li>
    </ul>

    <button>add</button>


</body>
</html>
页面载入完整写法和简写

 

六 动画效果

1. 显示与隐藏 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>动画效果-显示与隐藏</title>
</head>
<body>
    <div>hello</div>
    <button onclick="f1()">显示</button>
    <button onclick="f2()">隐藏</button>
    <button onclick="f3()">切换</button>


    <script src="jquery-3.3.1.js"></script>
    <script>
        function f1() {
                // $("div").show();   // 点击就可以显示div
            $("div").show(1000)   // 点击就可以显示div,参数表示的毫秒,慢慢显示

        }

        function f2() {
                // $("div").hide()  // 点击就可以隐藏div
            $("div").hide(1000)  // 点击就可以隐藏div,参数表示的是毫秒,可以实现慢慢隐藏的效果
        }
        
        // toggle()方法,一个方法可以实现上面两个功能,会自己判断,
        // 如果div是隐藏的,点击就会显示;如果div是显示的,点击就会隐藏
        function f3() {
            $("div").toggle(1000)
        }


    </script>
</body>
</html>
显示与隐藏 show hide

2. 滑动

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="jquery-3.3.1.js"></script>
    <script>
    $(document).ready(function(){

     //   找到div给它绑定一个click事件
     $("#slideDown").click(function(){
         $("#content").slideDown(1000);  // 向上滑动
     });
      $("#slideUp").click(function(){
         $("#content").slideUp(1000);    // 向下滑动
     });
      $("#slideToggle").click(function(){
         $("#content").slideToggle(1000);   // 自己判断是向上滑还是向下滑;根据需求决定是否加参数,表示时间
     })
  });
    </script>
    <style>

        #content{
            text-align: center;
            background-color: lightblue;
            border:solid 1px red;
            display: none;
            padding: 50px;
        }
    </style>
</head>
<body>

    <div id="slideDown">出现</div>
    <div id="slideUp">隐藏</div>
    <div id="slideToggle">toggle</div>

    <div id="content">helloworld</div>

</body>
</html>
滑动 sliddeUp slideDown slideToggle

3.淡入淡出

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>淡入淡出</title>

    <style>
        .div1{
            width: 80px;
            height: 80px;
            background-color: #FF0000;

        }
    </style>

    <script src="jquery-3.3.1.js"></script>
    <script>
        $(document).ready(function () {
            $("#in").click(function () {
                $(".div1").fadeIn(2000)
            });

            $("#out").click(function () {
                $(".div1").fadeOut(2000)
            });

            $("#switch").click(function () {
               $(".div1").fadeToggle(2000)
            });
            
            // 淡出到某个设定的透明度为止,只有fadeTo有透明度参数
            $("#to").click(function () {
                $(".div1").fadeTo(2000, 0.4)
            })
        })

    </script>
</head>
<body>
    <button id="in">淡入</button>
    <button id="out">淡出</button>
    <button id="switch">切换</button>
    <button id="to">fadeto</button>

    <div class="div1"></div>


</body>
</html>
淡入淡出fadeIn fadeOut fadeToggle fadeTo

4.回调函数

python里的回调函数就是callback

所谓回调函数:就是完成了一个动作之后再去执行某个内容

比如上面的淡出动画效果完成后,在执行一个回调函数,弹出alert

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>淡入淡出</title>

    <style>
        .div1{
            width: 80px;
            height: 80px;
            background-color: #FF0000;

        }
    </style>

    <script src="jquery-3.3.1.js"></script>
    <script>
        $(document).ready(function () {
            $("#in").click(function () {
                $(".div1").fadeIn(2000)
            });

            $("#out").click(function () {
                // 淡出效果2秒钟完成后,再执行回调函数function,弹出alert
                $(".div1").fadeOut(2000,function () {
                    alert("1234")
                })
            });

            $("#switch").click(function () {
               $(".div1").fadeToggle(2000)
            });

            // 淡出到某个设定的透明度为止,只有fadeTo有透明度参数
            $("#to").click(function () {
                $(".div1").fadeTo(2000, 0.4)
            })
        })

    </script>
</head>
<body>
    <button id="in">淡入</button>
    <button id="out">淡出</button>
    <button id="switch">切换</button>
    <button id="to">fadeto</button>

    <div class="div1"></div>


</body>
</html>
回调函数

七 扩展方法 (插件机制)

一 用JQuery写插件时,最核心的方两个方法

<script>
    
$.extend(object)      //为JQuery 添加一个静态方法。
$.fn.extend(object)   //为JQuery实例添加一个方法。

   // jQuery.extend 也可以写成 $.extend
    jQuery.extend({
          min: function(a, b) { return a < b ? a : b; },  // 三元表达式:如果a<b,返回a,否则返回 b
          max: function(a, b) { return a > b ? a : b; }
        });
    console.log($.min(3,4));

//-----------------------------------------------------------------------

$.fn.extend({
    "print":function(){
        for (var i=0;i<this.length;i++){
            console.log($(this)[i].innerHTML)
        }

    }
});

$("p").print();
</script>

二 定义作用域

      定义一个JQuery插件,首先要把这个插件的代码放在一个不受外界干扰的地方。如果用专业些的话来说就是要为这个插件定义私有作用域。外部的代码不能直接访问插件内部的代码。插件内部的代码不污染全局变量。在一定的作用上解耦了插件与运行环境的依赖。

(function(a,b){return a+b})(3,5)

       (function ($) { })(jQuery);
//相当于
        var fn = function ($) { };
        fn(jQuery);

三 默认参数

定义了jQuery插件之后,如果希望某些参数具有默认值,那么可以以这种方式来指定

/step01 定义JQuery的作用域
(function ($) {
    //step03-a 插件的默认值属性
    var defaults = {
        prevId: 'prevBtn',
        prevText: 'Previous',
        nextId: 'nextBtn',
        nextText: 'Next'
        //……
    };
    //step06-a 在插件里定义方法
    var showLink = function (obj) {
        $(obj).append(function () { return "(" + $(obj).attr("href") + ")" });
    }

    //step02 插件的扩展方法名称
    $.fn.easySlider = function (options) {
        //step03-b 合并用户自定义属性,默认属性
        var options = $.extend(defaults, options);
        //step4 支持JQuery选择器
        //step5 支持链式调用
        return this.each(function () {
            //step06-b 在插件里定义方法
            showLink(this);
        });
    }
})(jQuery);
View Code

参考博客:http://www.cnblogs.com/xcj26/p/3345556.html

八 经典实例练习

实例之注册验证

<form class="Form">

    <p><input class="v1" type="text" name="username" mark="用户名"></p>
    <p><input class="v1" type="text" name="email" mark="邮箱"></p>
    <p><input class="v1" type="submit" value="submit"  onclick="return validate()"></p>

</form>

<script src="jquery-3.1.1.js"></script>
<script>
    // 注意:
    // DOM对象--->jquery对象    $(DOM)
    // jquery对象--->DOM对象    $("")[0]

    //---------------------------------------------------------


    // DOM绑定版本
    function validate(){

        flag=true;

        $("Form .v1").each(function(){
            $(this).next("span").remove();// 防止对此点击按钮产生多个span标签
              var value=$(this).val();
            if (value.trim().length==0){
                 var mark=$(this).attr("mark");
                 var ele=document.createElement("span");
                 ele.innerHTML=mark+"不能为空!";
                 $(this).after(ele);
                 $(ele).prop("class","error");// DOM对象转换为jquery对象
                 flag=false;
                 //  return false-------->引出$.each的return false注意点
            }


        });

        return flag
    }
                   //---------------------------------------------------------
//---------------------------------------------------------
                   //---------------------------------------------------------



        function f(){

        for(var i=0;i<4;i++){

            if (i==2){
                return
            }
            console.log(i)
        }

    }
    f();  // 这个例子大家应该不会有问题吧!!!
//------------------------------------------
    li=[11,22,33,44];
    $.each(li,function(i,v){

        if (v==33){
                return ;   //  ===试一试 return false会怎样?
            }
            console.log(v)
    });

//------------------------------------------

    //  $.MyEach(obj,function(i,v){}):
         for(var i in obj){

             func(i,obj[i]) ; //  i就是索引,v就是对应值
             // {}:我们写的大括号的内容就是func的执行语句;
         }

    // 大家再考虑: function里的return只是结束了当前的函数,并不会影响后面函数的执行

    //本来这样没问题,但因为我们的需求里有很多这样的情况:我们不管循环到第几个函数时,一旦return了,
    //希望后面的函数也不再执行了!基于此,jquery在$.each里又加了一步:
         for(var i in obj){

             ret=func(i,obj[i]) ;
             if(ret==false){
                 return ;
             }

         }
    // 这样就很灵活了:
    // <1>如果你想return后下面循环函数继续执行,那么就直接写return或return true
    // <2>如果你不想return后下面循环函数继续执行,那么就直接写return false


// ---------------------------------------------------------------------
   // 说了这么多,请问大家如果我们的需求是:判断出一个输入有问题后面就不判断了(当然也就不显示了),
   // 怎么办呢?
   // 对了
    if (value.trim().length==0){
                  //...
                  //...
                  //flag=false;  //   flag=false不要去,它的功能是最后如果有问题,不提交数据!
                  return false
            }


//最后,大家尝试着用jquery的绑定来完成这个功能!

      $(".Form :submit").click(function(){});
    
</script>
View Code

轮播图练习

.outer{
    width: 520px;
    height: 280px;
    margin: 80px auto;
    position: relative; /*relative相对定位加上后,才会按照父亲本身的盒子居中定位*/
}

/*.img其实不需要什么样式,关键是它下面的图片需要样式,
每张图片都按照父亲进行绝对定位,定位的时候都叠加到一起*/
.img li{
    position: absolute;
    list-style: none;  /*把li的样式给去掉*/
    top: 0;
    left: 0;
}


.num{
    position: absolute;
    bottom: 10px;
    left: 30%;  /*居中*/
    list-style: none;
}


.num li {
    display: inline-block;
    width: 18px;
    height: 18px;
    background-color: white;
    border-radius: 50%;   /*设置成圆球*/
    text-align: center;
    line-height: 18px;
    margin-left: 14px;   /*每个li之间的间距*/
    font-size: 0; /*把字体大小设置为0,就不显示1,2,3,4*/

}

.btn{
    position: absolute; /*加上就能看见了*/
    top: 110px;   /*举例盒子顶部的一半140px- btn的一半30px, 就能实现居中*/
    width: 30px;
    height: 60px;
    background-color: lightgray;
    color: white;
    text-align: center;/*左右居中*/
    line-height: 55px;/*上下居中*/
    font-size: 30px;
    opacity: 0.6;  /*透明度*/
    display: none;  /*默认不显示左右切换箭头*/

}

.left{
    left: 0;
}

.right{
    right: 0;
}

/*鼠标悬浮在图片上的时候,左右的切换箭头显示*/
.outer:hover .btn{
    display: block;
}

.num .active{
    background-color: #FF0000;
}
css样式
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="jquery-3.1.1.js"></script>
    <title>Title</title>

    <link rel="stylesheet" href="css/lunbo.css">


</head>
<body>


      <div class="outer">
          <ul class="img">
              <li><a href=""><img src="img/1.jpg" alt=""></a></li>
              <li><a href=""><img src="img/2.jpg" alt=""></a></li>
              <li><a href=""><img src="img/3.jpg" alt=""></a></li>
              <li><a href=""><img src="img/4.jpg" alt=""></a></li>

          </ul>

          <ul class="num">
              <li class="active"></li>
             <!--空的,下面可以实现动态添加-->
              <!--<li>1</li>-->
              <!--<li>2</li>-->
              <!--<li>3</li>-->
              <!--<li>4</li>-->
          </ul>

          <div class="left  btn"> < </div>
          <div class="right btn"> > </div>

      </div>

      <script src="jquery-3.3.1.js"></script>
<script>
    var i=0;
//  通过jquery自动创建按钮标签
    /*
        通过jquery 自动创建标签
        根据图片数量实现动态添加num 下的li标签
        */
    var img_num=$(".img li").length;  /*看有多少个图片,size 和 length都可以*/

    for(var j=0;j<img_num;j++){
        $(".num").append("<li></li>")
    }
    // 给上面循环加的li标签加上属性active,进来的时候就是默认给第一个加上active的
    $(".num li").eq(0).addClass("active");


    // 先做手动悬浮的轮播
        /*
        1. 鼠标放在哪个圆点上,哪个圆点变红
        2. 对应的图片也显示出来
        */
// 手动轮播
       /*给num下的li绑定事件*/
    $(".num li").mouseover(function () {
        i=$(this).index();
        $(this).addClass("active").siblings().removeClass("active");
        // 当鼠标悬浮在小圆点上的时候,对应的图片展示出来
            // 方法一:show(), hide()
            // $(".img li").eq(index).show():通过索引找到对应的图片,让他显示出来
            // .siblings().hide() 让该索引对应的其他兄弟姐妹图片都隐藏
            // $(".img li").eq(index).show().siblings().hide();
            // $(".img li").eq(index).show(1000).siblings().hide(); // 有个特殊展开的效果

            // 方法二:淡入淡出
            // 道理同上
            // 但是这个有个小bug,如果快速在小圆点滑动多次停下,然后图片还在那里不停的闪烁
        // $(".img li").eq(index).fadeIn(1000).siblings().fadeOut();

        
            // 解决办法:加个stop
            // 意思是当鼠标悬浮在哪个小圆点时,其他的效果全部停止,然后执行淡入,或者淡出效果
        $(".img li").eq(i).stop().fadeIn(200).siblings().stop().fadeOut(200)

    });


// 自动轮播
            //    自动轮播
        //    设置一个定时器 c, 每隔1500毫秒,执行一次GO_R函数
    var c=setInterval(GO_R,1500);


    function GO_R() {

        if(i==img_num-1){
            i=-1
        }
         i++;
         $(".num li").eq(i).addClass("active").siblings().removeClass("active");
         $(".img li").eq(i).stop().fadeIn(1000).siblings().stop().fadeOut(1000)

    }


    function GO_L() {
        if(i==0){
            i=img_num
        }
         i--;
         $(".num li").eq(i).addClass("active").siblings().removeClass("active");
         $(".img li").eq(i).stop().fadeIn(1000).siblings().stop().fadeOut(1000)
    }
    
    // hover(参数一:表示悬浮是,参数二:表示没有悬浮时)

    $(".outer").hover(function () {
        clearInterval(c)
    },function () {
        c=setInterval(GO_R,1500)
    });

// button 加定播
    //    给btn加手动定播
    
    $(".right").click(GO_R);
    $(".left").click(GO_L)



</script>
</body>
</html>
轮播

 

 

 

 

 

 

 

 

 

转:https://www.cnblogs.com/yuanchenqi/articles/6070667.html 

posted @ 2018-09-22 20:14  mamingchen  阅读(357)  评论(0编辑  收藏  举报