前端基础--jQuery(pink老师课程笔记)

目录

Jquery概述

JavaScript库

即library,是一个封装好的特定的集合(方法和函数)。从封装一大堆函数的角度理解库,就是在这个库中,封装了很多预先定义好的函数,如:动画animate,hide,show,获取元素等

简单理解:就是一个JS文件,里面对我们原生js代码进行了封装,存放到里面。方便快速高效使用封装好的功能,如jQuery库,为了快速方便操作DOM。

常见的JavaScript库

  • jQuery
  • Prototype
  • YUI
  • Dojo
  • Ext JS
  • 移动端的zepto

这些库都是对原生JavaScript的封装,内部都是用JavaScript实现的。

jQuery的概念

jQuery 是一个快速、简介的JavaScript库,其设计的宗旨是“write Less,Do More”,提倡写更少的代码,做更多的事

j为JavaScript,Query:查询;意为查询js,把js中的DOM操作做了封装,可以快速的查询使用里面的功能,提高开发效率。

jQuery封装了js常用的功能代码,优化了DOM操作、事件处理、动画设计和Ajax交互。

学习jQuery本质就是学习调用这些函数(方法)。

优点:

  • 轻量级,核心文件才几十kb,不会影响页面加载速度
  • 跨浏览器兼容,基本兼容了现在主流的浏览器
  • 链式编程、隐式迭代
  • 对事件、样式、动画支持,大大简化了DOM操作
  • 支持插件扩展开发。有着丰富的第三方的插件,例如:树形菜单、日期控件、轮播图等
  • 免费、开源

jQuery 的基本使用

先引入jQuery.js

jQuery的入口函数

jQuery中常见的两种入口函数:

// 第一种: 简单易用。
$(function () {   
    ...  // 此处是页面 DOM 加载完成的入口
}) ; 

// 第二种: 繁琐,但是也可以实现
$(document).ready(function(){
   ...  //  此处是页面DOM加载完成的入口
});

总结:

  1. 等着 DOM 结构渲染完毕即可执行内部代码,不必等到所有外部资源加载完成,jQuery 帮我们完成了封装。
  2. 相当于原生 js 中的 DOMContentLoaded。
  3. 不同于原生 js 中的 load 事件是等页面文档、外部的 js 文件、css文件、图片加载完毕才执行内部代码。
  4. 更推荐使用第一种方式。

jQuery 的顶级对象 $

  1. $是 jQuery 的别称,在代码中可以使用 jQuery 代替,但一般为了方便,通常都直接使用 $ 。

    $('div').hide();等价于jQuery('div').hide();

  2. $是jQuery的顶级对象,相当于原生JavaScript中的 window。把元素利用$包装成jQuery对象,就可以调用jQuery 的方法。

jQuery 对象和DOM对象

使用 jQuery 方法和原生JS获取的元素是不一样的,总结如下 :

  1. 用原生 JS 获取来的对象就是 DOM 对象
  2. jQuery 方法获取的元素就是 jQuery 对象。
  3. jQuery 对象本质是: 利用$对DOM 对象包装后产生的对象(伪数组形式存储)。

注意:

  • 只有 jQuery 对象才能使用 jQuery 方法,DOM 对象则使用原生的 JavaScirpt 方法(不能相互调用)

jQuery对象和DOM对象互相转换

​ DOM对象和jQuery对象之间是可以相互转换的,因为原生js比jQuery更大,原生的一些属性和方法jQuery没有给我们封装,要想使用这些属性和方法,需要把jQuery对象转换为DOM对象才能使用。

// 1.DOM对象转换成jQuery对象,方法只有一种
var box = document.getElementById('box');  // 获取DOM对象
var jQueryObject = $(box);  // 把DOM对象转换为 jQuery 对象

// 2.jQuery 对象转换为 DOM 对象有两种方法:
//   2.1 jQuery对象[索引值]
var domObject1 = $('div')[0]

//   2.2 jQuery对象.get(索引值)
var domObject2 = $('div').get(0)

总结:实际开发比较常用的是把DOM对象转换为jQuery对象,这样能够调用功能更加强大的jQuery中的方法。

jQuery 选择器

原生 JS 获取元素方式很多,很杂,而且兼容性情况不一致,因此 jQuery 给我们做了封装,使获取元素统一标准。

基础选择器

$("选择器")   //  里面选择器直接写 CSS 选择器即可,但是要加引号 
名称 用法 描述
ID选择器 $("#id") 获取指定ID的元素
全选选择器 $('*') 匹配所有元素
类选择器 $('.class') 获取同一类class的元素
标签选择器 $('div') 获取同一类标签的所有元素
并集选择器 $('div,p,li') 获取多个元素
交集选择器 $('ul.li.a') 交集元素

层级选择器

层级选择器最常用的两个分别为:后代选择器和子代选择器。

