目录
1、百度换肤效果
案例分析:
- 这个案例练习的是给一组元素注册事件
- 给4个小图片利用循环注册点击事件
- 当我们点击了这个图片,我们的页面背景改为当前的图片
- 核心算法:把当前图片的src路径取过来,给body做为背景即可
<head>
<style>
*{
padding: 0;
margin: 0;
}
body {
background: url(image/1.jpg) no-repeat center top;
}
li{
list-style: none;
}
.baidu{
overflow: hidden;
margin: 100px auto;
background-color: #fff;
width: 410px;
padding-top: 3px;
}
.baidu li{
float: left;
margin: 0 1px;
cursor: pointer;
}
.baidu img{
width: 100px;
}
</style>
</head>
<body>
<div class="baidu">
<ul>
<li><img src="image/1.jpg" alt=""></li>
<li><img src="image/2.jpg" alt=""></li>
<li><img src="image/3.jpg" alt=""></li>
<li><img src="image/4.jpg" alt=""></li>
</ul>
</div>
<script>
//1.获取元素
var imgs = document.querySelector('.baidu').querySelectorAll('img');
//2.循环注册事件
for(var i = 0 ; i<imgs.length; i++){
imgs[i].onclick=function(){
//this.src 就是我们点击图片的路径 将它给body就可以了
document.body.style.backgroundImage='url(' + this.src +' )';
}
}
</script>
</body>
2、表格隔行变色效果
案例分析:
- 用到新的鼠标事件 鼠标经过onmouseover 鼠标离开onmouseout
- 核心思路:鼠标经过tr行 当前的行变背景颜色 鼠标离开就去掉当前的背景颜色
- 注意:第一行(thead里面的行)不需要变换颜色 因此我们获取的是tbody里面的行
<head>
<style>
table{
width: 800px;
margin: 100px auto;
text-align: center;
border-collapse: collapse;
font-size: 14px;
}
thead tr{
height: 30px;
background-color: skyblue;
}
tbody td{
border-bottom: 1px solid #d7d7d7;
color:blue;
}
.bg{
background-color: pink;
}
</style>
</head>
<body>
<table>
<thead>
<tr>
<th>代码</th>
<th>名称</th>
<th>最新公布净值</th>
<th>累计净值</th>
<th>前单位净值</th>
<th>净值增长率</th>
</tr>
</thead>
<tbody>
<tr>
<td>003526</td>
<td>农行金穗3个月定期开放债券</td>
<td>1.075</td>
<td>1.079</td>
<td>1.074</td>
<td>+0.047%</td>
</tr>
<tr>
<td>003526</td>
<td>农行金穗3个月定期开放债券</td>
<td>1.075</td>
<td>1.079</td>
<td>1.074</td>
<td>+0.047%</td>
</tr>
<tr>
<td>003526</td>
<td>农行金穗3个月定期开放债券</td>
<td>1.075</td>
<td>1.079</td>
<td>1.074</td>
<td>+0.047%</td>
</tr>
</tbody>
</table>
<script>
// 1.获取元素 获取的是tbody里面所以的行
var trs = document.querySelector('tbody').querySelectorAll('tr');
// 2.利用循环注册事件
for(var i = 0; i<trs.length; i++){
// 3.鼠标经过事件 onmouseover
trs[i].onmouseover = function(){
this.className = 'bg';
}
// 4.鼠标离开事件 onmouseout
trs[i].onmouseout = function(){
this.className = '';
}
}
</script>
</body>
3、表单全选和取消全选
案例分析:
- 全选和取消全选做法:让下面所有复选框的checked属性(选中状态)跟随全选按钮即可
- 下面复选框需要全部选中,上面全选才能选中做法:给下面所有复选框绑定点击事件,每次点击,都要循环查看下面所有的复选框是否有没选中的,如果有一个没选中,上面全选就不选中。
- 可以设置一个变量来控制全选是否选中
<head>
<style>
table {
width: 300px;
margin: 100px auto;
text-align: center;
border-collapse: collapse;
}
thead tr {
background-color: skyblue;
}
tbody td{
border: 1px solid #dfdfdf;
}
</style>
</head>
<body>
<table>
<thead>
<tr>
<th><input type="checkbox" id="j_cbAll"></th>
<th>商品</th>
<th>价格</th>
</tr>
</thead>
<tbody id="j_tbs">
<tr>
<td><input type="checkbox"></td>
<td>iphone8</td>
<td>8000</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>iPad Pro</td>
<td>5000</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>iPad Air</td>
<td>2000</td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>Apple Watch</td>
<td>2000</td>
</tr>
</tbody>
</table>
<script>
// 1.获取元素
var j_cbAll = document.getElementById('j_cbAll');//全选按钮
var j_tbs = document.getElementById('j_tbs').getElementsByTagName('input');//下面所有的复选框都被选中
// 2.注册事件
// 全选和取消全选做法
j_cbAll.onclick = function(){
for(var i = 0; i<j_tbs.length; i++){
// this.checked 可以得到当前复选框的选中状态 如果是true 就是选中 如果是false 就是未选中
j_tbs[i].checked = this.checked;
}
}
// 下面是复选框需全部选中 上面全选才能选中做法
for(var i = 0; i<j_tbs.length; i++){
j_tbs[i].onclick = function() {
// flag 控制全选按钮是否选中
var flag =true;
// 每次点击下面的复选框都要循环检查4个小按钮是否全被选中
for(var i = 0 ; i<j_tbs.length; i++){
if(!j_tbs[i].checked){
flag=false;
break;//退出for循环 这样可以提高执行效率 因为只要有一个没有选中 剩下的就无需
}
}
j_cbAll.checked = flag;
}
}
</script>
</body>
4、tab栏切换制作
案例分析:
- Tab栏切换有2个大的模块
- 上面是模块选项卡,点击某一个,当前这一个底色为红色,其余不变(排他思想)修改类名的方式
- 下面的模块内容会跟随上面的选项卡变化 所有下面模块变化要写到点击事件里面
- 规律:下面的模块显示内容和上面的选项卡一一对应,相匹配
- 核心思路:给上面的tab_list里面的所有li添加自定义属性,属性值从0开始编号
- 当我们点击tab_list里面的某个li,让tab_con里面对应序号的内容显示,其余隐藏(排他思想)
<head>
<style>
*{
margin: 0;
padding: 0;
}
.tab {
width: 800px;
height: 300px;
margin: 100px auto;
}
li {
list-style-type: none;
border-right: 1px solid #c0bcbc;
}
.tab_list{
height: 40px;
background-color: #dfdfdf;
}
.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 {
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>
// 获取元素
var tab_list = document.querySelector('.tab_list');
var lis = tab_list.querySelectorAll('li');
var items = document.querySelectorAll('.item');
// for循环绑定点击事件
for(var i = 0; i < lis.length; i++){
// 开始给5个li设置索引号
lis[i].setAttribute('index',i);
lis[i].onclick = function(){
// 1.上面是模块选项卡,点击某一个,当前这一个底色为红色,其余不变(排他思想)修改类名的方式
// 将所有的li的class这个类都清除掉
for(var i = 0; i < lis.length; i++){
lis[i].className = '';
}
// 给当前点击的li设置class类
this.className = 'current';
// 2.下面的显示内容模块
var index = this.getAttribute('index');
for(var i = 0; i < items.length; i++) {
items[i].style.display = 'none';
}
// 给当前点击的item显示出来
items[index].style.display = 'block';
}
}
</script>
</body>
</html>
5、动态生成表格
案例分析:
- 因为里面的学生数据都是动态的,我们需要js动态生成,这里我们使用模拟数据,自己定义好数据,数据采用对象形式存储
- 所有的数据都是放到tbody里面的行里面
- 因为行很多,所以需要循环创建多个行(对应多少人)通过数组的长度得到
- 每个行里面又有很多单元格(对应里面的数据),我们还继续使用循环创建多个单元格,并且把数据存入里面(双层for循环)
- 最后一列单元格是删除,需要单独创建单元格
<head>
<style>
* {
padding: 0;
margin: 0;
}
table {
width: 500px;
margin: 100px auto;
border-collapse: collapse;
text-align: center;
}
th,
td {
border: 1px solid #333;
}
thead tr {
height: 40px;
background-color: #ccc;
}
</style>
</head>
<body>
<table>
<thead>
<tr>
<th>姓名</th>
<th>科目</th>
<th>成绩</th>
<th>操作</th>
</tr>
</thead>
<tbody></tbody>
</table>
<script>
// 1.先准备好学生的数据
var datas = [
{
name: "小明",
subject: "javascript",
score: 100,
},
{
name: "小红",
subject: "javascript",
score: 98,
},
{
name: "小黄",
subject: "javascript",
score: 88,
}
];
// 2.在tbody创建行 有几个人就创建几行(通过数组的长度)
var tbody = document.querySelector("tbody");
// 外层for循环 行 tr
for (var i = 0; i < datas.length; i++) {
// 创建tr行
var tr = document.createElement("tr");
tbody.appendChild(tr);
// 行里面创建单元格 td (跟数据有关系的3个单元格)单元格的数量取决于每个对象里面的属性个数 for循环遍历对象 datas[i]
for (var k in datas[i]) {
//内循环 列 td
// 创建单元格
var td = document.createElement("td");
// 把对象里面的属性值 data[i][k]给 td
td.innerHTML = datas[i][k];
tr.appendChild(td);
}
// 创建有删除两个字的单元格
var td = document.createElement("td");
td.innerHTML = '<a href="javascript:;">删除</a>';
tr.appendChild(td);
}
// 4.删除操作
var as = document.querySelectorAll("a");
for (var i = 0; i < as.length; i++) {
as[i].onclick = function () {
// 点击a 删除 当前a 所在的行(链接的爸爸的爸爸) node.removeChild(child)
tbody.removeChild(this.parentNode.parentNode);
}
}
// for(var k in obj) {
// k 得到的是属性名
// obj[k] 得到是属性值
// }
</script>
</body>
</html>
6、跟随鼠标的天使
案例分析
- 鼠标不断的移动,使用鼠标移动事件:mousemove
- 在页面中移动,给document注册事件
- 图片要移动距离,而且不占位置,我们要使用绝对定位
- 核心原理:每次鼠标移动,我们都会获得最新的鼠标坐标,把这个x和y坐标作为图片的top和left值就可以移动图片
<head>
<style>
img {
position: absolute;
}
</style>
</head>
<body>
<img src="../image/angel.gif" alt="" />
<script>
var pic = document.querySelector("img");
document.addEventListener("mousemove", function (e) {
// 1.mousemove只要鼠标移动1px 就会触发这个事件
var x = e.pageX;
var y = e.pageY;
// 2.不要忘记给left和top添加px单位 -50和-40是图片的高度和宽度的一半
pic.style.left = x - 50 + "px";
pic.style.top = y - 40 + "px";
});
</script>
</body>
7、模拟京东按键输入内容案例
- 核心思路:检测用户是否按下了s键,如果按下了s键,就把光标定位到搜索框里面
- 使用键盘事件对象的属性keyCode 判断用户按下的是否是s键
- 搜索框获得焦点:使用js里面的focus()方法
<body>
<input type="text" />
<script>
var search = document.querySelector("input");
document.addEventListener("keyup", function (e) {
// console.log(e.keyCode); 用来查询s键的ASCII码值 s键为83
if (e.keyCode === 83) {
search.focus();
}
});
</script>
</body>
8、模拟京东快递单号查询
- 快递单号输入内容时 上面的大号字体盒子(con)显示(这里面的字号更大)
- 表单检查用户输入:给表单添加键盘事件
- 同时把快递单号里面的值(value)获取过来赋值给con盒子(innerText)作为内容
- 如果快递单号里面内容为空,则隐藏大号字体盒子(con)
- 当文本框失去焦点 就隐藏con盒子 当文本框获得焦点 就显示con盒子
注意:
- keydown和keypress在文本框里面的特点:他们两个事件触发的时候,文字还没有落入文本框中;
- keyup事件触发的时候,文字已经落入文本框里面了
<head>
<style>
* {
padding: 0;
margin: 0;
}
.search {
position: relative;
width: 178px;
margin: 100px;
}
.con {
display: none;
position: absolute;
top: -40px;
width: 171px;
border: 1px solid rgba(0, 0, 0, 0.2);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
padding: 5px 0;
font-size: 18px;
line-height: 20px;
color: #333;
}
/* 小三角形的做法 */
.con::before {
content: "";
width: 0;
height: 0;
position: absolute;
top: 28px;
left: 18px;
border: 8px solid #000;
border-style: solid dashed dashed;
border-color: #fff transparent transparent;
}
</style>
</head>
<body>
<div class="search">
<div class="con">123</div>
<input type="text" placeholder="请输入您的快递单号" class="jd" />
</div>
<script>
var con = document.querySelector(".con");
var jd_input = document.querySelector(".jd");
jd_input.addEventListener("keyup", function () {
if (this.value == "") {
con.style.display = "none";
} else {
com.style.display = "block";
con.innerHTML = this.value;
}
});
// 当我们失去焦点 就隐藏con盒子
jd_input.addEventListener("blur", function () {
con.style.display = "none";
});
// 当我们获得焦点 就显示con盒子
jd_input.addEventListener("focus", function () {
if (this.value != "") {
con.style.display = "block";
}
});
</script>
</body>
</html>