JavaScript库:即一个js文件,是一个封装好的特定的集合(方法和函数)。从封装一大堆函数的角度理解库,就是在这个库中,封装了很多预定好的函数在里面,比如动画animate、hide、show,比如获取元素等。
常见的JavaScript库:
jQuery是一个快速、简洁的JavaScript库,j——JavaScript,Query——查询
学习jQuery本质——学习调用函数和方法
官网网址:https://jquery.com/
$(function () {
... // 此处是页面DOM加载完成的入口
});
$(document).ready(function() {
... // 此处是页面DOM加载完成的入口
});
注:两种写法都是页面DOM加载完毕后再去执行js代码
1.等着DOM结构渲染完毕即可执行内部代码,不必等到所有外部资源加载完成,jQuery帮我们完成了封装。
2.相当于原生js中的DOMContentLoaded。
// $('div').hide();
$(function() {
$('div').hide();
});
// $(document).ready(function() {
// $('div').hide();
// });
1. $ 是jQuery的别称(另外的名字),在代码中可以使用jQuery代替 $ ,但一般为了方便,通常都直接使用 $
2. $ 是jQuery的顶级对象,相当于原生JavaScript中的window。把元素利用$包装成jQuery对象,就可以调用jQuery的方法
// 1. $ 是jQuery的别称(另外的名字)
// $(function() {
// alert(11);
// });
jQuery(function() { // 还可以这样写
// alert(11);
// $('div').hide();
jQuery('div').hide(); // 还可以这样写
});
// 2. $ 同样是jQuery的 顶级对象
// 1. DOM 对象:用原生js获取过来的对象就是DOM对象
var myDiv = document.querySelector('div'); // myDiv 是DOM对象
console.dir(myDiv);
// 2.jQuery 对象:用jQuery 方式获取过来的对象是jQuery 对象。 本质:通过$把DOM元素进行了包装
$('div'); // $('div'); 是一个jQuery对象
console.dir($('div'));
// 3.jQuery 对象只能使用jQuery 方法,DOM对象则使用原生的JavaScript属性和方法
myDiv.style.display = 'none';
// $('div').style.display = 'none'; // 报错。$('div')是一个jQuery对象,不能使用原生js的属性和方法
// myDiv.hide(); // 报错。 myDiv是一个DOM对象,不能使用jQuery里面的hide方法
注: console.dir(myDiv); 和 console.dir($('div')); 打印出来的结果不同,结果如下:
因为原生js比jQuery更大,原生js的一些属性和方法jQuery没有给我们封装,要想使用这些属性和方法需要把jQuery对象转换为DOM对象才能使用。
1)DOM对象转换为jQuery对象:$(DOM对象)
$('div');
2)jQuery对象转换为DOM对象(两种方式)
$('div') [index]; index 是索引号
$('div').get(index); index 是索引号
Document
(3.4.1素材)
原生 JS 获取元素方式很多,很杂,而且兼容性情况不一致,因此 jQuery 给我们做了封装,使获取元素统一标准。
$("选择器") // 里面选择器直接写 CSS 选择器即可,但是要加引号(单双均可)
jQuery 设置样式
$('div').css('属性', '值')
遍历内部 DOM 元素(伪数组形式存储)的过程就叫做隐式迭代。
简单理解:给匹配到的所有元素进行循环遍历,执行相应的方法,而不用我们再进行循环,简化我们的操作,方便我们调用
Document
惊喜不,意外不
惊喜不,意外不
惊喜不,意外不
惊喜不,意外不
- 相同的操作
- 相同的操作
- 相同的操作
$(function() {
$("ul li:first").css("color", "red");
$("ul li:eq(2)").css("color", "blue");
$("ol li:odd").css("color", "skyblue");
})
重点记住: parent() children() find() siblings() eq()
// 注意一下都是方法 带括号
$(function() {
// 1.父 parent() 返回的是最近一级的父级元素
console.log($('.son').parent());
// 2. 子
// (1) 亲儿子 children() 子代选择器 ul>li
$('.nav').children('p').css("color", "red");
// (2) 可以选里面所有的孩子 包括儿子和孙子 find()
$('.nav').find('p').css("color", "blue");
})
// 注意一下都是方法 带括号
$(function() {
// 1.兄弟元素siblings 除了自身元素之外的所有亲兄弟
$("ol .item").siblings("li").css("color", "red");
// 2.第n个元素
var index = 2;
// (1) 我们可以利用选择器的方式选择
// $("ul li:eq(2)").css("color", "blue");
// $("ul li:eq("+index+")").css("color", "blue");
// (2) 我们可以利用选择方法的方式选择
$("ul li").eq(2).css("color", "blue");
// $("ul li").eq(index).css("color", "skyblue");
// (3) 判断是否有某个类名
console.log($("div:first").hasClass("current")); // true
})
Document
想要多选一的效果,排他思想:当前元素设置样式,其余的兄弟元素清除样式。
$(this).css(“color”,”red”);
$(this).siblings(). css(“color”,””);
Document
(3.4.1素材-12-精品展示案例)
案例分析:
① 核心原理:鼠标经过左侧盒子某个小li,就让内容区盒子相对应图片显示,其余的图片隐藏。
② 需要得到当前小li 的索引号,就可以显示对应索引号的图片
③ jQuery 得到当前元素索引号 $(this).index()
④ 中间对应的图片,可以通过 eq(index) 方法去选择
⑤ 显示元素 show() 隐藏元素 hide()
$(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();
});
})
链式编程是为了节省代码量,看起来更优雅。
即原来的代码:
$(function() {
// 1. 隐式迭代 给所有按钮都绑定了点击事件
$("button").click(function() {
// 2.让当前颜色变为红色
$(this).css("color", "red");
// 3. 让其余的姐妹元素不变色
$(this).siblings().css("color", "");
})
})
变为:
$(function() {
$("button").click(function() {
$(this).css("color", "red").sibling().css("color", ''")
})
});
jQuery 可以使用 css 方法来修改简单元素样式; 也可以操作类,修改多个样式。
$(this).css(''color'');
$(this).css(''color'', ''red'');
$(this).css({
"color": "white", // 或者 backgroundColor: "yellow",
"font-size": "20px", // width: 400,
});
作用等同于以前的 classList,可以操作类样式, 注意操作类里面的参数不要加点。
$(“div”).addClass(''current'');
$(“div”).removeClass(''current'');
$(“div”).toggleClass(''current'');
Document
① 点击上部的li,当前li 添加current类,其余兄弟移除类。
② 点击的同时,得到当前li 的索引号
③ 让下部里面相应索引号的item显示,其余的item隐藏
Document
- 商品介绍
- 规格与包装
- 售后保障
- 商品评价(50000)
- 手机社区
商品介绍模块内容
规格与包装模块内容
售后保障模块内容
商品评价(50000)模块内容
手机社区模块内容
原生 JS 中 className 会覆盖元素原先里面的类名。
jQuery 里面类操作只是对指定类进行操作,不影响原先的类名。
jQuery 给我们封装了很多动画效果,最为常见的如下:
显示隐藏:
show()
hide()
toggle()
滑动
slideDown()
slideUp()
slideToggle()
淡入淡出
fadeIn()
fadeOut()
fadeToggle()
fadeTo()
自定义动画
animate()
show([speed,[easing],[fn]])
hide([speed,[easing],[fn]])
toggle([speed,[easing],[fn]])
建议:平时一般不带参数,直接显示隐藏即可。
$(function () {
// 显示 show
$("button").eq(0).click(function () {
// $("div").show("fast");
$("div").show(1000, function () {
alert(1); // function(){}函数为回调函数
});
})
// 隐藏 hide
$("button").eq(1).click(function () {
// $("div").hide("fast");
$("div").hide(1000, function () {
alert(1); // function(){}函数为回调函数
});
})
// 切换
$("button").eq(2).click(function() {
$("div").toggle(1000);
})
})
slideDown([speed,[easing],[fn]])
slideUp([speed,[easing],[fn]])
slideToggle([speed,[easing],[fn]])
hover([over,]out)
动画或者效果一旦触发就会执行,如果多次触发,就造成多个动画或者效果排队执行。
stop()
(1)stop() 方法用于停止动画或效果。
(2) 注意: stop() 写到动画或者效果的前面, 相当于停止结束上一次的动画。
Document
fadeIn([speed,[easing],[fn]])
fadeOut([speed,[easing],[fn]])
fadeToggle([speed,[easing],[fn]])
fadeTo([[speed],opacity,[easing],[fn]])
(具体见 3.4.1素材 23-高亮显示案例)
$(function() {
$(".wrap li").hover(function() {
// 鼠标进入的时候,其他li标签 透明度 为 0.5
$(this).siblings().stop().fadeTo(400, 0.5);
}, function() {
// 鼠标离开 ,其他li标签 透明度 为 1
$(this).siblings().stop().fadeTo(400, 1);
})
})
animate(params,[speed],[easing],[fn])
Document
① 鼠标经过某个小li 有两步操作:
② 当前小li 宽度变为 224px, 同时里面的小图片淡出,大图片淡入
③ 其余兄弟小li宽度变为69px, 小图片淡入, 大图片淡出
(具体见 3.4.1素材 24-手风琴案例)
所谓元素固有属性就是元素本身自带的属性,比如 元素里面的 href ,比如 元素里面的 type。
prop(''属性'')
prop(''属性'', ''属性值'')
用户自己给元素添加的属性,我们称为自定义属性。 比如给 div 添加 index =“1”。
attr(''属性'') // 类似原生 getAttribute()
attr(''属性'', ''属性值'') // 类似原生 setAttribute()
改方法也可以获取 H5 自定义属性
data() 方法可以在指定的元素上存取数据,并不会修改 DOM 元素结构(即源代码不会改变)。一旦页面刷新,之前存放的数据都将被移除。
data(''name'',''value'') // 向被选元素附加数据
date(''name'') // 向被选元素获取数据
同时,还可以读取 HTML5 自定义属性 data-index ,得到的是数字型
Document
都挺好
我是div
123
(3.4.6素材 02-购物车)
① 全选思路:里面3个小的复选框按钮(j-checkbox)选中状态(checked)跟着全选按钮(checkall)走。
② 因为checked 是复选框的固有属性,此时我们需要利用prop()方法获取和设置该属性。
③ 把全选按钮状态赋值给3小复选框就可以了。
④ 当我们每次点击小的复选框按钮,就来判断:
⑤ 如果小复选框被选中的个数等于3 就应该把全选按钮选上,否则全选按钮不选。
⑥ :checked 选择器 —— :checked 查找被选中的表单元素。
主要针对元素的内容还有表单的值操作。
html() // 获取元素的内容(小括号为空)
html(''内容'') // 设置元素的内容
text() // 获取元素的文本内容
text(''文本内容'') // 设置元素的文本内容
val() // 获取表单的值
val(''内容'') // 设置表单的值
我是内容
(3.4.6素材 02-购物车)
① 核心思路:首先声明一个变量,当我们点击+号(increment),就让这个值++,然后赋值给文本框。
② 注意1: 只能增加本商品的数量, 就是当前+号的兄弟文本框(itxt)的值。
③ 修改表单的值是val() 方法
④ 注意2: 这个变量初始值应该是这个文本框的值,在这个值的基础上++。要获取表单的值
⑤ 减号(decrement)思路同理,但是如果文本框的值是1,就不能再减了。
(3.4.6素材 02-购物车)
① 核心思路:每次点击+号或者-号,根据文本框的值 乘以 当前商品的价格 就是 商品的小计
② 注意1: 只能增加本商品的小计, 就是当前商品的小计模块(p-sum)
③ 修改普通元素的内容是text() 方法
④ 注意2: 当前商品的价格,要把¥符号去掉再相乘 截取字符串 substr(1)
⑤ parents("选择器") 可以返回指定祖先元素
⑥ 最后计算的结果如果想要保留2位小数 通过 toFixed(2) 方法
⑦ 用户也可以直接修改表单里面的值,同样要计算小计。 用表单change事件
⑧ 用最新的表单内的值 乘以 单价即可 但是还是当前商品小计
主要是遍历、创建、添加、删除元素操作。
jQuery 隐式迭代是对同一类元素做了同样的操作。 如果想要给同一类元素做不同操作,就需要用到遍历。
$("div").each(function (index, domEle) { xxx; })
$.each(object,function (index, element) { xxx; })
(3.4.6素材 02-购物车)
① 核心思路:把所有文本框里面的值相加就是总计数量。总额同理
② 文本框里面的值不相同,如果想要相加需要用到each遍历。声明一个变量,相加即可
③ 点击+号-号,会改变总计和总额,如果用户修改了文本框里面的值同样会改变总计和总额
④ 因此可以封装一个函数求总计和总额的, 以上2个操作调用这个函数即可。
⑤ 注意1: 总计是文本框里面的值相加用 val() ,总额是普通元素的内容用text()
⑥ 要注意普通元素里面的内容要去掉¥并且转换为数字型才能相加
语法:
$(''
'');
动态的创建了一个
element.append(''内容'')
把内容放入匹配元素内部最后面,类似原生 appendChild。
element.prepend(''内容'')
把内容放入匹配元素内部最前面。
element.after(''内容'') // 把内容放入目标元素后面
element.before(''内容'') // 把内容放入目标元素前面
element.remove() // 删除匹配的元素(本身)
element.empty() // 删除匹配的元素集合中所有的子节点
element.html('''') // 清空匹配的元素内容
- 原先的li
我是原先的div
(3.4.6素材 02-购物车)
① 核心思路:把商品remove() 删除元素即可
② 有三个地方需要删除: 1. 商品后面的删除按钮 2. 删除选中的商品 3. 清理购物车
③ 商品后面的删除按钮: 一定是删除当前的商品,所以从 $(this) 出发
④ 删除选中的商品: 先判断小的复选框按钮是否选中状态,如果是选中,则删除对应的商品
⑤ 清理购物车: 则是把所有的商品全部删掉
(3.4.6素材 02-购物车)
① 核心思路:选中的商品添加背景,不选中移除背景即可
② 全选按钮点击:如果全选是选中的,则所有的商品添加背景,否则移除背景
③ 小的复选框点击: 如果是选中状态,则当前商品添加背景,否则移除背景
④ 这个背景,可以通过类名修改,添加类和删除类
$(function () {
// 1.width() / height() 获取设置元素 width和height大小
console.log($("div").width()); // 200
// $("div").width(300);
// 2.innerWidth() / innerHeight() 获取设置元素 width和height + padding 大小
console.log($("div").innerWidth()); // 220
// 3.outerWidth() / outerHeight() 获取设置元素 width和height + padding + boder大小
console.log($("div").outerWidth());
// 4.outerWidth(true) / outerHeight(true) 获取设置元素 width和height + padding + boder + margin大小
console.log($("div").outerWidth(true));
})
位置主要有三个: offset()、position()、scrollTop()/scrollLeft()
$(function() {
// 1.获取设置距离文档的位置(偏移) offset
console.log($(".son").offset()); // Object {left: 110, top: 110, [[Prototype]]: ...}
console.log($(".son").offset().top); // 110
$(".son").offset({
top: 200,
left: 200
});
// 2.获取距离带有定位的父级位置(偏移) position 如果没有带有定位的父级 则以文档为准
// 这个方法只能获取不能设置
console.log($(".son").position());
})
① 核心原理: 使用animate动画返回顶部。
② animate动画函数里面有个scrollTop 属性,可以设置位置
③ 但是是元素做动画,因此 $(“body,html”).animate({scrollTop: 0})。而$("document").stop().animate({scrollTop:0})的动画效果无效
Document
返回顶部
① 当我们滚动到 今日推荐 模块,就让电梯导航显示出来
② 点击电梯导航页面可以滚动到相应内容区域
③ 核心算法:因为电梯导航模块和内容区模块一一对应的
④ 当我们点击电梯导航某个小模块,就可以拿到当前小模块的索引号
⑤ 就可以把animate要移动的距离求出来:当前索引号内容区模块它的offset().top
⑥ 然后执行动画即可
① 当我们点击电梯导航某个小li, 当前小li 添加current类,兄弟移除类名
② 当我们页面滚动到内容区域某个模块, 左侧电梯导航,相对应的小li模块,也会添加current类, 兄弟移除current类。
③ 触发的事件是页面滚动,因此这个功能要写到页面滚动事件里面。
④ 需要用到each,遍历内容区域大模块。 each里面能拿到内容区域每一个模块元素和索引号
⑤ 判断的条件: 被卷去的头部 大于等于 内容区域里面每个模块的offset().top
⑥ 就利用这个索引号找到相应的电梯导航小li添加类。