名称 用法 描述
子代选择器 $("ul>li”); 使用>号,获取亲儿子层级的元素(子一代);注意,并不会获取孙子层级的元素(子二代)
后代选择器 $("ul li"); 使用空格,获取ul下所有的li元素,包括子二代、子三代。。。

案例:

<body>
    <div>我是div</div>
    <div class="nav">我是nav div</div>
    <p>我是p</p>
    <ul>
        <li>我是ul 的</li>
        <li>我是ul 的</li>        
        <li>我是ul 的</li>
    </ul>
    <script>
        $(function() {
            console.log($(".nav"));
            console.log($("ul li"));
        })
    </script>
</body>

筛选选择器

在所有的选项中选择满足条件的进行筛选选择。常见如下:

语法 用法 描述
:first $('li:first') 获取第一个li元素
:last $('li:last') 获取最后一个li元素
:eq(index) $('li:eq(2)') 获取到的li元素中,选择索引号为2的元素,索引号index从0开始
:odd $('li:odd') 获取到的li元素中,选择索引号为奇数的元素
:even $('li:even') 获取到的li元素中,选择索引号为偶数的元素

案例代码

<body>
    <ul>
        <li>多个里面筛选几个</li>
        <li>多个里面筛选几个</li>
        <li>多个里面筛选几个</li>
        <li>多个里面筛选几个</li>
        <li>多个里面筛选几个</li>
        <li>多个里面筛选几个</li>
    </ul>
    <ol>
        <li>多个里面筛选几个</li>
        <li>多个里面筛选几个</li>
        <li>多个里面筛选几个</li>
        <li>多个里面筛选几个</li>
        <li>多个里面筛选几个</li>
        <li>多个里面筛选几个</li>
    </ol>
    <script>
        $(function() {
            $("ul li:first").css("color", "red");
            $("ul li:eq(2)").css("color", "blue");
            $("ol li:odd").css("color", "skyblue");
            $("ol li:even").css("color", "pink");
        })
    </script>
</body>

另: jQuery中还有一些筛选方法,类似DOM中的通过一个节点找另外一个节点,父、子、兄以外有所加强。

语法 用法 说明
parent() $("li").parent(); 查找父级
children(selector) \(("ul").children("li"); | 相当于\)("ul>li"),子一代(儿子)
find(selector) \(("ul").find("li"); | 相当于\)("ul li"),后代选择器
siblings(selector) $(".first").siblings("li"); 查找除自身以外的兄弟节点
nextAll([expr]) $(".first").nextAll(); 查找该元素当前位置之后所有的同辈元素
prevtAll([expr]) $(".last").prevAll(); 查找该元素当前位置之前所有的同辈元素
hasClass(class) $("div").hasClass("protected") 检查当前元素是否含有某个特定的类,如果有,则返回true
eq(index) \(("li").eq(2); | 相当于\)("li:eq(2)"),index 从0开始,选取下标为2的元素(index可以直接是一个变量)

重点记住:parent() children() find() siblings() eq()

排他思想

  • jQuery 设置样式
$('div').css('属性', '值') 
  • jQuery 里面的排他思想
// 想要多选一的效果,排他思想:当前元素设置样式,其余的兄弟元素清除样式。
$(this).css(“color”,”red”);
$(this).siblings(). css(“color”,””);

隐式迭代

// 遍历内部 DOM 元素(伪数组形式存储)的过程就叫做隐式迭代。
// 简单理解:给匹配到的所有元素进行循环遍历,执行相应的方法,而不用我们再进行循环,简化我们的操作,方便我们调用。
$('div').hide();  // 页面中所有的div全部隐藏,不用循环操作

$('div').css('background','pink');//给所有div设置背景色为pink
$('ul li').css('color','skyblue');

链式编程

// 链式编程是为了节省代码量,看起来更优雅。
//原先分为两句:
//$(this).css("color","red");
//$(this).siblings().css("color","");
//jQuery链式编程 代码更简洁
$(this).css('color', 'red').sibling().css('color', ''); 

举个栗子:

    <button><div>a</div>
		快速</button>
    <button>快速</button>
    <button>快速</button>
    <button>快速</button>
    <button>快速</button>
    <button>快速</button>
    <button>快速</button>
    <script>
        $(function() {
            // 1. 隐式迭代 给所有的按钮都绑定了点击事件
            $("button").click(function() {
                // 2. 让当前元素颜色变为红色
                // $(this).css("color", "red");
                // 3. 让其余的姐妹元素不变色 
                // $(this).siblings().css("color", "");
                // 链式编程
                // $(this).css("color", "red").siblings().css("color", "");
				// 兄弟的父级变色
				// $(this).siblings().parent().css("color","red");
				//兄弟的儿子变色
				$(this).siblings().children().css("color","red");
			});
        })
    </script>

案例:淘宝服饰精品案例

思路分析:

  1. 核心原理:鼠标经过左侧盒子某个小li,就让内容区盒子相对应图片显示,其余的图片隐藏。
  2. 需要得到当前小li 的索引号,就可以显示对应索引号的图片
  3. jQuery 得到当前元素索引号 $(this).index()
  4. 中间对应的图片,可以通过 eq(index) 方法去选择
  5. 显示元素 show() 隐藏元素 hide()

代码:

<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="../lib/jquery-3.6.0.min.js" type="text/javascript" charset="utf-8"></script>

		<style type="text/css">
			* {
				margin: 0;
				padding: 0;
				font-size: 12px;
			}

			ul {
				list-style: none;
			}

			a {
				text-decoration: none;
			}

			.wrapper {
				width: 250px;
				height: 248px;
				margin: 100px auto 0;
				border: 1px solid pink;
				border-right: 0;
				overflow: hidden;
			}

			#left,
			#content {
				float: left;
			}

			#left li {
				background: url(../img/lili.jpg) repeat-x;
			}

			#left li a {
				display: block;
				width: 48px;
				height: 27px;
				border-bottom: 1px solid pink;
				line-height: 27px;
				text-align: center;
				color: black;
			}

			#left li a:hover {
				background-image: url(../img/abg.gif);
			}

			#content {
				border-left: 1px solid pink;
				border-right: 1px solid pink;
			}
		</style>

		<script type="text/javascript">
			// 入口函数
			$(function() {
				// 1. 鼠标经过左侧小li 事件
				$("#left li").mouseover(function() {
					// 2 得到当前小 li 的索引号
					var index = $(this).index();
					// console.log(index);
					
					// //3 让我们右侧的盒子相应索引号的图片显示出来就好了
					// $("#content div").eq(index).show();
					// //4 让其余的图片隐藏(兄弟元素隐藏)
					// $("#content div").eq(index).siblings().hide();
					
					// 通过链式编程将 3 4 整合为一句代码
					$("#content div").eq(index).show().siblings().hide();
					
				})
			})
		</script>
	</head>
	<body>
		<div class="wrapper">
			<ul id="left">
				<li><a href="#">女靴</a></li>
				<li><a href="#">雪地靴</a></li>
				<li><a href="#">连衣裙</a></li>
				<li><a href="#">呢大衣</a></li>
				<li><a href="#">毛衣</a></li>
				<li><a href="#">棉服</a></li>
				<li><a href="#">女裤</a></li>
				<li><a href="#">羽绒服</a></li>
				<li><a href="#">牛仔裤</a></li>
			</ul>
			<div id="content">
				<div>
					<a href="#"><img src="../img/女靴.jpg" width="200" height="250" /></a>
				</div>
				<div>
					<a href="#"><img src="../img/雪地靴.jpg" width="200" height="250" /></a>
				</div>
				<div>
					<a href="#"><img src="../img/冬裙.jpg" width="200" height="250" /></a>
				</div>
				<div>
					<a href="#"><img src="../img/呢大衣.jpg" width="200" height="250" /></a>
				</div>
				<div>
					<a href="#"><img src="../img/毛衣.jpg" width="200" height="250" /></a>
				</div>
				<div>
					<a href="#"><img src="../img/棉服.jpg" width="200" height="250" /></a>
				</div>
				<div>
					<a href="#"><img src="../img/女裤.jpg" width="200" height="250" /></a>
				</div>
				<div>
					<a href="#"><img src="../img/羽绒服.jpg" width="200" height="250" /></a>
				</div>
				<div>
					<a href="#"><img src="../img/牛仔裤.jpg" width="200" height="250" /></a>
				</div>
			</div>
		</div>
	</body>
</html>

jQuery 样式操作

jQuery中常用的样式操作有两种:CSS()设置类样式方法

方法一:操作CSS方法

jQuery可以使用css方法来修改简单元素样式;也可以操作类,修改多个样式。常用以下三种形式:

// 1.参数只写属性名,则是返回属性值
var strColor = $(this).css('color');

// 2.  参数是属性名,属性值,逗号分隔,是设置一组样式,属性必须加引号,值如果是数字可以不用跟单位和引号(不加引号的话必须是数字,且不能加单位,且默认单位为px)
$(this).css(''color'', ''red'');

// 3.  参数可以是对象形式,方便设置多组样式。属性名和属性值用冒号隔开, 属性可以不用加引号,复合属性必须采用驼峰命名法,如果值不是数字,需要加引号

			// 通过对象+引号设置多种样式:
			$("div").css({
				"width":"400px",
				"height":"400px",
				"background-color":"skyblue"
			})
			//如果用对象且不加引号写法,那么复合属性必须采用驼峰命名法,如果值不是数字,需要加引号(默认单位为px)
			$("div").css({
				width:400,
				height:400,
				backgroundColor:"skyblue"
			})
		})

注意:css() 多用于样式少时操作,多了则不太方便

方法二:设置类样式操作方法

jQuery 可以使用 css 方法来修改简单元素样式; 也可以操作类,修改多个样式。常用以下三种形式 :

// 1.追加类
$("div").addClass("current");//类名不用添加 .

// 2.删除类
$("div").removeClass("current");

// 3.切换类//没有就加上,有就切换
$("div").toggleClass("current");

注意:

  1. 设置类样式方法比较适合样式多时操作,可以弥补css()的不足。
  2. 原生 JS 中 className 会覆盖元素原先里面的类名,jQuery 里面类操作只是对指定类进行操作(追加,删除,切换),不影响原先的类名。
  3. 类名不用加 .

举个栗子:

<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="../lib/jquery-3.6.0.min.js" type="text/javascript" charset="utf-8"></script>
		<style type="text/css">
			.one {
				width: 200px;
				height: 200px;
				background-color: pink;
				margin: 0 auto;
				transition: all 0.5s;
				
			}

			.two {
				width: 300px;
				height: 300px;
				background-color: skyblue;
				margin: 0 auto;
				transform: rotate(360deg);
			}
		</style>
	</head>
	<body>
		<div class="one"></div>
		<script type="text/javascript">
		// 原生js通过className修改类名,该方法会覆盖掉之前所有的类名,只保留新的类名
			// var one = document.querySelector(".one");
			// one.onclick = function(){
			// 	this.className = "two";
			// }
			
			//  jQuery 通过添加类名方法(addClass)可以做到在不覆盖之前类名时追加类名
			$(function() {
				$(".one").click(function(){
					$(".one").addClass("two");//div.class = "one two"
				})
			})
		</script>
	</body>
</html>

jQuery 动画效果

jQuery 给我们封装了很多动画效果,最为常见的如下:

  • 显示隐藏:show() / hide() / toggle() ;
  • 滑入滑出:slideDown() / slideUp() / slideToggle() ;
  • 淡入淡出:fadeIn() / fadeOut() / fadeToggle() / fadeTo() ;
  • 自定义动画:animate() ;

注意:

  1. 动画或者效果一旦触发就会执行,如果多次触发,就造成多个动画或者效果排队执行。
  2. jQuery为我们提供另一个方法,可以停止动画排队:stop() ;

显示隐藏

显示隐藏动画,常见有三个方法:show() / hide() / toggle() ;

​ 语法规范如下:

  1. 显示语法规范:

    • show([speed,[easing],[fn]]);
      
    • 显示参数

      • 参数都可以省略,无动画,直接显示

      • speed:三种预定速度之一的字符串(“slow”,"nomal","fast")或表示动画时长的毫秒数值(如:1000)

      • easing:(Optional)用来指定切换效果,默认时"swing",可用参数“linear”

      • fn:回调函数,在动画完成时执行的函数,每个元素执行一次

  2. 隐藏语法规范:

    • hide([speed,[easing],[fn]]);
      
    • 显示参数

      • 参数都可以省略,无动画,直接显示

      • speed:三种预定速度之一的字符串(“slow”,"nomal","fast")或表示动画时长的毫秒数值(如:1000)

      • easing:(Optional)用来指定切换效果,默认时"swing",可用参数“linear”

      • fn:回调函数,在动画完成时执行的函数,每个元素执行一次

  3. 切换语法规范:

    • toggle([speed,[easing],[fn]]);
      
      • 参数都可以省略,无动画,直接显示

      • speed:三种预定速度之一的字符串(“slow”,"nomal","fast")或表示动画时长的毫秒数值(如:1000)

      • easing:(Optional)用来指定切换效果,默认时"swing",可用参数“linear”

      • fn:回调函数,在动画完成时执行的函数,每个元素执行一次

