• 【转】 前端笔记之jQuery(上)加载函数的区别&对象&操作HTML/CSS&动画&选择器


    【转】 前端笔记之jQuery(上)加载函数的区别&对象&操作HTML/CSS&动画&选择器

    一、jQuery简介

    1.0 JavaScript编程比较恶心的地方

    恶心1:选择元素麻烦,全线兼容的方法只有getElementById()getElementsByTagName()两个。其他的方法是不都兼容的。getElementsByClassName()通过类名选择元素,IE9开始兼容。

    恶心2:样式操作麻烦,得到原生样式,需要我们自己造轮子getStyle()

    恶心3:动画麻烦,需要我们自己造轮子animate();

    恶心4:批量控制麻烦,大量出现的for循环语句;排他操作麻烦

    恶心5HTML节点操作麻烦

    恶心的东西,能用“轮子”来解决,事实上我们已经造了两个轮子:getStyleanimate

    能不能把所有轮子组合起来,成为一个框架呢?jQuery就是这样的一个东西。


    1.1 简介

    jQueryDOM编程领域的霸主,极大的简化了原生JavaScriptDOM编程。是免费开源的、语法设计简单,可以更便捷开发,例如选择元素、制作动画效果等功能。

    jQuery中含有丰富的轮子,完美解决了选择元素难、样式难、动画难、批量操作难等各种兼容问题,让工程师只需要思考业务,而不必思考细枝末节的兼容问题。jQuery是一个js文件,兼容多浏览器的JavaScript库(框架)。

    优点:使用简单方便

    宗旨:Write Less, Do More.  写的少,做的多


    1.2 为什么要学习jQuery

    jquery开发简单、易懂、兼容性好(几乎解决了所有的兼容性问题)。

    1.3 JavaScriptjQuery的关系

    JavaScriptjQuery的关系好比父子,JavaScript是父亲,jquery是儿子(青出于蓝)


    1.4 jQuery版本

     带有.min标识是经过压缩js文件,但是代码和没压缩的一样,不用担心,项目中都用.min的,因为文件体积小。如要查看源代码,就用没压缩的。

    在官网下载的有3种版本:

     1.x 兼容所有的浏览器,PC端开发都用这个

     2.x 不兼容IE678的,一般用于移动端

     3.x 是最新的版本,不兼容IE678,一般用在移动端

    下载的时候有两个选择:

    所有jQuery版本下载地址:http://code.jquery.com/jquery/


    1.5 jQuery使用

    1、先引入jQuery文件包(外部JS文件)

     

    1、换行在写script标签,在里面写js代码

    2、使用$()方法用什么就选择什么,不用去写繁琐的获取元素的JS代码。例如:$('div')

    $()函数是jQuery核心函数,query是选择的意思,也就是说jQuery的核心招牌动作就是选择元素:

     $('.box ul li').hide(1500);

    语法:

     $('选择器');   

    注意:

    1、选择的就是符合条件的元素,而不是一个

    2、$('选择器')里面的选择器和CSS选择器完全一致

    $也可以用jQuery代替,它们是同一个函数。

     $('选择器');

    等价于:

     jQuery('选择器');   


    二、加载函数的区别

    2.1 JavaScript入口函数

    语法:

     window.onload = function(){
    
     }

    注意:不能写多个,如果有多个入口函数,只执行后面写的。

      


    2.2jQuery入口函数

    语法:

    $(function(){});

    注意:可以同时写多个,并且按顺序执行。

    【建议】:

     入口一个足够,不建议写多个,JSjQuery入口函数是通用的。


    三、jQuery对象

    3.1 jQuery对象不是原生JS对象

    $()函数,能够根据CSS选择元素,比如:

     $("#box")

     等于

     jQuery("#box")

    注意:选出来的是一个类数组对象,jQuery自己的对象,这个jQuery对象后面不能是原生JS的语法:

      $('#box').style.backgroundColor = 'green';

    因为.style.backgroundColor= 'green';是原生JS语法,$()的对象是jQuery,不能混用。

    如果要把jQuery对象,转为原生JS对象,加[0]get()方法即可。

     $('#box')[0].style.backgroundColor = 'green';

     $('#box').get(0).style.backgroundColor = 'green';


    3.2原生JS对象和jQuery之间互相转换

    jQuery对象→原生JS对象:方法就是根据下标获取其中一项元素。

     $('p').innerHTML = '你好!';

     $('p')[0].innerHTML = '你好!';

     $('p')[0].html('你好');

    原生JS对象→jQuery对象:将原生JS对象放在$()中即可。

     var oBox = document.getElementById('box');
     //$(oBox).style.backgroundColor = 'blue';
     $(oBox).hide()

    3.3引号的问题

     $('选择器')

    注意引号不能丢,在jQuery世界中,只有三个对象不能加引号,其他必须加引号:

     $(this)

     $(document)

     $(window)

    $()获得的元素一个类数组的对象,由一些自定义属性和方法组成,还要我们获取原生JS的元素对象。

    可以通过两个方法获取原生元素对象的长度:

    第一个:length属性,可以返回内部元素的长度,通过下标获取某一项元素对象

     console.log($('p').length);

     console.log($('p')[0]);

    第二个:size()方法,可以返回内部元素的长度

     console.log($('p').size());

    index()方法:能够返回元素在结构中同级元素中的位置(下标)。

     console.log($('#box').index());


    四、jQuery操作CSS样式

    eq() 是遍历方法,并且可以通过下标选择某个元素

    jquery中操作CSS,全都使用css()这个方法

    【中文语法解释】:

     1、获取CSS属性值:$('选择器').css('属性名');    一个参数表示获取属性值

     2、单属性CSS设置:$('选择器').css('属性名','属性值');

     3、多属性CSS设置:$('选择器').css({'属性名':'属性值','属性名':'属性值'});

    【代码语法解释】:

     1、获取CSS属性值:$('选择器').css('width');    一个参数表示获取属性值

     2、单属性CSS设置:$('选择器').css('width','100px');

     3、多属性CSS设置:$('div').css({'width':'200px','height':'200px'});

    属性名属性值之间用“:”隔开,每一组CSS用逗号隔开,最外层用({})包住,是JSON的格式。

    其实CSS属性可以不写引号,但是如果遇到“-”就必须要写上。但是不建议不写,规范来说还是全部加上引号,避免出错。

     

    多属性可以换行(下图为例)

     

    CSS运算:

     $('div').css('width','-=20px');

     $('div').css('width','+=20px');


    五、jQuery操作HTML

    5.1jQuery操作HTML标签内容

    通过html()方法可以获取或设置HTML标签的内容。

     获取标签内容:$('选择器').html();

     设置标签内容:$('选择器').html('需要设置的内容');

     


    5.2jQuery操作HTML标签属性

    属性的英文单词:attributejQuery把复杂的单词简化为attr

     操作HTML标签属性的方法:attr()

    语法:

     获取属性值:attr('属性名');

     单属性设置:attr('属性名','属性值');

     多属性设置:attr({'属性名':'属性值','属性名':'属性值'});

    注意:attr()方法和css()方法语法完全一致。

     


    六、jQuery动画

    6.1 jQuery基础动画

     hide()    隐藏

     show()    显示

     toggle()  显示和隐藏的切换

    以上3种方法,默认是没有动画的,需要添加动画,可以在括号内填写毫秒参数控制动画时间。

     


    6.2 jQuery滑动动画

     slideUp()     向上滑动隐藏

     slideDown()   向下滑动显示

     slideToggle() 滑动显示和隐藏的切换

    以上3种方法,默认有动画,也可以毫秒控制动画时间

     

    注意:如果给img标签设置了滑动动画,就必须给img标签设宽度或高度,否则就变对角线动画了。


    6.3 jQuery透明度动画

     fadeIn()       淡入显示

     fadeOut()      淡出隐藏

     fadeToggle()   淡入淡出之间切换

     fadeTo(时间,透明度值)        设置透明度,透明度的值0~1之间

    $('button').eq(0).click(function(){
       $('div').fadeOut(2000);  //淡出隐藏
    });
    $('button').eq(1).click(function(){
       $('div').fadeIn(2000); //淡入显示
    });
    $('button').eq(2).click(function(){
       $('div').fadeToggle(1000);  //淡入淡出切换
    });
    $('button').eq(3).click(function(){
       $('div').fadeTo(1000,0.5);  //在1秒钟设置透明度为0.5
    });

    注意所有动画方法都有回调函数fadeIn(speed,callback);


    七、基本选择器

    jQuery$()是万能选择器,绝大部分选择器都是和CSS选择器一样。

     


    八、筛选选择器和方法

    8.1筛选选择器

    筛选选择器主要通过特定的过滤规则筛选除所需要的元素,该选择器都是“:”开头,并且写在$()函数内。

    $('p:first').css('background','skyblue');  //选中第一个p标签
    $('p:last').css('background','skyblue');  //选中最后一个p标签
    $('p:even').css('background','skyblue');  //选中所有偶数的p标签
    $('p:odd').css('background','orange');    //选中所有偶数的p标签
    $('p:gt(3)').css('background','orange');  //选中大于指定编号的p标签
    $('p:lt(3)').css('background','orange');  //选中小于指定编号的p标签
    $('p:eq(3)').css('background','orange');    //选中下标为3的p标签,索引值从0开始
    $('p:not(.op)').css('background','orange');  //选中所有p标签,但排除类名为.op的

    8.2筛选方法

     first()   选中第一个元素

     last()    选中最后一个元素

     eq(3)     选中指定下标的元素

     $('p').first().css('background','orange');    //选中第一个p标签
     $('p').last().css('background','orange');    //选中最后一个p标签
     $('p').eq(3).css('background','orange');    //选中下标为3的p标签

    九、节点关系选择器

    9.1三巨头:父、子、兄

     $('div').parent()     选中当前div元素的父亲

     $('div').children()   选中当前div元素的儿子

     $('div').siblings()   选中当前div的所有兄弟,不包括自己

    注意,以上3个方法中,都可以填参数,参数都是选择器

     $(this)      代表当前对象的事件源(和jsthis一样)

     


    9.2其他节点关系

    find():找的是元素的后代的一些元素,根据参数的选择器去选择。

     $('.box').find('li').css("border","1px solid red"); //选中.box所有的后代li

    next():选中的是当前元素的下一个元素,必须是同级的。

     $('.box2').next().css("border","1px solid red");   //选中box2下一级兄弟

    nextAll():选中的是当前元素后面的所有兄弟元素。内部可以传参数,选择符合选择器的后面的兄弟。

     $('.box2').nextAll().css("border","1px solid red"); //选中box2下一级所有的兄弟

    prev():选中的是当前元素的上一个元素,必须是同级的。

     $('.box2').prev().css("border","1px solid green");  //选中box2上一级兄弟

    prevAll():选中的是当前元素前面的所有兄弟元素。内部可以传参数,选择符合选择器的后面的兄弟

     $('.box2').prevAll().css("border","1px solid green"); //选中box2上一级所有兄弟

    parents():选择的是包含html标签在内的所有祖先元素。内部可以传参数,选择符合选择器的祖先元素。

     $('.box ul li').parents().css("border","1px solid #000"); //选中li标签所有的祖先元素

     $('.box ul li').parents('.box1').css('border','1px solid red'); //选中li标签.box祖先元素


    十、链式编程

    但凡针对同一个目标进行所有的操作,都可以通过“点”语法来连续写,这种叫做“链式编程”。

     


    十一、索引值index()

    在jQuery中用选择器选出来的元素都有一个index()方法,这个方法可以获取当前元素在父级中的下标(索引值)

    (自己家的孩子排行大小,根隔壁老王家的孩子排行大小没关系)

    $('ul li').click(function(){
       alert($(this).index()); //获取当前被点击那个li元素在父级中的下标
       console.log($('ul li').eq(8));  //把全部选择的元素进行大排队
    });

    十二、jQuery操作class

    虽然attr()方法也可以操作class属性,但是jQuery专门为我们封装了一些操作class的方法,更方便更直观。

     addClass()     添加class

     removeClass()  删除class

     toggleClass()  切换类,删除和添加之间切换

     hasClass()     判断是否有class类,true表示有,false表示没有

    以上4个方法的参数,都是class类名,并且不会覆盖原有的class类名,除非类名相同。

    注意:圆括号内的只能是class类名,不能加“.”

     addClass('box');   正确的

     addClass('.box');  错误的


    十三、事件监听方法

     hover()方法集成了鼠标移入和移出两个事件。

    【语法】:

    $('div').hover(function(){
       //鼠标移入执行的事情
    },function(){
       //鼠标离开执行的事情
    });

    【语法2】:

    $('div').hover(function(){
       //鼠标移入移出两个事件执行的代码
    });

    参数解释:

     hover(参数1,参数2);

    参数1和参数2都是匿名函数function(){},如果只写一个参数,表示鼠标移入和移出两个事件。


    十四、animate()自定义动画

    animate()方法用于创建CSS属性集的自定义动画,通过CSS样式将元素从一个状态慢慢的变化到另一种状态的过程。

    animate()是动画的意思,原生JS动画必须依靠setInterval,根据步长和间隔时间操作运动。animate()方法内部用setInterval已经封装好了,不用自己算步长。

    14.1 animate()语法

     $(选择器).animate({css样式},时间,运动方式,回调函数);

     参数1CSS属性名:属性值,JSON个数{'width':500}

     参数2:动画执行总时间,毫秒

     参数3:动画的运动方式,参数要用引号,例如:linear是匀速运动

     参数4:回调函数function(){},动画完毕后,执行的函数

    以上参数,除了参数1,其他都是可选的。


     

    14.2可以参与运动的属性

    http://www.w3school.com.cn/jquery/effect_animate.asp

    参考上面的链接,里面罗列了所有能运动的属性,有数值的都能参与运动。

    我们关心不能参与运动的有哪些?

     1background-color 背景色,但是CSS3可以

     2background-position背景定位,但是CSS3可以

     3、大部分CSS3属性都不能动画,border-radius除外


    14.3动画队列

    jQuery中有一个机制,叫“动画队列”。

    什么叫“队列”,比喻:食堂打饭,先进的先出

    什么叫“栈”,比喻:羽毛球筒,先进的后出

    同一个元素animate的时候,会按照顺序执行

    $('div').animate({'left':500},2000);
    $('div').animate({'top':500},2000);
    $('div').animate({'left':0},2000);
    $('div').animate({'top':0},2000);

    上面四段动画等价于这一行代码:

    同一个元素多次打点调用动画方法,动画会自动排成队列,谁先写,谁先执行。

    $('div').animate({'left':500},2000).animate({'top':500},2000).animate({'left':0},2000).animate({'top':0},2000);

    下面的动画是同时执行,不会按顺序执行:

    $('div').animate({'left':500,'top':300},2000);
    
    //非动画语句会同时执行
    $('div').eq(0).animate({"left":500},1000);
    $('div').eq(1).css({"background-color":"pink"});

    animate是异步的语句,JS解析动画的时候,不会死等动画。


    14.4异步语句和回调函数

    animate动画方法是一个异步语句,也可以写回调函数,描述动画结束后可以做什么。

     $('div').animate({'width':500},2000,'linear',function(){

        //动画执行完毕后的回调函数

        $(this).css('background-color','skyblue');

     });


    14.5 delay()延迟动画

    所有的jQuery动画方法都可以用delay(),表示动画不是立即执行,需要等待一段时间。

    参数:规定延迟的时间

    $('div').delay(1000).slideUp();
    $('div').delay(1000).slideDown();
    $('div').delay(2000).animate({"left":500},1000);

    上面写法等价于:

    $('div').delay(1000).slideUp().delay(1000).slideDown().delay(2000).animate({"left":500},1000);

    只要是动画方法都可以使用delay()延迟。


    14.6 stop()停止动画方法

    jQuery所有动画采取的都是排队机制的播放形式,如果相继触发10次动画,那么没有执行的动画会依次排队等待执行。

    stop():可以清空动画的排队机制,一定要写在执行动画的前面,命令运动的元素停止。

     stop(是否清空动画队列,是否完成当前动画)

    第一个参数:表示是否清空动画队列,true表示清空,false表示不清空

    第二个参数:表示是否完成当前动画,true表示立即完成,false表示立即停止不动

    两个参数默认不写:都是false

    $('button').eq(0).click(function(){
       $('div').animate({'left':1000}, 2000);
       $('div').animate({'top':500}, 1500);
       $('div').animate({'left':0}, 1500);
       $('div').animate({'top':0}, 1500);
    });
    //不清空动画队列,立即停止当前动画,执行后面队列的动画
    $('button').eq(1).click(function(){
       $('div').stop(); //等价于stop(false,false)
    });
    //清空动画队列,立即停止当前动画,盒子留在此时的位置(常用)
    $('button').eq(2).click(function(){
       $('div').stop(true); //等价于stop(true,false)
    });
    //清空动画队列,立即停止当前动画,并且瞬间完成当前动画
    $('button').eq(3).click(function(){
       $('div').stop(true,true);
    });
    //不清空动画队列,立即停止当前动画,并且瞬间完成当前动画,继续执行后面的动画
    $('button').eq(4).click(function(){
       $('div').stop(false,true);
    });
    //不清空动画队列,立即停止当前动画,并且瞬间完成当前动画,继续执行后面的动画
    $('button').eq(5).click(function(){
         $('div').finish(); //finish()瞬间完成所有动画队列!
    });

    当一个元素身上积累了很多动画,不经意就积累了,我们称为“流氓”。

    希望新的动画触发时,前面这个动画全部清空,立即停止,防止用户频繁触发事件

    方法1:用stop(),清空动画队列

    //每次点击按钮,都会让div增加一个动画队列
    $('button').eq(0).click(function(){
       //先清空所有动画队列,然后执行新的动画
       $('div').stop(true).animate({'left':0}, 2000);
    });
    $('button').eq(1).click(function(){
       //先清空所有动画队列,然后执行新的动画
       $('div').stop(true).animate({'left':1000}, 2000);
    });

    14.7 is()方法

    方法2:节流方法,判断元素是否正在运动过程中,如果是,就不执行后面的操作;如果不是,就执行后面的动画。

    元素都有一个方法叫is() 它可以判断是否处于某种状态。

    is表示“是不是”,而不是“是”,表示检测某一个元素否具备某种状态,返回布尔类型。

    $(this).is('.t'); //判断当前被点击的p是不是有.t的类名,是就返回true
    $(this).is('#t'); //判断当前被点击的p是不是有#t的id,是就返回true
    $(this).is('p:odd'); //判断当前被点击的p是不是奇数,是就返回true
    $(this).is('p:lt(3)'); //判断当前被点击的p下标是不是小于3
    $(this).is('p:visible'); //判断当前被点击的p是不是可见

     $('p').is(':animated');  判断这个元素是否正在运动中,返回truefasle

    判断是否正在运动中,可以防止动画的积累:

    只要动画正在进行,那么我不接受新的命令

    和之前学stop()不一样,动画正在运行中,立即停止当前动画,执行新的命令。

    $('button').eq(0).click(function(){
       if($('div').is(':animated')){
           return; //如果当前这个div是在运动,直接return结束后面代码的执行
       }
       $('div').animate({'left':0}, 2000);
    });
    $('button').eq(1).click(function(){
       if($('div').is(':animated')){
           return; //如果当前这个div是在运动,直接return结束后面代码的执行
       }
       $('div').animate({'left':1000}, 2000);
    });

    简化后的代码:

    $('button').eq(0).click(function(){
       if(!$('div').is(':animated')){
           $('div').animate({'left':0}, 2000);
       }
    });
    $('button').eq(1).click(function(){
       if(!$('div').is(':animated')){
           $('div').animate({'left':1000}, 2000);
       }
    });

    十五、jQuery each()遍历方法

    jQueryeach()方法,表示遍历,$()选择出来的元素,把每个被选中的元素匹配,可以认为是一个队列,那么each就遍历这个队列中的每一个元素,遍历之后就可以执行一些操作:

    each 在英语表示“每一个”

     $('div p').each(function(index,ele){

         对每一个元素的操作

     })

    【参数解释】:

     index  当前被选中元素的编号(索引值)

     ele    当前被选中的元素(也可以用this代替),如果用this代替,可以不写这个参数

    $('div').each(function(index,ele){
       //index就是每次进来遍历的元素下标
       //this指向的是每次进来的那个元素
       $(this).children().eq(1).css('background-color','red');
    });


  • 相关阅读:
    「UVA12293」 Box Game
    「CF803C」 Maximal GCD
    「CF525D」Arthur and Walls
    「CF442C」 Artem and Array
    LeetCode lcci 16.03 交点
    LeetCode 1305 两棵二叉搜索树中的所有元素
    LeetCode 1040 移动石子直到连续 II
    LeetCode 664 奇怪的打印机
    iOS UIPageViewController系统方法崩溃修复
    LeetCode 334 递增的三元子序列
  • 原文地址:https://www.cnblogs.com/Javastudy-note/p/13812637.html
Copyright © 2020-2023  润新知