jQuery选择器
1. jQuery基础选择器
$("选择器") // 里面直接写css选择器即可,但是要加引号
名称 | 用法 | 描述 |
---|---|---|
ID选择器 | $("#id") | 获取指定ID元素 |
全选选择器 | $("*") | 匹配所有元素 |
类选择器 | $(".class") | 获取同一类class的元素 |
标签选择器 | $(“div”) | 获取同一类标签的所有元素 |
并集选择器 | $(“div,p,li”) | 选取多个元素 |
交集选择器 | $(“li.current”) | 交集元素 |
子代选择器 | $(“ul>li”); | 使用>号,获取亲儿子层级的元素;注意不会获取孙子层级的元素 |
后代选择器 | $(“ul li”); | 使用空格,代表后代选择器,获取ul下的所有li元素,包括孙子等 |
知识铺垫
jQuery设置样式$("div").css("属性","值")
3. 隐式迭代(重要)
遍历内部DOM元素(伪数组形式存储)的过程就叫做隐士迭代
简单理解:给匹配的所有元素进行循环遍历,执行相应的方法,而不用我们在进行循环,简化我们的操作,方便我们调用
4. jQuery筛选选择器
|语法|用法|描述|
|:first|
(
"
l
i
:
f
i
r
s
t
"
)
∣
获
取
第
一
个
l
i
元
素
∣
∣
:
l
a
s
t
∣
("li:first")|获取第一个li元素| |:last|
("li:first")∣获取第一个li元素∣∣:last∣(“li:last”)|获取最后一个元素|
|:eq(index)|
(
"
l
i
:
e
q
(
2
)
"
)
∣
获
取
索
引
号
为
2
的
l
i
元
素
i
n
d
e
x
从
0
开
始
∣
∣
:
o
d
d
∣
("li:eq(2)")|获取索引号为2的li元素index从0开始| |:odd|
("li:eq(2)")∣获取索引号为2的li元素index从0开始∣∣:odd∣(“li:odd”)|获取到li元素中,选择索引号为奇数的元素|
|:even|$(“li:even”)|获取到li元素中,选择搜引号为偶数的元素|
5. jQuery筛选方法(重点)
语法 | 用法 | 说明 |
---|---|---|
parent() | $(“li”).parent(); | 查找父级 |
children(selector) | $(“li”).children(“li”) | 相当于$(“ul”).chilren(“li”) |
find(selector) | $(“ul”).find(“li”) | 相当于$(“ul li”),后代选择器 |
siblings(selectot) | $(".first").siblings(“li”) | 查找兄弟节点,不包括自己本身 |
nextAll([expr]) | $(".first").nextAll() | 查找当前元素之后所有同辈元素 |
prevtAll([expr]) | $(".last").prevtAll(); | 查找当前元素之前所有同辈元素 |
hasClass(class) | $(“div”).hasCLass(“protected”) | 查找当前元素是否含有某个特定的类,有则返回true |
eq(index) | $(“li”).eq(2) | 相当于$(“li:eq(2)”),index从0开始 |
重点记住:parent() children() find() siblings() eq()
案例下拉菜单
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="./jquery.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() 显示元素
$(this).children("ul").show();
})
//鼠标离开
$('.nav>li').mouseout(function () {
$(this).children('ul').hide();
})
})
</script>
</body>
</html>
6. jQuery 里排他思想
想要做到多选一的效果,排他思想:当前元素设置样式,其余的兄弟元素清除样式
<!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>
<script src="jquery.min.js"></script>
</head>
<body>
<button>快速</button>
<button>快速</button>
<button>快速</button>
<button>快速</button>
<button>快速</button>
<button>快速</button>
<button>快速</button>
<script>
$(function () {
// 1. 迭代隐式 给所有按钮都绑定了点击事件
$("button").click(function () {
//2. 当前元素变化背景颜色
$(this).css("background", "red");
//3. 其余的兄弟元素去掉颜色
$(this).siblings("button").css("background", "")
});
})
</script>
</body>
</html>
案例:淘宝服饰精品
案例分析
- 鼠标经过左侧盒子某个小li,就让内容区的盒子相对应图片显示,其余的图片隐藏
- 需要得到当前小li的索引号,就可以显示对应索引号的图片
- jQuery得到当前元素索引号
$(this).index();
- 中间对应的图片,可以通过eq方法去选择
- 显示元素 show(); 隐藏元素hide();
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<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(images/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(images/abg.gif);
}
#content {
border-left: 1px solid pink;
border-right: 1px solid pink;
}
</style>
<script src="jquery.min.js"></script>
<script>
$(function () {
//1. 鼠标经过事件
$("#left li").mouseover(function () {
// 2. 得到当前元素索引号
var index = $(this).index();
//3. 当前元素索引号的div盒子显示
$("#content div").eq(index).show();
//4. 除当前索引号div之外的盒子隐藏
$("#content div").eq(index).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="images/女靴.jpg" width="200" height="250" /></a>
</div>
<div>
<a href="#"><img src="images/雪地靴.jpg" width="200" height="250" /></a>
</div>
<div>
<a href="#"><img src="images/冬裙.jpg" width="200" height="250" /></a>
</div>
<div>
<a href="#"><img src="images/呢大衣.jpg" width="200" height="250" /></a>
</div>
<div>
<a href="#"><img src="images/毛衣.jpg" width="200" height="250" /></a>
</div>
<div>
<a href="#"><img src="images/棉服.jpg" width="200" height="250" /></a>
</div>
<div>
<a href="#"><img src="images/女裤.jpg" width="200" height="250" /></a>
</div>
<div>
<a href="#"><img src="images/羽绒服.jpg" width="200" height="250" /></a>
</div>
<div>
<a href="#"><img src="images/牛仔裤.jpg" width="200" height="250" /></a>
</div>
</div>
</div>
</body>
</html>
8. 链式编程
链式编程是为了节省代码量,看起来优雅
$("#content div").eq(index).show().siblings().hide();
使用链式编程一定要注意对哪个对象执行样式
2. jQuery样式操作
1. 操作CSS方法
jQuery可以使用css来修改简单元素样式;也可以操作类修改多个样式
- 参数只写属性名,则是返回属性值
$(this).css("color")
- 参数是属性名,属性值,逗号分割,是设置一组样式,属性必须加引号,值如果是数字可以不用跟单位个引号
$(this).css("color","red");
- 参数可以使对象形式,方便设置多组样式。属性名和属性值用冒号分割,属性可以不用加引号,值是数字可以不加引号和单位
$(this).css({"color":red,"font-size":"20px"})
2. 设置类样式方法
作用等同于以前的classList,可以操作类样式,注意操作类里面的参数不要加点。
- 添加类
$("div").addClass("current");
案例 tab兰切换
分析
- 点击上方的li,当前li添加current类其他兄弟移除类
- 点击的同时获取当前的索引号
- 根据索引号将item进行显示,其余兄弟隐藏
<!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>
* {
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>
<script src="jquery.min.js"></script>
</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>
$(function () {
var i;
$(".tab_list li").click(function () {
//1. 1. 点击上方的li,当前li添加current类其他兄弟移除类
$(this).addClass("current").siblings().removeClass("current");
// 2. 点击的同时获取当前的索引号
var index = $(this).index();
// console.log(index);
// 3. 根据索引号将item进行显示,其余兄弟隐藏
$(".tab_con .item").eq(index).show().siblings().hide();
})
})
</script>
</body>
</html>
3. 类操作与className的区别
原生JS中className会覆盖元素原先里面的类名
var div = doucument.querySelector("div");
div.className = "one";
是将div中的className改为one,之前的类名会消失
jQuery里面类操作只是对指定类进行操作,不影响原先的类名
$("div").addClass("one")
相当于追加一个类名,不影响之前的类名
3. jQuery效果
jQuery给我们封装了跟多动画效果,最为常见如下
- 显示隐藏:show(),hide(),toggle()
- 滑动效果:slideDown(),slideUp(),slideToggle()
- 淡入淡出:fadeln(),fadeOut(),fadeToggle(),fadeTo()
- 自定义动画:animate()
1. 显示隐藏效果
- 显示语法规范
show([speed,[easing],[fn]])
- 显示参数
- 参数都可以省略,无动画直接显示。
- speed:三种预订速度之一的字符串(“show”,“normal”,“fast”)或者表示动画时长的毫秒数值(如:1000)。
- easing:用来指定切换效果默认是“swing”,可用参数“linear”
- fn:回调函数,在动画完成后执行函数,每个元素再执行一次
- 隐藏语法规范
hide([speed,[easing],[fn]])
- 隐藏参数
- 参数都可以省略,无动画直接隐藏。
- speed:三种预订速度之一的字符串(“show”,“normal”,“fast”)或者表示动画时长的毫秒数值(如:1000)。
- easing:用来指定切换效果默认是“swing”,可用参数“linear”
- fn:回调函数,在动画完成后执行函数,每个元素再执行一次
<!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>
div {
width: 150px;
height: 300px;
background-color: pink;
}
</style>
<script src="jquery.min.js"></script>
</head>
<body>
<button>显示</button>
<button>隐藏</button>
<button>切换</button>
<div></div>
<script>
$(function () {
$("button").eq(1).click(function () {
// div 1秒钟内消失,完全消失后弹出1
$("div").hide(1000, function () {
alert(1);
});
})
$("button").eq(0).click(function () {
// div 1秒钟内消失,完全消失后弹出1
$("div").show(1000, function () {
alert(1);
});
})
$("button").eq(2).click(function () {
// div 1秒钟内消失,完全消失后弹出1
$("div").toggle(1000, function () {
});
})
// 一般情况下,我们都不加参数直接显示隐藏就可以了
});
</script>
</body>
</html>
2. 滑动效果
- 下滑动语法规范
slideDown([speed,[easing],[fn]])
- 滑动参数
- 参数都可以省略,无动画直接显示。
- speed:三种预订速度之一的字符串(“show”,“normal”,“fast”)或者表示动画时长的毫秒数值(如:1000)。
- easing:用来指定切换效果默认是“swing”,可用参数“linear”
- fn:回调函数,在动画完成后执行函数,每个元素再执行一次
- 上拉语法规范
slideUp([speed,[easing],[fn]])
- 隐藏参数
- 参数都可以省略,无动画直接隐藏。
- speed:三种预订速度之一的字符串(“show”,“normal”,“fast”)或者表示动画时长的毫秒数值(如:1000)。
- easing:用来指定切换效果默认是“swing”,可用参数“linear”
- fn:回调函数,在动画完成后执行函数,每个元素再执行一次
- 切换语法规范
slideToggle([speed,[easing],[fn]])
- 隐藏参数
- 参数都可以省略,无动画直接隐藏。
- speed:三种预订速度之一的字符串(“show”,“normal”,“fast”)或者表示动画时长的毫秒数值(如:1000)。
- easing:用来指定切换效果默认是“swing”,可用参数“linear”
- fn:回调函数,在动画完成后执行函数,每个元素再执行一次
<!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>
div {
width: 150px;
height: 300px;
background-color: pink;
display: none;
}
</style>
<script src="jquery.min.js"></script>
</head>
<body>
<button>下拉滑动</button>
<button>上拉滑动</button>
<button>切换滑动</button>
<div></div>
<script>
$(function () {
$("button").eq(0).click(function () {
//1. 下拉滑动
$("div").slideDown();
})
$("button").eq(1).click(function () {
$("div").slideUp();
//2. 上滑动
})
$("button").eq(2).click(function () {
$("div").slideToggle();
//3. 滑动切换
})
});
</script>
</body>
</html>
案例下拉菜单
<!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>
* {
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>
<script src="jquery.min.js"></script>
</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(200);
// });
// // 鼠标离开
// $(".nav>li").mouseout(function() {
// $(this).children("ul").slideUp(200);
// });
// 1. 事件切换 hover 就是鼠标经过和离开的复合写法
// $(".nav>li").hover(function () {
// $(this).children("ul").slideDown(100);
// }, function () {
// $(this).children("ul").slideUp(100);
// })
// 2. 事件切换 hover 如果只写一个函数,那么鼠标经过和鼠标离开都会触发这个函数
$(".nav>li").hover(function () {
$(this).children("ul").slideToggle(100);
})
});
</script>
</body>
</html>
3. 事件切换
hover([over,]out)
- over:鼠标移到元素上触发函数 (相当于mouseenter)
- out:鼠标离开元素触发函数(相当于mouseover)
4. 动画队列机器停止排队方法
- 动画或效果队列
动画或效果一单触发就会执行,如果多次触发,就会造成多个动画或者效果排队执行。 - 停止排队
stop()
- stop()方法用于停止动画或效果
- 注意:stop()写到动画或效果的前面,相当于停止结束上一次的动画
5. 淡入淡出效果
-
淡入淡出语法规范
fadeIn([speed,[easing],[fn]])
-
淡入参数
- 参数都可以省略,无动画直接显示。
- speed:三种预订速度之一的字符串(“show”,“normal”,“fast”)或者表示动画时长的毫秒数值(如:1000)。
- easing:用来指定切换效果默认是“swing”,可用参数“linear”
- fn:回调函数,在动画完成后执行函数,每个元素再执行一次
-
淡入淡出语法规范
fadeOut([speed,[easing],[fn]])
-
淡出参数
- 参数都可以省略,无动画直接显示。
- speed:三种预订速度之一的字符串(“show”,“normal”,“fast”)或者表示动画时长的毫秒数值(如:1000)。
- easing:用来指定切换效果默认是“swing”,可用参数“linear”
- fn:回调函数,在动画完成后执行函数,每个元素再执行一次
-
切换语法规范
fadeToggle([speed,[easing],[fn]])
-
隐藏参数
- 参数都可以省略,无动画直接隐藏。
- speed:三种预订速度之一的字符串(“show”,“normal”,“fast”)或者表示动画时长的毫秒数值(如:1000)。
- easing:用来指定切换效果默认是“swing”,可用参数“linear”
- fn:回调函数,在动画完成后执行函数,每个元素再执行一次
-
渐进方式挑中指定的不透明度
fadeTo([[speed],opacity,[easing],[fn]])
-
参数效果
- opacity 透明度必须写,取值0~1
- speed:三种预订速度之一的字符串(“show”,“normal”,“fast”)或者表示动画时长的毫秒数值(如:1000)。必须写
- easing:用来指定切换效果默认是“swing”,可用参数“linear”
- fn:回调函数,在动画完成后执行函数,每个元素再执行一次
<!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>
div {
width: 150px;
height: 300px;
background-color: pink;
display: none;
}
</style>
<script src="jquery.min.js"></script>
</head>
<body>
<button>淡入效果</button>
<button>淡出效果</button>
<button>淡入淡出切换</button>
<button>修改透明度</button>
<div></div>
<script>
$(function () {
$("button").eq(0).click(function () {
//1. 淡入
$("div").stop().fadeIn();
})
$("button").eq(1).click(function () {
//1. 淡出
$("div").stop().fadeOut();
})
$("button").eq(2).click(function () {
//1. 淡入淡出切换
$("div").stop().fadeToggle();
})
$("button").eq(3).click(function () {
//1. 更改透明度 这个速度和透明度一定要写
$("div").fadeTo(1000, 0.5)
})
})
</script>
</body>
</html>
案例鼠标聚焦
<script>
$(function () {
// 1. 当鼠标进入 其他的li标签透明度变为0.5
$(".wrap li").hover(function () {
$(this).siblings().stop().fadeTo(100, 0.5);
}, function () {
//2. 鼠标离开 其他li透明度为1
$(this).siblings().stop().fadeTo(100, 1)
})
})
</script>
6. 自定义动画animate
- 语法
animate(params,[speed],[easing],[fn])
- 参数
- params:想要更改的样式属性,以对象形式传递,必须写。属性名可以不用带引号,如果是复合属性则需要采用驼峰命名法borderLeft。其余参数都可省略
- speed:三种预订速度之一的字符串(“show”,“normal”,“fast”)或者表示动画时长的毫秒数值(如:1000)。必须写
- easing:用来指定切换效果默认是“swing”,可用参数“linear”
- fn:回调函数,在动画完成后执行函数,每个元素再执行一次
<!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>
<script src="jquery.min.js"></script>
<style>
div {
position: absolute;
width: 200px;
height: 200px;
background-color: pink;
}
</style>
</head>
<body>
<button>动起来</button>
<div></div>
<script>
$(function () {
$("button").click(function () {
$("div").animate({
left: 500,
top: 300,
opacity: 0.4,
width: 500
}, 500);
})
})
</script>
</body>
</html>
案例 手风琴效果
案例分析
- 鼠标经过有两个操作
- 当前li宽度变为224px,同时里面的小图片淡出,大图片淡入
- 其余兄弟li快读变为69px,小图片淡出,大图片淡入
<script type="text/javascript">
$(function () {
$(".king li").mouseenter(function () {
//1. 当前li宽度变为224px,同时小图淡出大图淡入
$(this).stop().animate({
width: 224,
}, 100).find(".small").stop().fadeOut().siblings(".big").stop().fadeIn();
//2. 其余兄弟li跨度变为63px小图淡入,大图淡出
$(this).siblings("li").stop().animate({
width: 69,
}, 100).find(".big").stop().fadeOut().siblings(".small").stop().fadeIn();
});
})
</script>
4. jQuery属性操作
1. 设置或获取元素的固有属性prop()
所谓的固有属性就是元素本身带的属性,比如元素里的href属性,元素里的type属性
- 获取属性语法
prop("属性")
- 设置属性值
prop("属性","属性值")
2. 设置或获取元素自定义属性值attr()
用户自己给元素添加的属性,称为自定义属性,如给div添加index = “1”。
- 获取属性语法
attr("属性") // 类似于原生getAttribute()
- 设置属性值
attr("属性","属性值") // 类似于原生setAttribute()
该方法也可以获取H5自定义属性
3. 数据缓存data()
data()方法可以在指定的元素上存取数据,并不会修改DOM元素结构。一单页面刷新,之前存放点额数据都将被移除
- 获取属性语法
data("属性")
- 设置属性值
data("属性","属性值")
<!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>
<script src="jquery.min.js"></script>
</head>
<body>
<a href="http://www.itcast.cn" title="都挺好">都挺好</a>
<input type="checkbox" name="" id="" checked>
<div index="1" data-index="2">我是div</div>
<span>123</span>
<script>
$(function () {
//1. element.prop("属性名") 获取元素固有的属性值
console.log($("a").prop("href"));
//2. 设置属性值
$("a").prop("title", "不太好");
console.log($("a").prop("title"));
//3. 通过prop获取复选框状态
$("input").change(function () {
console.log($(this).prop("checked"));
})
//4. 元素自定义属性通过attr()获取
console.log($("div").attr("index"));
$("div").attr("index", 4)
console.log($("div").attr("data-index"));
//5. 数据缓存 data() 这个里面的数据存放在元素的内存里面
$("span").data("uname", "andy");
console.log($("span").data("uname"));
//获取的是data-index H5自定义属性 不用写data- 而且返回数字型
console.log($("div").data("index"));
})
</script>
</body>
</html>
案例 购物车
购物车案例-全选
案例分析
- 全选思路:里面3个小复选框(j-checkbox)选中状态(checked)跟着全选按钮(checkall)走
- 因为checkbox是复选框固有属性,此时需要利用prop()方法获取和设置属性
- 把全选按钮状态赋值给3小复选框就可以了
- 当我们每次点击小复选框按钮就判断
- 如果小复选框被选中的个数等于3就应把全选按钮选中,否则不全选
- :checked选择器 查找被选中的表单元素
购物车案例-增减商品数量分析
案例分析
- 核心思路:首先声明一个变量,当我们点击+(increment),就让这个值++,然后赋值给文本框。
- 注意1:只能增加本商品数量,就是当前+号的兄弟文本框(itxt)的值
- 修改表单的值val()方法
- 注意2:这个变量值应该是这个文本框的值,在这基础上++,要获取表单值
- 减号(decrement)思路相同,但是文本框值是是1就不能再减了。
购物车案例-修改商品小计分析
案例分析
- 核心思路:每次点击+或-,根据文本框的值乘当前商品价格就是商品的小计
- 注意1:只能修改当前商品的小计(p-sum)
- 修改普通元素的内容使用text()方法
- 注意2:当前商品价格要去掉¥再去计算,截取字符串substr(1)
- parents(“选择器”)可以返回指定祖先元素
- 保留两位小数通过toFixed(2)方法实现
- 用户也可以直接修改变单元素,也要计算小计,用表单change事件
- 用最新的表单内的值乘以单价即可,但还是当前商品小计
购物车案例-计算总计和总额
案例分析
- 核心思路:把所有文本框值相加
- 文本框里面的志不同,如果想要相加需要用到each遍历。声明一个变量相加即可
- 点击+或-号 或者手动输入了数量 都会改变总计和总额
- 可以封装一个函数
- 注意1:总计文本框的值相加用val(),总额是普通元素用text()
购物车案例- 删除商品模块
案例分析
- 核心思路:把商品remove()删除元素即可
- 有三个地方需要删除:1. 商品后面的删除按钮;2. 删除选中商品;3. 清空购物车
- 商品后面的删除按钮:一定删除当前商品,所以从$(this)出发
- 删除选中商品:先判断小的复选框是否选中,如选中则删除
购物车案例-选中商品添加背景
案例分析
- 核心思路:选中商品添加背景,不选中移除背景即可
- 全选按钮:如果全选是选中的,则所有商品添加背景,否则移除背景
- 小的复选框点击:如果全选是选中的,则当前商品添加背景,否则移除背景
- 这个背景可以通过类名修改,添加移除类
jQuery代码
$(function () {
getSum();
//1. 全选 全不选功能模块
// 把全选按钮(checkall)状态给三个小的按钮
//事件可以使用change
$(".checkall").change(function () {
$(".j-checkbox, .checkall").prop("checked", $(this).prop("checked"));
// 更改背景颜色
getSum();
if ($(this).prop("checked")) {
//让所有商品添加 check-cart-item 类名
$(".cart-item").addClass("check-cart-item")
} else {
// 移除check-cart-item类名
$(".cart-item").removeClass("check-cart-item")
}
})
//2. 如果小复选框被选中的个数等于3就应把全选按钮选中,否则不全选
$(".j-checkbox").change(function () {
// console.log($(".j-checkbox:checked").length);
//输出 .j-checkbox元素被选中个数
// $(".j-checkbox").length是所有复选框的个数
if ($(".j-checkbox:checked").length == $(".j-checkbox").length) {
$(".checkall").prop("checked", true);
} else {
$(".checkall").prop("checked", false);
}
getSum();
//更改背景
if ($(this).prop("checked")) {
//让当前商品添加 check-cart-item 类名
$(this).parents(".cart-item").addClass("check-cart-item")
} else {
// 移除check-cart-item类名
$(this).parents(".cart-item").removeClass("check-cart-item")
}
})
//3. 声明一个变量,当我们点击+(increment),就让这个值++,然后赋值给文本框。
$(".increment").click(function () {
var i = $(this).siblings(".itxt").val();
// console.log(i);
i++;
$(this).siblings(".itxt").val(i);
//小计模块
// var p = $(this).parent().parent().siblings(".p-price").text().substr(1)
//使用parents(选择器)返回指定的祖先元素
var p = $(this).parents(".p-num").siblings(".p-price").text().substr(1)
// 保留两位小数
var price = (p * i).toFixed(2);
$(this).parents(".p-num").siblings(".p-sum").text("¥" + price)
getSum();
})
$(".decrement").click(function () {
var i = eval($(this).siblings(".itxt").val());
// console.log(i);
i == 1 ? i : i--;
// console.log(i);
$(this).siblings(".itxt").val(i);
//小计模块
var p = $(this).parents(".p-num").siblings(".p-price").text().substr(1)
$(this).parents(".p-num").siblings(".p-sum").text("¥" + (p * i).toFixed(2))
getSum();
})
//4. 用户修改文本框的值计算小计模块
$(".itxt").change(function () {
// 价钱 = 当前文本框的值 * 当前商品的单价
var price = $(this).val() * $(this).parents(".p-num").siblings(".p-price").text().substr(1);
$(this).parents(".p-num").siblings(".p-sum").text("¥" + price.toFixed(2))
getSum();
})
//5. 计算总计和总额模块
function getSum() {
var count = 0;//计算总件数
var money = 0; // 计算总价钱
//改进只计算勾选的书籍
$(".j-checkbox:checked").each(function (i, ele) {
count += parseInt($(ele).parents(".p-checkbox").siblings(".p-num").find(".itxt").val());
money += parseFloat($(ele).parents(".p-checkbox").siblings(".p-sum").text().substr(1))
})
$(".amount-sum em").text(count);
$(".price-sum em").text(money.toFixed(2))
// 只要在购物车就计算
// $(".itxt").each(function (i, ele) {
// count += parseInt($(ele).val());
// })
// $(".amount-sum em").text(count);
// $(".p-sum").each(function (i, ele) {
// money += parseFloat($(ele).text().substr(1));
// })
// $(".price-sum em").text(money.toFixed(2))
}
//6. 删除商品模块
//(1)商品后面的删除
$(".p-action a").click(function () {
$(this).parents(".cart-item").remove();
getSum();
});
//(2) 删除选中商品
$(".remove-batch").click(function () {
//删除的是小的复选框选中的商品
//使用 :checked筛选出来选中的复选框
$(".j-checkbox:checked").parents(".cart-item").remove();
getSum();
})
//(3) 清空购物车
$(".clear-all").click(function () {
$(".cart-item").remove();
getSum();
})
})
5. jQuery文本属性值
主要针对元素的内容还有表单的值操作
1. 普通元素内容html()(相当于原生innerHTML)
html() //获取元素内容
html("内容") //设置元素内容
2. 普通元素文本内容text() (相当于原生innerText)
text() //获取元素文本
text("内容") // 设置元素文本
3. 表单的值val()(相当于元素value)
val() // 获取表单的值value值
val("内容") // 设置表单的value值
6. jQuery元素操作
主要是遍历、创建、添加、删除元素操作
1. 遍历元素
jQuery隐式迭代是对同一类元素做了同样的操作。如果想给同一类元素不同的操作需要用到遍历
语法1
$("div").each(fucntion(index,domEle){xxxx;})
-
each()方法遍历匹配元素的每一个元素,主要用DOM处理.
-
回调函数的两个参数:index是每个元素的索引号,domEle是没一个DOM元素,不是jQuery对象
-
**要想使用jQuery方法需要给这个dom元素转换为jQuery对象 ( d o m E l e ) ∗ ∗ ∗ ∗ 语 法 2 ∗ ∗ ‘ (domEle)** **语法2** ` (domEle)∗∗∗∗语法2∗∗‘.each(object,function(index,element){xxx;})`
-
$.each()方法可以用于遍历任何对象。主要用于数据处理,比如数组,对象
-
里面的函数有2个参数:index是每个元素的索引号;element遍历内容
<!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>
</style>
<script src="jquery.min.js"></script>
</head>
<body>
<div>1</div>
<div>2</div>
<div>3</div>
<script>
$(function () {
// $("div").css("color", "red")
//如果要想给同一元素添加不通效果,需要遍历(类似for,但是比for更强大)
//1. each()方法遍历
var sum = 0;
var arr = ["red", "blue", "yellow"];
$("div").each(function (index, domElm) {
// 回调函数第一个参数一定是索引号
// console.log(index);
//回调函数第二个函数是dom元素对象
console.log(domElm);
$(domElm).css("color", arr[index])
sum += parseInt($(domElm).text());
})
console.log(sum);
//2. $.each()方法遍历元素 主要用于遍历数据,处理数据
$.each($("div"), function (i, ele) {
// console.log(i);
// console.log(ele);
})
$.each(arr, function (i, ele) {
console.log(ele);
})
$.each({
name: "andy",
age: 18
}, function (i, ele) {
console.log(i);
console.log(ele);
})
})
</script>
</body>
</html>
2. 创建元素
语法
$("<li></li>")
3. 添加元素
- 内部添加
element.append("内容") //把内容放入匹配元素的最后面,类似于原生的appendChild
element.prepend("内容") //把内容放入匹配元素的最前面
- 外部添加
element.after("内容") 钠元素放入目标元素的后面
element.before("内容") 钠元素放入目标元素的前面
4. 删除元素
element.remove() //删除匹配的元素(本身)
element.empty() //删除匹配的元素集合中所有的子节点
element.html("") //清空匹配的元素内容
7. jQuery尺寸、位置操作
1. jQuery尺寸
语法 | 用法 |
---|---|
width() 或height() | 取得匹配元素的宽度和高度值 只算width和height |
innerWidth() 或innerHeight() | 取得匹配元素的宽度和高度值 包括padding |
outerWidth() 或outerHeight() | 取得匹配元素的宽度和高度值 包括padding、border |
outerWidth(ture) 或outerHeight(ture) | 取得匹配元素的宽度和高度值 包括padding、border、margin |
- 以上参数为空就是获取相应值,返回类型是数字
- 如果参数为数字,则是修改响应值
- 参数可以不写单位
2. jQuery位置
位置主要有三个 offset()、position()、scrollTop()/sscrollLeft()
-
offset()设置或获取元素偏移
- offset()方法设置或返回被选元素相对于文档的偏移坐标,和父级没有关系
- 该方法有2个属性left、top。offset().top用于获取距离文档顶部的距离,offset().left用于获取距离文档左侧的距离
- 可以设置元素的偏移量
offset({top:10,left:30});
-
position()获取元素偏移量
- position()方法用于返回被选元素相对于带有定位的父级元素偏移坐标,如果父级都没有定位,则以文档为准
-
scrollTop()/scrollLeft()设置或获取元素被卷去的头部和左侧
- scrollTop()方法设置或返回被选元素被卷去的头部
案例 带有动画的返回顶部
- 核心原理:使用animate动画返回顶部
- animate函数动画有个属性scrollTop属性可以设置位置
- 但是是元素动画,因此$(“body,html”).animate({scrollTop:0})
案例 品优购电梯导航
- 当我们滚动到今日推荐模块就让电梯导航显示出来
- 点击电梯导航页面可以滚动到相应内容区域
- 核心算法:因为电梯导航模块和内容模块一一对应
- 当我们点击电梯导航某个小模块,就可以拿到当前小模块的索引号
- 就可以吧animate要移动的距离求处理:当前索引号内容区模块他的offset().top
- 然后执行即可
案例
- 当点击li 当前li添加current 其余兄弟移除
- 当我们页面滚动到内容区某个模块时 左侧电梯导航相应添加current 兄弟移除current类
- 触发事件是页面滚动 因此写到滚动事件里面
- 需要用到each 遍历内容区域大模块。each能拿到内容区的没一个模块元素和索引号
- 判断条件:被卷去的头部大于等于内容区域里面每个模块的offset().top
案例 节流阀 (互斥锁)
$(function () {
// 当我们点击小li 此时不需要执行 页面滚动事件里的 li 的背景选择 添加 current
// 节流阀 互斥锁 在点击时将flag=false此时滚动时不执行添加current 在animate事件中 启用回调函数 动画结束之后将 flag=ture
var flag = true;
//1. 显示隐藏电梯导航
toggleTool()
function toggleTool() {
if ($(document).scrollTop() > $(".recommend").offset().top) {
$(".fixedtool").fadeIn();
} else {
$(".fixedtool").fadeOut();
}
}
$(window).scroll(function () {
toggleTool();
// 页面滚动到内容区某个模块时 左侧电梯导航相应添加current 兄弟移除current类
if (flag) {
$(".floor .w").each(function (i, ele) {
if ($(document).scrollTop() >= $(ele).offset().top) {
$(".fixedtool li").eq(i).addClass("current").siblings().removeClass();
}
})
}
})
//2. 点击电梯导航可以滚动到相应内容区域
$(".fixedtool li").click(function () {
//选出对应索引号的内容区的盒子 计算移动距离
flag = false;
var current = $(".floor .w").eq($(this).index()).offset().top;
//页面滚动
$("body,html").stop().animate({
scrollTop: current
}, function () {
flag = true;
})
//点击之后 当前li添加current类名 其余兄弟 移除current
$(this).addClass("current").siblings("li").removeClass("current")
})
})