举个栗子

<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			div{
				width: 150px;
				height: 300px;
				background-color: pink;
			}
		</style>
		<script src="../lib/jquery-3.6.0.min.js" type="text/javascript" charset="utf-8"></script>
	</head>
	<body>
		<button>显示</button>
		<button>隐藏</button>
		<button>切换</button>
		<div></div>
		<script type="text/javascript">
		$(function(){
			$("button").eq(0).click(function(){
				$("div").show(1000,function(){
					alert(1);
				});
			})
			$("button").eq(1).click(function(){
				$("div").hide("swing");
			})
			$("button").eq(2).click(function(){
				$("div").toggle("swing");
			})
		});
		</script>
	</body>
</html>

案例:tab 栏切换

案例分析:

  1. 点击上部的li,当前li添加current类,其余兄弟移除类
  2. 点击的同时,获得当前li的索引号
  3. 让下部里面相应索引号的item显示,其余的item隐藏
<html lang="en">
	<head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<meta http-equiv="X-UA-Compatible" content="ie=edge">
		<title>Document</title>
		<script src="../lib/jquery-3.6.0.min.js" type="text/javascript" charset="utf-8"></script>
		<style>
			* {
				margin: 0;
				padding: 0;
			}

			li {
				list-style-type: none;
			}

			.tab {
				width: 978px;
				margin: 100px auto;
			}

			.tab_list {
				height: 39px;
				border: 1px solid #ccc;
				background-color: #f1f1f1;
			}

			.tab_list li {
				float: left;
				height: 39px;
				line-height: 39px;
				padding: 0 20px;
				text-align: center;
				cursor: pointer;
			}

			.tab_list .current {
				background-color: #c81623;
				color: #fff;
			}

			.item_info {
				padding: 20px 0 0 20px;
			}

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

	<body>
		<div class="tab">
			<div class="tab_list">
				<ul>
					<li class="current">商品介绍</li>
					<li>规格与包装</li>
					<li>售后保障</li>
					<li>商品评价(50000)</li>
					<li>手机社区</li>
				</ul>
			</div>
			<div class="tab_con">
				<div class="item" style="display: block;">
					商品介绍模块内容
				</div>
				<div class="item">
					规格与包装模块内容
				</div>
				<div class="item">
					售后保障模块内容
				</div>
				<div class="item">
					商品评价(50000)模块内容
				</div>
				<div class="item">
					手机社区模块内容
				</div>

			</div>
		</div>

		<script type="text/javascript">
			$(function() {
				// 1. 点击上部的li,当前li添加current类,其余兄弟移除类
				// 1.1先给小li绑定点击事件 隐式迭代
				$(".tab_list li").click(function() {
					// 链式编程 
				// 1.2 点击后给li添加current类 其余兄弟移除current类 
				$(this).addClass("current").siblings().removeClass("current");
				
				// 2. 点击的同时,获得当前li的索引号
				var index = $(this).index();
				// console.log(index);
				
				// 3. 让下部tab_con里面相应索引号的item显示,其余的item隐藏
				$(".tab_con .item").eq(index).show().siblings().hide();
				});
			})
		</script>
	</body>
</html>

事件切换

hover([over],out)
  1. over:鼠标移到元素上要触发的函数(相当于mouseenter)
  2. out:鼠标移出元素要触发的函数(相当于mouseleave)

案例:简洁版滑动下拉菜单

<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
	<script src="../lib/jquery-3.6.0.min.js"></script>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        
        li {
            list-style-type: none;
        }
        
        a {
            text-decoration: none;
            font-size: 14px;
        }
        
        .nav {
            margin: 100px;
        }
        
        .nav>li {
            position: relative;
            float: left;
            width: 80px;
            height: 41px;
            text-align: center;
        }
        
        .nav li a {
            display: block;
            width: 100%;
            height: 100%;
            line-height: 41px;
            color: #333;
        }
        
        .nav>li>a:hover {
            background-color: #eee;
        }
        
        .nav ul {
            display: none;
            position: absolute;
            top: 41px;
            left: 0;
            width: 100%;
            border-left: 1px solid #FECC5B;
            border-right: 1px solid #FECC5B;
        }
        
        .nav ul li {
            border-bottom: 1px solid #FECC5B;
        }
        
        .nav ul li a:hover {
            background-color: #FFF5DA;
        }
    </style>
    
</head>

<body>
    <ul class="nav">
        <li>
            <a href="#">微博</a>
            <ul>
                <li>
                    <a href="">私信</a>
                </li>
                <li>
                    <a href="">评论</a>
                </li>
                <li>
                    <a href="">@我</a>
                </li>
            </ul>
        </li>
        <li>
            <a href="#">微博</a>
            <ul>
                <li>
                    <a href="">私信</a>
                </li>
                <li>
                    <a href="">评论</a>
                </li>
                <li>
                    <a href="">@我</a>
                </li>
            </ul>
        </li>
        <li>
            <a href="#">微博</a>
            <ul>
                <li>
                    <a href="">私信</a>
                </li>
                <li>
                    <a href="">评论</a>
                </li>
                <li>
                    <a href="">@我</a>
                </li>
            </ul>
        </li>
        <li>
            <a href="#">微博</a>
            <ul>
                <li>
                    <a href="">私信</a>
                </li>
                <li>
                    <a href="">评论</a>
                </li>
                <li>
                    <a href="">@我</a>
                </li>
            </ul>
        </li>
    </ul>
	<script>
	$(function(){
		// // 鼠标经过
		// $(".nav>li").mouseover(function(){
		// 	// $(this) jQuery 当前元素 this不要加引号
		// 	// show() 显示元素 hide()隐藏元素
		// 	$(this).children('ul').slideDown(500);
		// })
		// // 鼠标离开
		// $(".nav>li").mouseout(function(){
		// 	$(this).children("ul").slideUp(500);
		// })
		
		// 1、事件切换 hover :就是鼠标经过和离开的复合写法
		// $(".nav>li").hover(function(){
		// 	$(this).children('ul').slideDown(500);
		// },function(){
		// 	$(this).children("ul").slideUp(500);
		// })
		
		
		// 2、事件切换 hover :如果只写一个函数,那么鼠标经过和鼠标离开都会触发这个函数
		$(".nav>li").hover(function(){
			$(this).children("ul").slideToggle(200);
		});
	})
	</script>
</body>

</html>

这个案例有个小问题,就是动画一旦出发就会执行,形成动画队列

动画队列及其停止排队方法

动画或者效果一旦触发就会执行,如果多次触发,就造成多个动画或者效果队列执行。

停止排队:

stop();
  1. stop() 方法用于停止动画或效果
  2. stop() 写道动画或者效果的前面,相当于停止结束上一次的动画

举个栗子:给上面 事件切换的案例的效果前面添加stop()

$(".nav>li").hover(function(){
			// stop() 方法必须写在动画或效果前面,如果写在后面则相当于该效果不执行
			$(this).children("ul").stop().slideToggle(200);
		});

淡入淡出效果

淡入效果语法规范

fadeIn([speed,[easing],[fn]])
  1. 参数都可以省略
  2. speed:三种预定速度之一的字符串(”slow“,”normal“,”fast“)或表示动画时长的毫秒数值(如:1000)
  3. easing:(Optional)用来指定切换效果,默认是”swing“,可用参数”linear“
  4. fn:回调函数,在动画完成时执行的函数,每个元素执行一次

淡出效果语法规范

fadeOut([speed,[easing],[fn]])
  1. 参数都可以省略
  2. speed:三种预定速度之一的字符串(”slow“,”normal“,”fast“)或表示动画时长的毫秒数值(如:1000)
  3. easing:(Optional)用来指定切换效果,默认是”swing“,可用参数”linear“
  4. fn:回调函数,在动画完成时执行的函数,每个元素执行一次

渐进方式调整到指定的不透明度

fadeTo([speed],opacity,[easing],[fn])

效果参数:

  1. opacity 透明度必须写,取值 0-1之间。
  2. speed:三种预定速度之一的字符串(”slow“,”normal“,”fast“)或表示动画时长的毫秒数值(如:1000)
  3. easing:(Optional)用来指定切换效果,默认是”swing“,可用参数”linear“
  4. fn:回调函数,在动画完成时执行的函数,每个元素执行一次

举个栗子

<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			div{
				width: 150px;
				height: 300px;
				background-color: pink;
				display:none;
			}
		</style>
		<script src="../lib/jquery-3.6.0.min.js" type="text/javascript" charset="utf-8"></script>
	</head>
	<body>
		<button>淡入效果</button>
		<button>淡出效果</button>
		<button>淡入淡出切换</button>
		<button>修改透明度</button>
		<div></div>
		<script type="text/javascript">
		$(function(){
			$("button").eq(0).click(function(){
				// 淡入效果
				$("div").fadeIn(1000);
			})
			
			$("button").eq(1).click(function(){
				// 淡出效果
				$("div").fadeOut(1000);
			})
			
			$("button").eq(2).click(function(){
				// 淡入淡出切换
				$("div").fadeToggle(1000);
			})
			
			$("button").eq(3).click(function(){
				// 修改透明度
				$("div").fadeTo(1000,0.2);
			})
		});
		</script>
	</body>
</html>

淡入淡出及突出显示案例

<html>
	<head lang="en">
		<meta charset="UTF-8">
		<title></title>
		<style type="text/css">
			* {
				margin: 0;
				padding: 0;
			}

			ul {
				list-style: none;
			}

			body {
				background: #000;
			}

			.wrap {
				margin: 100px auto 0;
				width: 630px;
				height: 394px;
				padding: 10px 0 0 10px;
				background: #000;
				overflow: hidden;
				border: 1px solid #fff;
			}

			.wrap li {
				float: left;
				margin: 0 10px 10px 0;
			}

			.wrap img {
				display: block;
				border: 0;
			}
		</style>
		<script src="../lib/jquery-3.6.0.min.js"></script>
		<script type="text/javascript">
			$(function() {
				// 当鼠标进入的时候,其他的li标签透明度:0.5
				$(".wrap li").hover(function() {
					// 别忘了加停止动画 stop()
					$(this).siblings().stop().fadeTo(400, 0.5);
				}, function() {
					$(this).siblings().stop().fadeTo(400, 1);
				})
				//当鼠标离开时,其他li 透明度改为1
			})
		</script>
	</head>

	<body>
		<div class="wrap">
			<ul>
				<li>
					<a href="#"><img src="../img/01.jpg" alt="" /></a>
				</li>
				<li>
					<a href="#"><img src="../img/02.jpg" alt="" /></a>
				</li>
				<li>
					<a href="#"><img src="../img/03.jpg" alt="" /></a>
				</li>
				<li>
					<a href="#"><img src="../img/04.jpg" alt="" /></a>
				</li>
				<li>
					<a href="#"><img src="../img/05.jpg" alt="" /></a>
				</li>
				<li>
					<a href="#"><img src="../img/06.jpg" alt="" /></a>
				</li>
			</ul>
		</div>
	</body>

</html>

自定义动画 animate

animate(params,[speed],[easing],[fn]);
  1. params:想要更改的样式属性,以对象形式传递,必须写。属性名可以不用带引号,如果是复合属性则需要采用驼峰命名法 borderLeft。其余参数都可以省略。
  2. speed:三种预定速度之一的字符串(”slow“,”normal“,”fast“)或表示动画时长的毫秒数值(如:1000)
  3. easing:(Optional)用来指定切换效果,默认是”swing“,可用参数”linear“
  4. fn:回调函数,在动画完成时执行的函数,每个元素执行一次

举个栗子:

		<script type="text/javascript">
			$(function(){
				$("button").click(function(){
					$("div").animate({
						width:500,
						left:500,
						top:300,
						opacity:0.4
					},500);
				})
			})
		</script>

王者荣耀手风琴效果

王者荣耀手风琴效果

布局分析:

首先一个大的盒子包裹(class = "king"),里面由ul包裹七个小li,每个小li里面由一个a标签包裹两个img标签,分别存放一个大图和一个小图,小图片用定位方式定位到大图片左上角,所有小图片浮动起来。正常情况下能看到小图片,看不到大图片,点击小图片会展开大图片,当前默认的能看到大图片,看不到小图片

案例分析:

  1. 鼠标经过某个小li 有两步操作:
  2. 当前小li宽度变为224px,同时里面的小图片淡出,大图片淡入
  3. 其余兄弟小li 宽度变为69px,小图片淡入,大图片淡出

代码:

<!doctype html>
<html>

	<head>
		<meta charset="utf-8">
		<title>手风琴案例</title>

		<style type="text/css">
			* {
				margin: 0;
				padding: 0;
			}

			img {
				display: block;
			}

			ul {
				list-style: none;
			}

			.king {
				width: 852px;
				margin: 100px auto;
				background: url(../img/bg.png) no-repeat;
				overflow: hidden;
				padding: 10px;
			}

			.king ul {
				overflow: hidden;
			}

			.king li {
				position: relative;
				float: left;
				width: 69px;
				height: 69px;
				margin-right: 10px;
			}

			.king li.current {
				width: 224px;
			}

			.king li.current .big {
				display: block;
			}

			.king li.current .small {
				display: none;
			}

			.big {
				width: 224px;
				display: none;
			}

			.small {
				position: absolute;
				top: 0;
				left: 0;
				width: 69px;
				height: 69px;
				border-radius: 5px;
			}
		</style>

	</head>

	<body>
		<script src="../lib/jquery-3.6.0.min.js"></script>
		<script type="text/javascript">
			$(function() {
				$(".king li").mouseover(function() {
					//当前小li宽度变为224px,同时里面的小图片淡出,大图片淡入
					$(this).animate({
						width: 224
					}).find(".small").stop().fadeOut().siblings(".big").stop().fadeIn();

					// 其余兄弟小li 宽度变为69px,小图片**淡入**,大图片**淡出**
					$(this).siblings("li").animate({
						width:69
					}).find(".small").stop().fadeIn().siblings(".big").stop().fadeOut();
				})

			})
		</script>


		<div class="king">
			<ul>
				<li class="current">
					<a href="#">
						<img src="../img/m1.jpg" alt="" class="small">
						<img src="../img/m.png" alt="" class="big">
					</a>
				</li>
				<li>
					<a href="#">
						<img src="../img/l1.jpg" alt="" class="small">
						<img src="../img/l.png" alt="" class="big">
					</a>
				</li>
				<li>
					<a href="#">
						<img src="../img/c1.jpg" alt="" class="small">
						<img src="../img/c.png" alt="" class="big">
					</a>
				</li>
				<li>
					<a href="#">
						<img src="../img/w1.jpg" alt="" class="small">
						<img src="../img/w.png" alt="" class="big">
					</a>
				</li>
				<li>
					<a href="#">
						<img src="../img/z1.jpg" alt="" class="small">
						<img src="../img/z.png" alt="" class="big">
					</a>
				</li>
				<li>
					<a href="#">
						<img src="../img/h1.jpg" alt="" class="small">
						<img src="../img/h.png" alt="" class="big">
					</a>
				</li>
				<li>
					<a href="#">
						<img src="../img/t1.jpg" alt="" class="small">
						<img src="../img/t.png" alt="" class="big">
					</a>
				</li>
			</ul>

		</div>
	</body>
</html>

jQuery 属性操作

设置或获取元素固有属性值

获取元素本身自带的属性,比如<a> 元素里面的href ,比如<input> 元素里面的type。

方法:prop("属性名")

举个栗子:

		<script type="text/javascript">
			$(function(){
				// element.prop("属性名") 获取属性值
				console.log($("a").prop("href"));
				// 设置a标签中title属性为自定义
				$("a").prop("title","所发放的方法");
				// 当复选框状态改变时,获取当前状态
				$("input").change(function(){
					console.log($(this).prop("checked"));
				})
			})
		</script>

设置或获取元素自定义属性值

方法:attr()

举个栗子:

// 获取自定义属性
console.log($("div").attr("index"));
// h5自定义属性
console.log($("div").attr("data-index"));
// 修改自定义属性:
$("div").attr("index","sdd");

数据缓存 data()

data()方法可以在指定的元素上存取数据,并不会修改DOM元素结构。一旦页面刷星,之前存放的数据都将被移除。

  1. 附加数据语法:

    data("name","value") //向被选元素附加数据
    
  2. 获取数据语法

    data("name") //向被选元素获取数据
    
  3. 读取HTML5自定义属性 data-index ,得到的是数字型

    • 这个方法获取data-index h5自定义属性 不用写data- 而且返回的是数字型(不包括字符)

      // 数据缓存 data() 里面的数据是存放在元素的内存里面
      $("span").data("uname","shabi");
      console.log($("span").data("uname"));
      console.log($("div").data("index"));
      

购物车模块-全选

案例分析:

  1. 全选思路:里面3个小的复选框按钮(j-checkbox)选中状态(checked)跟着全选按钮(checkall)走。
  2. 因为checked 是复选框的固有属性,此时我们需要利用prop()方法获取和设置该属性。
  3. 把全选按钮状态赋值给3小复选框就可以了。
  4. 当我们每次点击小的复选框按钮,就来判断:
  5. 如果小复选框被选中的个数等于3 就应该把全选按钮选上,否则全选按钮不选。
  6. checked 选择器 :checked 查找被选中的表单元素。
$(function(){
	// 1.全选 /全部选功能模块
	// 就是把全选按钮(checkall) 的状态赋值给 三个小按钮(j-checkbox)就可以了
	// 事件可以使用change
	$(".checkall").change(function(){
		console.log();
		var index = $(this).prop("checked");
		// 下面那个全选按钮也要绑定,
		$(".j-checkbox, .checkall").prop("checked",index);
	})
	
	// 2. 通过小复选框控制全选按钮 如果小复选框选中的个数等于3,就把上下两个全选按钮选上,否则全选按钮不选
	$(".j-checkbox").change(function(){
		// if(被选中的小的复选框个数与所有小复选框个数相同){
		// 	全选按钮选中
		// }else{
		// 	不选中全选按钮
		// }
		// 通过checked 选择器 :checked 查找被选中的表单元素
		// console.log($(".j-checkbox:checked").length);
		// $(".j-checkbox").length:所有小复选框个数
		if($(".j-checkbox:checked").length===$(".j-checkbox").length){
			$(".checkall").prop("checked",true);
		}else{
			$(".checkall").prop("checked",false);
		}
	})
})

jQuery 内容文本值

主要针对元素的内容还有表单的值的操作

普通元素内容html()

该方法相当于原生 innerHTML

html()  //获取元素的内容,能够获得元素内的其他元素及内容

举个栗子:

<div>
<span>sdfa</span>
</div>
<input type="text" name="" id="" value="请输入内容" />
<script type="text/javascript">
// 获取设置元素内容
console.log($("div").html());
$("div").html("123");
console.log($("div").html());
</script>
/*
			<span>sdfa</span>
		
123
*/

普通元素文本内容text()

相当于原生 innerText

text() //获取元素内容(忽略其他子元素)
test("文本内容") //修改元素文本内容

举个栗子:

//修改文本内容(忽略标签)
$("div").html("456");
//获取文本内容(忽略标签)
console.log($("div").text());//456

获取/修改表单中的值

//修改表单中的值
$("input").val("789");
//获取表单中的值
console.log($("input").val());//789

购物车模块-增减商品数量

案例分析:

  1. 核心思路:首先声明一个变量,当我们点击+号(increment),就让这个值++,然后赋值给文本框。
  2. 注意1:只能增加本商品的数量,就是当前+号的兄弟文本框(itxt)的值
  3. 修改表单的值是val()方法
  4. 注意2:这个变量初始值应该是这个文本框的值,在这个值的基础上++。因此要获取表单的值。
  5. 减号(decrement)思路同理,但是如果文本框的值是1,就不能再减了。
	// 3. 增减商品数量模块 
	/* 首先声明一个变量,当我们点击+号时(increment),就让这个值++,然后赋值给文本框 */
	$(".increment").click(function(){
		// 得到当前兄弟文本框的值val
		// console.log($(".itxt").val());
		var n = $(this).siblings(".itxt").val();
		// console.log(n);
		n++;
		$(this).siblings(".itxt").val(n);
	})
	
	// 减号 - 同上 把increment改为decrement,把n++改为n--,但要注意 n最小为1
	$(".decrement").click(function(){
		// 得到当前兄弟文本框的值val
		// console.log($(".itxt").val());
		var n = $(this).siblings(".itxt").val();
		// console.log(n);
		// if(n!=1){
		// 	n--;
		// }
		if(n==1){
			return false;
		}
		n--;
		$(this).siblings(".itxt").val(n);
	})
	// 3. 增减商品数量模块

购物车模块-修改商品小计

案例分析:

  1. 核心思路:每次点击+号或者-号,根据文本框的值 乘以 当前商品的价格 就是 商品的小计
  2. 注意1: 只能增加本商品的小计, 就是当前商品的小计模块(p-sum)
  3. 修改普通元素的内容是text() 方法
  4. 注意2: 当前商品的价格,要把¥符号去掉再相乘 截取字符串 substr(1)
  5. parents(‘选择器’) 可以返回指定祖先元素
  6. 最后计算的结果如果想要保留2位小数 通过 toFixed(2) 方法
  7. 用户也可以直接修改表单里面的值,同样要计算小计。 用表单change事件
  8. 用最新的表单内的值 乘以 单价即可 但是还是当前商品小计
// 2. 增减商品数量模块  3.计算小计模块
	/* 首先声明一个变量,当我们点击+号时(increment),就让这个值++,然后赋值给文本框 */
	$(".increment").click(function() {
		// 得到当前兄弟文本框的值val
		// console.log($(".itxt").val());
		var n = $(this).siblings(".itxt").val();
		// console.log(n);
		n++;
		$(this).siblings(".itxt").val(n);

		// 计算小计模块  根据文本框的值 乘以 当前商品的价格,就是商品总价(小计)
		// var p = $(this).parent(".quantity-form").parent(".p-num").siblings(".p-price").html();

		// 使用parents(),获得当前元素所有父辈,参数可以填指定父辈元素
		var p = $(this).parents(".p-num").siblings(".p-price").html();
		// console.log(p);
		p = (p.substr(1) * n).toFixed(2);
		// console.log(p);
		$(this).parents(".p-num").siblings(".p-sum").html("¥" + p);
		getSum();
	})

	// 减号 - 同上 把increment改为decrement,把n++改为n--,但要注意 n最小为1
	$(".decrement").click(function() {
		// 得到当前兄弟文本框的值val
		// console.log($(".itxt").val());
		var n = $(this).siblings(".itxt").val();
		// console.log(n);
		// if(n!=1){
		// 	n--;
		// }
		if (n == 1) {
			return false;
		}
		n--;
		$(this).siblings(".itxt").val(n);

		// 计算小计模块  根据文本框的值 乘以 当前商品的价格,就是商品总价(小计)
		var p = $(this).parents(".p-num").siblings(".p-price").html();
		// console.log(p);
		p = (p.substr(1) * n).toFixed(2);
		// console.log(p);
		$(this).parents(".p-num").siblings(".p-sum").html("¥" + p);
		getSum();
	})
	// 2. 增减商品数量模块 3.计算小计模块
	//页面初始化调用计算总件数和总额函数
	getSum();
	//4、用户修改文本框的值 计算 小计模块  change事件

	$(".itxt").change(function() {
		// console.log($(this).val());
		var n = $(this).val();
		// 注意 当n小于1时,默认改为1
		if (n < 1) {
			n = 1;
		};
		$(this).val(n);
		var p = $(this).parents(".p-num").siblings(".p-price").html();
		p = (p.substr(1) * n).toFixed(2);
		$(this).parents(".p-num").siblings(".p-sum").html("¥" + p);
		getSum();

	})
	//4、用户修改文本框的值 计算 小计模块 

jQuery 元素操作

主要是遍历、创建、添加、删除元素操作

遍历元素

jQuery 隐式迭代是对同一类元素做了同样的操作,如果想要给同一类元素做不同的操作,就需要用到遍历。

语法1、

$("div").each(function(index,domEle){
xxx;
})
  1. each()方法遍历匹配的每一个元素。主要用DOM处理。each每一个。
  2. 里面的回调函数有两个参数:index是每个元素的索引号,domEle是每个DOM元素对象,不是jQuery对象
  3. 所以想要使用jQuery方法,需要给这个dom元素转换为jQuery对象$(domEle)

举个栗子:

<body>
    <div>1</div>
    <div>2</div>
    <div>3</div>
		
		<script type="text/javascript">
			$(function(){
				var sum = 0;
				var colors = ["red","blue","yellow"]
				$("div").css("color","red");
				// 如果针对于同一类元素做不同操作,需要用到遍历元素(类似for,但是比for强大)
				// 1. each()方法遍历元素
				$("div").each(function(index,domEle){
					// 回调函数第一个参数是索引号,可以自己指定索引号名称 i,index k都行
					// 回调函数第二个参数是 dom元素对象,也是自己命名
					// console.log(domEle);
					$(domEle).css("color",colors[index]);
					sum+=Number($(this).html());
				})
				console.log(sum);
			})
		</script>
</body>

方法二、

$.each($("div"),function(i,ele){
xxx;
})
  1. $.each()方法可用于遍历任何对象。主要用于数据处理,比如数组,对象
  2. 里面有两个参数,都可以自定义名称,index是每个元素的索引号,ele是遍历内容

购物车模块-计算总计和总额

案例分析:

  1. 核心思路:把所有文本框里免的值相加就是总计数量,总额同理
  2. 文本框里面的值不同,如果想要相加需要用到each遍历。申明一个变量,相加即可
  3. 点击+号 -号,会改变总计和总额,如果用户修改了文本框里面的值,同样会改变总计和总额
  4. 因此可以分装一个函数求总计和总额的,以上两个操作调用这个函数即可
  5. 注意1:总计是文本框里的值,相加用val() 总额是普通元素的内容,用text()
  6. 注意2:普通元素里面的内容要去掉¥并且转换为数字型才能相加
	// 计算总件数和总额
	function getSum() {
		var count = 0; //激素那总件数
		var money = 0; //计算总价钱
		console.log(1);
		$(".itxt").each(function(i, ele) {
			count += parseInt($(ele).val());
		});
		$(".p-sum").each(function(i, ele) {
			var temp = $(ele).text().substr(1);
			// console.log(temp);
			// count += parseInt($(ele).val());
			money += parseFloat($(ele).text().substr(1));
		});

		$(".amount-sum em").text(count);
		$(".price-sum em").text("¥" + money.toFixed(2));
	}
	// 计算总件数和总额

创建元素

//动态创建li标签
$("<li></li>");
//可以搭配append()和prepend()

在元素内部添加

element.append("内容")

把内容放入匹配元素内部最后面,类似原生appendChild

element.prepend("内容")

把内容放到匹配元素内部最前面

举个栗子:

	<body>
		<ul>
			<li>li.before</li>
		</ul>
		<div class="test">div.before</div>
		<script type="text/javascript">
			// 1.创建元素
			var li = $("<li>li.after</li>");
			// 2.添加元素
			// 内部添加
			// $("ul").append(li);//内部添加并且放到内容的最后面
			$("ul").prepend(li);//内部添加并且放到内容的最前面
		</script>
	</body>

在元素外部添加

element.after("内容")
//把内容放入目标元素后面
element.before("内容")
//把内容放到目标元素前面

举个栗子:

<div class="test">div</div>
<script type="text/javascript">		
// 3.元素外部添加元素
var div1 = $(".test").before("<div>div.before</div>")
var div2 = $(".test").after("<div>div.after</div>")
</script>

注意:

  1. 在元素内部添加元素,生成之后,他们是父子关系
  2. 在元素外部添加元素,生成之后,他们是兄弟关系

删除元素

element.remove() //删除匹配的元素本身
element.empty() //删除匹配的元素集合中所有子节点、内容
element.html("") //清空匹配的元素集合中所有子节点、内容,本质是修改内容为空

购物车模块-删除商品模块

案例分析:

  1. 核心思路:把商品remove()删除元素即可
  2. 有三个地方需要删除,1.商品后面的删除按钮 2.删除选中的商品 3.清空购物车
  3. 商品后面的删除按钮:一定是删除当前的商品,所以从$(this)出发
  4. 删除选中的商品: 先判断小的复选框按钮是否选中状态,如果是选中,则删除对应的商品
  5. 清理购物车: 则是把所有的商品全部删掉
  6. 注意,每次删除商品都要重新计算商品件数和总额(调用getSum();函数)
	// 删除商品模块 

	$(".p-action").click(function() {
		$(this).parents(".cart-item").remove();
		
		// 每次删除商品都要重新计算总件数和总额
		getSum();
	})
	
	$(".remove-batch").click(function(){
		// 删除的是小的复选框选中的商品
		$(".j-checkbox:checked").parents(".cart-item").remove();
		// 每次删除商品都要重新计算总件数和总额
		getSum();
	})
	
	$(".clear-all").click(function(){
		$(".cart-item").remove();
		// 每次删除商品都要重新计算总件数和总额
		getSum();
	})

	// 删除商品模块 

购物车模块-选中商品添加背景

案例分析:

  1. 核心思路:选中的商品添加背景,未选中移除背景
  2. 全选按钮点击:如果全选是选中的,则所有的商品添加背景,否则移除背景
  3. 小的复选框点击:如果是选中状态,则当前商品添加背景
  4. 这个背景可以通过类名修改,添加类和删除类
$(".checkall").change(function() {
		console.log();
		var index = $(this).prop("checked");
		// 下面那个全选按钮也要绑定,
		$(".j-checkbox, .checkall").prop("checked", index);
		// 全选按钮选中则给商品添加背景色
		if($(this).prop("checked")){
			// 让所有商品添加类 check-cart-item 类名
			$(".cart-item").addClass("check-cart-item");
		}else{
			// 否则移除类
			$(".cart-item").removeClass("check-cart-item");
		}
	})

	// 1.2. 通过小复选框控制全选按钮 如果小复选框选中的个数等于3,就把上下两个全选按钮选上,否则全选按钮不选
	$(".j-checkbox").change(function() {
		// if(被选中的小的复选框个数与所有小复选框个数相同){
		// 	全选按钮选中
		// }else{
		// 	不选中全选按钮
		// }
		// 通过checked 选择器 :checked 查找被选中的表单元素
		// console.log($(".j-checkbox:checked").length);
		// $(".j-checkbox").length:所有小复选框个数
		if($(this).prop("checked")){
			// 让当前商品添加类 check-cart-item 类名
			$(this).parents(".cart-item").addClass("check-cart-item");
		}else{
			// 否则移除类
			$(this).parents(".cart-item").removeClass("check-cart-item");
		}
		if ($(".j-checkbox:checked").length === $(".j-checkbox").length) {
			$(".checkall").prop("checked", true);
		} else {
			$(".checkall").prop("checked", false);
		}
		
	})

jQuery 尺寸、位置操作

jQuery 尺寸

语法 用法
width() / height() 取得匹配元素宽度和高度 只算
innerWidth() / innerHeight() 取得匹配元素宽度和高度值 包含padding
outerWidth() / outerHeight() 取得匹配元素宽度和高度值 包含 padding 、border
outerWidth(true) / outerHeight(true) 取得匹配元素宽度和高度值 包含 padding、border、margin

注意:

  1. 以上参数为空,则获取相应数值,返回的是数字型
  2. 如果参数为数字,则修改相应值
  3. 参数可以不写单位。

举个栗子

<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="../lib/jquery-3.6.0.min.js" type="text/javascript" charset="utf-8"></script>
		
		<style type="text/css">
			div{
				width: 200px;
				height: 200px;
				background-color: pink;
				padding: 10px;
				border: 15px solid #00FFFF;
				margin: 20px;
			}
		</style>
		
	</head>
	
	<body>
		<div></div>
		<script type="text/javascript">
			$(function(){
				// 1、width() / height() 获取设置元素大小
				 console.log($("div").width());//200
				 
				 console.log($("div").innerWidth());//220 = 200 + padding*2
				 
				 console.log($("div").outerWidth());//250 = 200 + padding*2 + border*2
				 
				 console.log($("div").outerWidth(true)); //290 = 200 + padding*2 + border*2 + margin*2
			})
		</script>
	</body>
</html>

注意:有了这套 API 我们将可以快速获取盒子的宽高,至于其他属性想要获取和设置,还要使用 css() 等方法配合。

jQuery 位置操作

jQuery的位置操作主要有三个: offset()、position()、scrollTop()/scrollLeft() , 具体介绍如下:

语法:

offset() //设置或获取元素偏移
  1. offset()方法设置或返回被选元素相对于文档的便宜坐标,跟父级没有关系
  2. 该方法有两个属性 left、top。offset().top:用于获取元素到文档顶部的距离;offset().left:用于获取元素到文档左侧的距离
  3. 可以设置元素的偏移:offset({top:10,left:30}); 设置当前选定的元素的偏移,于父盒子无关(即使有定位关系)

举个栗子:

<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="../lib/jquery-3.6.0.min.js" type="text/javascript" charset="utf-8"></script>
		
		<style type="text/css">
			div{
				width: 200px;
				height: 200px;
				background-color: pink;
				padding: 10px;
				border: 15px solid #00FFFF;
				margin: 20px;
			}
		</style>
		
	</head>
	
	<body>
		<div></div>
		<script type="text/javascript">
			$(function(){
				// 1、width() / height() 获取设置元素大小
				 console.log($("div").width());//200
				 
				 console.log($("div").innerWidth());//220 = 200 + padding*2
				 
				 console.log($("div").outerWidth());//250 = 200 + padding*2 + border*2
				 
				 console.log($("div").outerWidth(true)); //290 = 200 + padding*2 + border*2 + margin*2
			})
		</script>
	</body>
</html>
position()获取元素偏移
  1. position()方法用于返回被选元素相对于带有定位的父级偏移坐标,如果父级都没有定位,则以文档为准。
  2. 该方法有两个属性:left和top,用法和offset类似
  3. 该方法只能获取,不能设置

举个栗子:

<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			* {
				margin:0;
				padding: 0;
			}

			.father {
				position: relative;
				left: 100px;
				top: 100px;
				width: 300px;
				height: 300px;
				background-color: pink;
			}

			.son {
				position: absolute;
				width: 100px;
				height: 100px;
				background-color: #00FFFF;
			}
		</style>
		<script src="../lib/jquery-3.6.0.min.js" type="text/javascript" charset="utf-8"></script>
	</head>
	<body>
		<div class="father">
			<div class="son"></div>
		</div>

		<script type="text/javascript">
			$(function() {

				console.log($(".son").offset());//object()
				console.log($(".son").offset().top);//100
				$(".son").offset({
					top:100,
					left:150
				})
				console.log($(".son").offset());
				
				
				// 获取距离带有定位父级位置(偏移)position 如果没有带定位的父级,则以文档稳准
				console.log($(".son").position());
			})
		</script>
	</body>
</html>
scrollTop()/scrollLeft() 设置或获取元素被卷去的头部和左侧
  1. scrollTop() 方法设置或返回被选元素被卷去的头部(页面滚动溢出部分)。
  2. 不跟参数是获取,参数为不带单位的数字则是设置被卷去的头部。

举个栗子:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        body {
            height: 2000px;
        }
        
        .back {
            position: fixed;
            width: 50px;
            height: 50px;
            background-color: pink;
            right: 30px;
            bottom: 100px;
            display: none;
        }
        
        .container {
            width: 900px;
            height: 500px;
            background-color: skyblue;
            margin: 400px auto;
        }
    </style>
    <script src="jquery.min.js"></script>
</head>

<body>
    <div class="back">返回顶部</div>
    <div class="container">
    </div>
    <script>
        $(function() {
            $(document).scrollTop(100);
            // 被卷去的头部 scrollTop()  / 被卷去的左侧 scrollLeft()
            // 页面滚动事件
            var boxTop = $(".container").offset().top;
            $(window).scroll(function() {
                // console.log(11);
                console.log($(document).scrollTop());
                if ($(document).scrollTop() >= boxTop) {
                    $(".back").fadeIn();
                } else {
                    $(".back").fadeOut();
                }
            });
            // 返回顶部
            $(".back").click(function() {
                // $(document).scrollTop(0);
                $("body, html").stop().animate({
                    scrollTop: 0
                });
                // $(document).stop().animate({
                //     scrollTop: 0
                // }); 不能是文档而是 html和body元素做动画
            })
        })
    </script>
</body>

</html>

jQuery 事件

on 事件注册

单个事件注册:

element.事件(function(){
xxx
})
$("div").click(fuction(){
事件处理程序
})

其他事件和原生基本一致

比如 mouseover、mouseout、blur、focus、change、keydown、keyup、resize、scroll等

事件处理 on() 优势1

on() 方法在匹配元素上绑定一个或多个事件的事件处理函数

语法:

element.on(events[selector],[fn])
  1. events:一个或多个用空格隔开的事件类型,如:click keydown
  2. selector:元素的子元素选择器
  3. fn:回调函数,即绑定在元素身上的侦听函数

举个栗子:

<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="../lib/jquery-3.6.0.min.js" type="text/javascript" charset="utf-8"></script>
		<style type="text/css">
			div{
				width: 100px;
				height: 100px;
				background: #0099CC;
			}
			.current{
				background:#87CEEB;
			}
		</style>
	</head>
	<body>
		<div></div>
		<script type="text/javascript">
			$(function(){
				// 给div绑定多个事件
				// $("div").on({
				// 	mouseenter:function(){
				// 		$(this).css("background","skyblue");
				// 	},
				// 	click:function(){
				// 		$(this).css("background","pink");
				// 	},
				// 	mouseleave:function(){
				// 		$(this).css("background","#aaa");
				// 	}
				// });
				
				// 如果多个事件是相同的,可以采取下面方式
				$("div").on("mouseenter mouseleave",function(){
					$(this).toggleClass("current");
				}
			})
		</script>
	</body>
</html>

on()方法优势2

可以事件委派操作。事件委派的定义就是,把原来嫁给子元素身上的事件绑定在父元素身上,就是把事件委派给父元素

$('ul').on('click','li',function(){
alert('hello world!');
})
//click 绑定在ul身上,但是触发的对象是ul里面的小li

在此之前,有bind() ,live() ,delegate() 等方法来处理事件绑定或者事件委派,目前最新版用 on 来代替他们

on()方法优势3

动态创建的元素,click()没有办法绑定事件,on()可以给动态生成的元素绑定事件

$("div").on("click","p",function(){
	alert("可以给动态生成元素绑定事件")
})
$("div").append($("<p>动态创建p标签</p>"));

举个栗子:

<body>
    <div></div>
    <ul>
        <li>我们都是好孩子</li>
        <li>我们都是好孩子</li>
        <li>我们都是好孩子</li>
    </ul>
    <ol></ol>

    <script>
        $(function() {
            // (1) on可以绑定1个或者多个事件处理程序
            // $("div").on({
            //     mouseenter: function() {
            //         $(this).css("background", "skyblue");
            //     },
            //     click: function() {
            //         $(this).css("background", "purple");
            //     }
            // });
            $("div").on("mouseenter mouseleave", function() {
                $(this).toggleClass("current");
            });
  
            // (2) on可以实现事件委托(委派)
            // click 是绑定在ul 身上的,但是 触发的对象是 ul 里面的小li
            // $("ul li").click();
            $("ul").on("click", "li", function() {
                alert(11);
            });

            // (3) on可以给未来动态创建的元素绑定事件
            $("ol").on("click", "li", function() {
                alert(11);
            })
            var li = $("<li>我是后来创建的</li>");
            $("ol").append(li);
        })
    </script>
</body>

off 解绑事件

当某个事件上面的逻辑,在特定需求下不需要的时候,可以把该事件上的逻辑移除,这个过程我们称为事件解绑。jQuery 为我们提供 了多种事件解绑方法:die() / undelegate() / off() 等,甚至还有只触发一次的事件绑定方法 one(),在这里我们重点讲解一下 off() ;

语法:

off() 方法 可以移除通过 on() 方法 添加的事件处理程序

$("p").off() //解绑p元素所有事件处理程序
$("p").off("click") //解绑p元素上面的点击事件  后面的 foo 是侦听函数名
$("ul").off("click","li") //解绑事件委托

如果有的事件只想触发一次,用one() 来绑定事件

举个栗子:

<body>
    <div></div>
    <ul>
        <li>我们都是好孩子</li>
        <li>我们都是好孩子</li>
        <li>我们都是好孩子</li>
    </ul>
    <p>我是一个P标签</p>
	<script>
        $(function() {
  			// 事件绑定
            $("div").on({
                click: function() {
                    console.log("我点击了");
                },
                mouseover: function() {
                    console.log('我鼠标经过了');
                }
            });
            $("ul").on("click", "li", function() {
                alert(11);
            });
  
            // 1. 事件解绑 off 
            // $("div").off();  // 这个是解除了div身上的所有事件
            $("div").off("click"); // 这个是解除了div身上的点击事件
            $("ul").off("click", "li");
  
            // 2. one() 但是它只能触发事件一次
            $("p").one("click", function() {
                alert(11);
            })
        })
    </script>
</body>

trigger() 自动触发事件

有些时候,在某些特定的条件下,我们希望某些事件能够自动触发, 比如轮播图自动播放功能跟点击右侧按钮一致。可以利用定时器自动触发右侧按钮点击事件,不必鼠标点击触发。由此 jQuery 为我们提供了两个自动触发事件 trigger() 和 triggerHandler() ;

trigger()

element.click() //第一种简写形式
element.trigger("type")  //第二种自动触发模式

triggerHandler()

element.triggerHandler(type) //第三种自动触发模式

注意:

triggerHandler模式不会触发元素的默认性为(比如input标签没有光标在闪烁),这是和前面两种的区别

举个栗子:

<body>
    <div></div>
    <input type="text">
      
    <script>
    $(function() {
      // 绑定事件
      $("div").on("click", function() {
        alert(11);
      });

      // 自动触发事件
      // 1. 元素.事件()
      // $("div").click();会触发元素的默认行为
      
      // 2. 元素.trigger("事件")
      // $("div").trigger("click");会触发元素的默认行为
      $("input").trigger("focus");
      
      // 3. 元素.triggerHandler("事件") 就是不会触发元素的默认行为
      $("input").on("focus", function() {
        $(this).val("你好吗");
      });
      // 一个会获取焦点,一个不会
      $("div").triggerHandler("click");
      // $("input").triggerHandler("focus");
    });
    </script>
</body>

jQuery 多库共存

实际开发中,很多项目连续开发十多年,jQuery版本不断更新,最初的 jQuery 版本无法满足需求,这时就需要保证在旧有版本正常运行的情况下,新的功能使用新的jQuery版本实现,这种情况被称为,jQuery 多库共存。

jQuery解决方案

  1. 把里面的 $ 符号统一改为jQuery。比如 jQuery("div");
  2. jQuery 变量规定新的名称,$.noConflict() var xx = $.noConfict();

举个栗子:

		<div></div>
		<span></span>
		<script type="text/javascript">
			$(function(){
				// 假设之前版本的方法和现在版本的 $ 方法名冲突,
				function $(ele){
					return document.querySelector(ele);
				}
				console.log($("div"));
				//$.each();//老版本的$方法里没有这个方法(上面没有定义该方法),调用报错
				// 解决方法一:使用jQuery 代替 $
				jQuery.each();
				// 解决方法二:让jQuery 释放对 $ 控制权,让用户自己决定
				var suibian = jQuery.noConflict();
				console.log(suibian("span"));
				suibian.each();
				
			}

图片懒加载

图片的懒加载就是:当页面滑动到有图片的位置,图片才进行加载,用以提升页面打开的速度及用户体验,帮助减轻服务器负载

注意:

  1. 该插件必须写在所有图片的下面(现有图片才能懒加载)

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<title></title>
    		<style>
    			img {
    				display: block;
    				margin: 0 auto;
    				margin-top: 100px;
    			}
    		</style>
    	</head>
    	<body>
    		<img data-lazy-src="./pictures/冬裙.jpg"/>
    		<img data-lazy-src="/pictures/呢大衣.jpg" />
    		<img data-lazy-src="./pictures/围巾.jpg"/>
    		<img data-lazy-src="./pictures/女裤.jpg"/>
    		<img data-lazy-src="./pictures/毛衣.jpg"/>
    		<img data-lazy-src="./pictures/牛仔裤.jpg"/>
    		<img data-lazy-src="./pictures/男毛衣.jpg"/>
    		<img data-lazy-src="./pictures/皮带.jpg"/>
    		<img data-lazy-src="./pictures/皮衣.jpg"/>
    		<img data-lazy-src="./pictures/羽绒服.jpg"/>
    		<script src="./lib/jquery-3.6.0.min.js" type="text/javascript" charset="utf-8"></script>
    		<script src="./lib/EasyLazyload.min.js" type="text/javascript" charset="utf-8"></script>
    		<script>
    			lazyLoadInit({
    				coverColor: "white",
    				coverDiv: "<h1>test</h1>",
    				offsetBottom: 0,
    				offsetTopm: 0,
    				showTime: 1100,
    				onLoadBackEnd: function(i, e) {
    					console.log("onLoadBackEnd:" + i);
    				},
    				onLoadBackStart: function(i, e) {
    					console.log("onLoadBackStart:" + i);
    				}
    			});
    		</script>
    	</body>
    </html>
    
    

jQuery Ajax

Ajax 的全称是 Asynchronous Javascrip And XML(翻:异步 JavaScrip 和XML)

通俗的理解:在网页中利用XMLHttpRequest 对象和服务器进行数据交互的方式,就是Ajax

Ajax作用:让我们轻松实现网页与服务器之间的数据交互

Ajax 典型应用场景

  1. 用户名检测:注册用户时,通过Ajax 的形式,动态 检测用户名是否被占用
  2. 搜索提示:当输入搜索关键字时,通过Ajax的形式,动态 加载搜索提示列表
  3. 数据分页显示:当点击页码值的时候,根据页码动态刷新表格的数据
  4. 数据的增删改查:数据的增删改查操作都要通过ajax实现数据交互

jQuery中的Ajax

浏览器中提供的XMLHttpRequest 用法比较复杂,jQuery 对 XMLHttpRequest 进行了封装,提供了一系列Ajax相关函数,极大地降低了Ajax的使用难度

jQuery中发起Ajax请求最常用的三个方法如下:

  1. $.get()
  2. $.post()
  3. $.ajax()

$.get()函数语法

jQuery中$.get()函数的功能单一,专门用来发起get请求,从而将服务器上的资源请求到客户端使用

语法:

$.get(url,[data],[callback]) //后两个参数可选

参数含义如下:

参数名 参数类型 是否必选 说明
url string 要请求的资源地址
data object 请求资源期间要携带的参数(会发送到服务器)
callback function 请求成功时的回调函数

$.get()发起不带参数的请求

使用$.get()函数发起不带参数的请求时,直接提供请求的URL地址请求成功之后的回调函数即可,示例如下:

$.get('http://www.baidu.com',function(res)){
	console.log(res) //这里res是服务器返回的数据
}

通过XHR过滤所有ajax请求

举个栗子:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="../../lib/jquery-3.6.0.min.js" type="text/javascript" charset="utf-8"></script>
	</head>
	<body>
		<button id="btnGET">发起不带参数的GET请求</button>
	</body>
	<script type="text/javascript">
		$(function(){
			$('#btnGET').on('click',function(){
				$.get('http://www.liulongbin.top:3006/api/getbooks',function(res){
					console.log(res);
				})
			})
		})
	</script>
</html>

$.get()发起带参数的请求

$.get('http://www.baidu.com',{id:1},function(res)){
	console.log(res) //这里res是服务器返回的数据
}

$.post()函数语法

jQuery 中$.post() 函数的功能单一,专门用来发起post请求,从而向服务器提交数据

$.post(url,[data],[callback])

其中,三个参数代表含义如下:

参数名 参数类型 是否必选 说明
url string 提交数据的地址
data object 要提交的资源
callback function 数据提交成功时的回调函数

$.post()向服务器提交数据

使用$post向服务器提交数据示例:

$.post('http://www.liulongbin.top:3006/api/addbook',//请求的URL地址
{
bookname:'水浒传',author:'施耐庵',publisher:'上海图书出版社'
},//提交数据
function(res){//回调函数
console.log(res)
}
)

举个栗子:

<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="../../lib/jquery-3.6.0.min.js" type="text/javascript" charset="utf-8"></script>
	</head>
	<body>
		<button id="btnPOST">向服务器提交数据</button>
		<script type="text/javascript">
			$(function() {
				$('#btnPOST').on('click',function(){
					$.post('http://www.liulongbin.top:3006/api/addbook', //请求的URL地址
						{
							bookname: '水浒传q',
							author: '施耐庵q',
							publisher: '北京图书出版社'
						}, //提交数据
						function(res) { //回调函数
							console.log(res)
						}
					)
				})
			})
		</script>
	</body>
</html>

$.ajax()函数的语法

相比于$.get() 和 $.post() 函数,jQuery 中提供的$.ajax()函数,是一个功能比较综合的函数,它允许我们对Ajax请求经行更详细的配置

语法如下:

$.ajax({
type:'', //请求方式:get/post 等
url:'',//请求的URL地址
data:{},//这次请求要携带的数据
success:function(res){//请求成功后的回调函数

}
})

$.ajax()函数发起GET请求

使用$.ajax()发起GET请求时,只需要将type属性的值设置为’GET‘ 即可:

$.ajax({
type:'GET', //请求方式:get/post 等
url:'http://www.liulongbin.top:3006/api/getbooks',//请求的URL地址
data:{id:1},//这次请求要携带的数据
success:function(res){//请求成功后的回调函数
console.log(res)
}
})

举个栗子:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="../../lib/jquery-3.6.0.min.js" type="text/javascript" charset="utf-8"></script>
	</head>
	<body>
		<button id="btnPOST">使用ajax发起GET请求</button>
		<script type="text/javascript">
			$(function() {
				$('#btnPOST').on('click', function() {
					$.ajax({
						type: 'GET', //请求方式:get/post 等
						url: 'http://www.liulongbin.top:3006/api/getbooks', //请求的URL地址
						data: {
							//id: 1
						}, //这次请求要携带的数据
						success: function(res) { //请求成功后的回调函数
							console.log(res)
						}
					})
				})
			})
		</script>
	</body>
</html>

$.ajax()函数发起POST请求

语法同上,举个栗子:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="../../lib/jquery-3.6.0.min.js" type="text/javascript" charset="utf-8"></script>
	</head>
	<body>
		<button id="btnPOST">使用ajax发起POST请求</button>
		<script type="text/javascript">
			$(function() {
				$('#btnPOST').on('click', function() {
					$.ajax({
						type: 'POST', //请求方式:get/post 等
						url: 'http://www.liulongbin.top:3006/api/addbook', //请求的URL地址
						data: {
							bookname:'水许传',
							author:'施耐安',
							publisher:'安徽大学出版社'
						}, //这次请求要携带的数据
						success: function(res) { //请求成功后的回调函数
							console.log(res)
						}
					})
				})
			})
		</script>
	</body>
</html>

posted @ 2021-11-27 19:32  destiny-2015  阅读(528)  评论(0编辑  收藏  举报