DOM基本概念
DOM的基本概念
DOM使JS操控HTML变得优雅
DOM是JS操控HTML和CSS的桥梁
DOM简介
DOM节点树
nodeType常用属性值
节点访问和位置的关系
访问元素节点
所谓“访问”元素节点,就是指“得到”、“获取”页面上的元素节点。
对节点进行操作,第一步就是要得到它。
访问元素节点主要依靠document对象。
认识document对象
访问元素节点的常用方法
getElementByld()
getElementsByTagName()
getElementsByClassName()
querySelector()
querySelectorAll()
节点的关系
注意
排除文本节点的干扰
书写常见的节点关系函数

<div id="box"><p id="par">我是</p><p>我是数组</p><p id="para"><span>1</span><span>2</span><span>3</span></p><p>我是数组</p><p>我是数组</p><p>我是数组</p></div><script>//得到p标签的数组var box = document.getElementById('box');var para = document.getElementById('para');//封装一个函数,这个函数可以返回元素的所有子元素节点(兼容到IE6),类似children的功能function getChildren(node) {//结果数组var children = [];//遍历node这个节点的所有子节点,判断每一个子节点的nodeType属性是不是1//如果是1,就推入结果数组for (var i = 0; i < node.childNodes.length; i++) {if (node.childNodes[i].nodeType == 1) {children.push(node.childNodes[i]);}}return children;}console.log(getChildren(box));//封装一个函数,这个函数可以返回元素的前一个元素兄弟节点(兼容到IE6),类似previousElementSibling的功能function getElemenPrevtSibling(node) {var o = node;//使用while语句while (o.previousSibling != null) {if (o.previousSibling.nodeType == 1) {//结束循环,找到了return o.previousSibling;}//让o成为它的前一个节点o = o.previousSibling;}}console.log(getElemenPrevtSibling(para));//封装第三个函数,这个函数可以返回元素的所有兄弟节点function getAllElementSibling(node) {//前面的元素兄弟节点var prevs = [];//后面的元素兄弟节点var nexts = [];var o = node;//遍历node的前面的节点while(o.previousSibling != null){if (o.previousSibling.nodeType == 1) {prevs.unshift(o.previousSibling);}o=o.previousSibling;}o = node;//遍历node的后面的节点while(o.nextSibling != null){if (o.nextSibling.nodeType == 1) {prevs.unshift(o.nextSibling);}o=o.nextSibling;}//将两个数组进行合并,然后返回return prevs.concat(nexts);}console.log(getAllElementSibling(para));</script>
节点操作
节点操作
如何改变元素节点中的内容

<div id="box"></div><script>var obox = document.getElementById('box');obox.innerHTML='<ul><li>牛奶</li> <li>牛</li></ul>';obox.innerText='<ul><li>牛奶</li> <li>牛</li></ul>';</script>
如何改变元素节点的CSS样式

<style>.box{width: 200px;height: 200px;border: 1px solid #000;}</style><div class="box" id="box"></div><script>var oBox=document.getElementById('box');oBox.style.backgroundColor='red';</script>
如何改变元素节点的HTML属性

<img src="images/bj/0.jpg" id="pic"><a href="http://www.baidu.com" id="link">去百度</a><script>var opic = document.getElementById('pic');var opi = document.getElementById('link');opic.src = 'images/bj/2.jpg';opi.href = 'http://sbj.cnipa.gov.cn/sbcx/';opi.innerText = '去商标';</script>

<div id="box"></div><script>var box = document.getElementById('box');box.setAttribute('data-n', 10);var n=box.getAttribute('data-n');alert(n);</script>
节点的创建、移除和克隆
节点的创建、移除和克隆
节点的创建
孤儿节点
appendChild()
insertBefore()

<div id="box"><p>我是段落1 </p><p>我是段落2 </p><p>我是段落3 </p></div><script>var Obox = document.getElementById('box');var ops=document.getElementsByTagName('p');//创建孤儿节点var oP=document.createElement('p');//设置内部文字oP.innerText='我是新来的';//上树//Obox.appendChild(oP);Obox.insertBefore(oP,ops[2]);</script>
小练习

<!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><style>td {width: 20px;height: 20px;border: 1px solid #000;}</style></head><body><table id="mytable"></table><script>//请动态创建出一个20行12列的表格var mytable = document.getElementById('mytable');for (var i = 0; i < 20; i++) {//创建了新的tr标签var tr = document.createElement('tr');for (var j = 0; j < 12; j++) {//创建了新的td标签var td = document.createElement('td');//让tr追加td标签tr.appendChild(td);}//让mytable追加td标签mytable.appendChild(tr);}</script></body></html>

<!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><style>td {width: 120px;height: 30px;border: 1px solid #000;}</style></head><body><table id="mytable"></table><script>//请创建九九乘法表var mytable = document.getElementById('mytable');for (var i = 1; i < 10; i++) {//创建了var tr = document.createElement('tr');for (var j = 1; j <= i; j++) {//创建了新的td标签var td = document.createElement('td');//设置td内部的文字td.innerText = i + '乘' + j + '等于' + (i * j);//让tr追加td标签tr.appendChild(td);}//让mytable追加td标签mytable.appendChild(tr);}</script></body></html>
移动节点

<div id="box1"><p id="para">我是段落移动</p></div><div id="box2"><P>我是原有</P><P>我是原有</P><P>我是原有</P><P>我是原有</P></div><script>var box1 = document.getElementById('box1');var box2 = document.getElementById('box2');var para = document.getElementById('para');var ps = document.getElementsByTagName('p');// box2.appendChild(para);box2.insertBefore(para, ps[2]);</script>
删除节点
克隆节点

<div id="box1"><ul><li>牛奶</li><li>咖啡</li><li>可乐</li></ul></div><div id="box2"></div><script>var box1 = document.getElementById('box1');var box2 = document.getElementById('box2');var theul = document.getElementsByTagName('ul')[0];var newul=theul.cloneNode(true);box2.appendChild(newul);</script>
DOM事件
事件监听
什么是“事件监听”
最简单的设置事件监听的方法
常见的鼠标事件监听

<!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><style>div {width: 200px;height: 200px;background-color: rgb(227, 19, 19);}</style></head><body><div id="box"></div><button>确认</button><script>var obox = document.getElementById('box');//给box这个盒子添加点击事件监听obox.onclick = function () {console.log('你好,我是click');}obox.ondblclick = function () {console.log('你好,我是ondblclick');}obox.onmousedown = function () {console.log('你好,我是onmousedown');}obox.onmouseup = function () {console.log('你好,我是onmouseup');}obox.onmouseenter = function () {console.log('你好,我是onmouseenter');}obox.onmouseleave = function () {console.log('你好,我是onmouseleave');}obox.onmousemove = function () {console.log('你好,我是onmousemove');}</script></body></html>
常见的键盘事件监听

<!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></head><body><input type="text" id="nameFiled"><script>var nameFiled=document.getElementById('nameFiled');nameFiled.onkeydown=function(){console.log('我是onkeydown')}nameFiled.onkeypress=function(){console.log('我是onkeypress')}nameFiled.onkeyup=function(){console.log('我是onkeyup')}</script></body></html>
常见的表单事件监听

<!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></head><body><form id="myform"><p>姓名:<input type="text" name="nameField"></p><p>年龄:<input type="text" name="ageField"></p><p>年龄:<input type="submit" name="ageField"></p></form><script>var myform = document.getElementById('myform');var nameField = myform.nameField;var ageField = myform.ageField;nameField.onchange = function () {console.log('你已经修改完姓名');}nameField.oninput = function () {console.log('你正在修改姓名');}nameField.onfocus = function () {console.log('姓名框已经得到了焦点');}nameField.onblur = function () {console.log('姓名框已经失去了焦点');}myform.onsubmit=function(){console.log('你正在尝试提交表单');}</script></body></html>
事件传播
事件的传播
Onxxx写法只能监听冒泡阶段
addEventListener()方法


<!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><style>#box1 {width: 202px;height: 202px;border: 1px solid #000;padding: 50px;}#box2 {width: 100px;height: 100px;border: 1px solid #000;padding: 50px;}#box3 {width: 100px;height: 100px;border: 1px solid #000;}</style></head><body><div id="box1"><div id="box2"><div id="box3"></div></div></div><script>var box1 = document.getElementById('box1');var box2 = document.getElementById('box2');var box3 = document.getElementById('box3');// box1.onclick = function () {// console.log('我是box1的onclick');s// }// box2.onclick = function () {// console.log('我是box2的onclick');// }// box3.onclick = function () {// console.log('我是box3的onclick');//}box1.addEventListener('click',function(){console.log('我是box1的捕获阶段')},true)box2.addEventListener('click',function(){console.log('我是box2的捕获阶段')},true)box3.addEventListener('click',function(){console.log('我是box3的捕获阶段')},true)box1.addEventListener('click',function(){console.log('我是box1的冒泡阶段')},false)box2.addEventListener('click',function(){console.log('我是box2的冒泡阶段')},false)box3.addEventListener('click',function(){console.log('我是box3的冒泡阶段')},false)</script></body></html>
事件对象
鼠标
鼠标位置



<!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><style>*{margin: 0;padding: 0;}#box {width: 200px;height: 200px;background-color: rgb(36, 30, 30);margin: 100px;padding: 50px;}body {height: 2000px;}#info {font-size: 30px;}</style></head><body><div id="box"> </div><div id="info"> </div><script>var obox = document.getElementById('box');var oinfo = document.getElementById('info');obox.onmousemove = function (e) {oinfo.innerHTML = 'offsetX/Y:' + e.offsetX + ',' + e.offsetY+'<br>'+ 'clientX/Y:' + e.clientX + ',' + e.clientY+'<br>'+ 'pageX/Y:' + e.pageX + ',' + e.pageY;}</script></body></html>
e.charCode和e.keyCode属性
charCode字符码
keyCode属性

<input type="text" id="field1"><h1 id="info1"></h1><input type="text" id="field2"><h1 id="info2"></h1><script>var ofield1 = document.getElementById('field1');var oinfo1 = document.getElementById('info1');var ofield2 = document.getElementById('field2');var oinfo2 = document.getElementById('info2');ofield1.onkeypress = function (e) {oinfo1.innerText = '你输入的字符的字符码是' + e.charCode;}ofield2.onkeydown = function (e) {oinfo2.innerText = '你按下的按键的键码是' + e.keyCode;}</script>
小案例

<!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><style>#box {position: absolute;top: 200px;left: 200px;width: 100px;height: 100px;background-color: rgb(214, 41, 41);}</style></head><body><div id="box"></div><script>var box = document.getElementById('box');//全局变量t、l,分别代表盒子的top属性和left属性值var t = 200;var l = 200;//监听document对象的键盘按下事件监听,表示当用户在整个网页上按下按键的时候document.onkeydown = function (e) {switch (e.keyCode) {case 37:l -= 5;break;case 38:t -= 5;break;case 39:l += 5;break;case 40:t += 5;break;}//更改样式box.style.left = l + 'px';box.style.top = t + 'px'}</script></body></html>
e.preventDefault()方法
小案例1

<p><input type="text" id="field"></p><script>var field = document.getElementById('field');field.onkeypress = function (e) {console.log(e.charCode);//根据和用户输入的字符的字符码(e.charCode)//数字0~9,字符码48~57//小写字母a~z,字符码97~122if (!(e.charCode >= 48 && e.charCode <= 57 || e.charCode >= 97 && e.charCode <= 122) ){e.小案例2();}}</script>
小案例2

<!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><style>#box {width: 200px;height: 200px;background: #000;}body{height: 2000px;}</style></head><body><div id="box"></div><h1 id="info"></h1><script>var box = document.getElementById('box');var info = document.getElementById('info');//全局变量就是info中显示的数字var a = 0;//给box盒子添加鼠标事件监听box.onmousewheel = function (e) {//阻止默认事件;就是说当用户在盒子里滚动鼠标滚轮的时候,不会引发页面的滚动e.preventDefault();if (e.deItaY > 0) {a++;} else {a--;}info.innerText = a;}</script></body></html>
e.stopPropagation()方法

<!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><style>#box {width: 200px;height: 200px;background: #000;}body{height: 2000px;}</style></head><body><div id="box"><button id="bth">按我</button></div><h1 id="info"></h1><script>var box = document.getElementById('box');var bth = document.getElementById('bth');// box.onclick=function(){// console.log('我是盒子');// };//bth.onclick=function(e){//阻止事件继续传播// e.stopPropagation();// console.log('我是按钮');// };box.addEventListener('click',function(){console.log('我是box的捕获阶段')},true)bth.addEventListener('click',function(e){//阻止事件继续传播e.stopPropagation();console.log('我是bth的捕获阶段')},false)</script></body></html>
小案例

<!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><style>.model{width: 200px;height: 200px;background-color: rgb(236, 40, 40);position: absolute;top: 50%;left: 50%;margin-top: -70px;margin-left: -200px;display: none;}</style></head><body><button id="bth">按我弹出弹出层</button><div class="model" id="box"></div><script>var bth=document.getElementById('bth');var box=document.getElementById('box');//点击按钮的时候,弹出层显示bth.onclick=function(e){//阻止事件继续传播到document身上e.stopPropagation();box.style.display='block';}//点击页面任何部分的时候,弹出层关闭document.onclick=function(){box.style.display='none';}//阻止事件继续传播box.onclick=function(e){//阻止事件继续传播到document身上e.stopPropagation();}</script></body></html>
事件监听
批量添加事件监听

<ul id="list"><li>列表项</li><li>列表项</li><li>列表项</li><li>列表项</li><li>列表项</li><li>列表项</li><li>列表项</li><li>列表项</li><li>列表项</li><li>列表项</li><li>列表项</li><li>列表项</li><li>列表项</li><li>列表项</li><li>列表项</li><li>列表项</li><li>列表项</li><li>列表项</li><li>列表项</li><li>列表项</li></ul><script>var list = document.getElementById('list');var lis = list.getElementsByTagName("li");console.log(lis.length);//书写循环语句,批量给元素添加监听for (var i = 0; i < lis.length; i++) {lis[i].onclick = function () {//在这个函数中,this代表点击的这个元素,this涉及函数上下文的相关知识this.style.color = 'red';}}</script>
批量添加事件监听的性能问题
新增元素动态绑定事件

<button id="bth">按我添加新的列表项</button><ul id="list"></ul><script>var bth = document.getElementById('bth');var list = document.getElementById('list');//按钮的点击事件bth.onclick = function () {//创建一个新的li列表项,孤儿节点var lis = document.createElement("li");lis.innerHTML = '我是列表项';//上树list.appendChild(lis);//给新创建的这个li节点添加onclick事件监听lis.onclick=function(){this.style.color = 'red';}}</script>
动态绑定事件的问题
事件委托
e.target和e.currentTarget属性

<button id="btn">按我创建一个新列表项</button><ul id="list"><li>列表项</li><li>列表项</li><li>列表项</li></ul><script>var list = document.getElementById('list');var btn = document.getElementById('btn');list.onclick = function (e) {// e.target表示用户真正点击的那个元素e.target.style.color = 'red';}btn.onclick=function(){//创建新的li元素var lis = document.createElement("li");lis.innerHTML = '我是新来的';//上树list.appendChild(lis);}</script>
事件委托的使用场景
注意事项
实现动画
定时器和延时器
定时器

var a=0;setInterval(function(){console.log(a);a=a+2;},1000)
函数的参数
具名函数也可以传入setInterval
清除定时器

<h1 id="info">0</h1><button id="btn1">开始</button><button id="btn2">暂停</button><script>var info = document.getElementById('info');var btn1 = document.getElementById('btn1');var btn2 = document.getElementById('btn2');var a = 0;//设置一个全局变量var timer = null;btn1.onclick = function () {//为了防止定时器叠加,我们应该在设置定时器之前先清除定时器clearInterval(timer);//更改全局变量timer的值为一个定时器实体timer = setInterval(function () {info.innerText = ++a;}, 1000);};btn2.onclick = function () {clearInterval(timer);}</script>
延时器
清除延时器

<button id="btn1">2秒后弹出你好</button><button id="btn2">取消弹出</button><script>var btn1 = document.getElementById('btn1');var btn2 = document.getElementById('btn2');var timer;btn1.onclick = function () {timer = setTimeout(function () {console.log('你好');}, 2000);}btn2.onclick = function () {clearTimeout(timer);}</script>
初步认识异步语句
使用定时器实现动画


<!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"><style>#box {position: absolute;top: 100px;left: 100px;width: 100px;height: 100px;background-color: orange;}</style></head><body><button id="btn">运动</button><div id="box"></div><script>//得到元素var btn = document.getElementById('btn');var box = document.getElementById('box');//全局变量盒子的left值var left = 100;//按钮监听btn.onclick = function () {var timer = setInterval(function () {//改变全局变量left += 10;if (left >= 1000) {clearInterval(timer);}box.style.left = left + 'px';}, 20)}</script></body></html>
JS和CSS结合实现动画

<!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"><style>#box {position: absolute;top: 100px;left: 100px;width: 100px;height: 100px;background-color: orange;}</style></head><body><button id="btn">按我运动</button><div id="box"></div><script>//得到元素var btn = document.getElementById('btn');var box = document.getElementById('box');//标示量,指示当前盒子在左边还是右边var pos = 1; //1左边,2右边//事件监听btn.onclick = function () {//把过渡加上box.style.transition = 'all 2s linear 0s';if (pos == 1) {//瞬间移动,但是由于有过渡,所以是动画box.style.left = '1100px';pos = 2;} else if (pos == 2){box.style.left = '100px';pos = 1;}}</script></body></html>
函数节流


<!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">
<style>
#box {
position: absolute;
top: 100px;
left: 100px;
width: 100px;
height: 100px;
background-color: orange;
}
</style>
</head>
<body>
<button id="btn">按我运动</button>
<div id="box"></div>
<script>
//得到元素
var btn = document.getElementById('btn');
var box = document.getElementById('box');
//标示量,指示当前盒子在左边还是右边
var pos = 1; //1左边,2右边
//函数节流锁
var lock = true;
//事件监听
btn.onclick = function () {
//首先检查锁是否是关闭
if (!lock) return;
//把过渡加上
box.style.transition = 'all 2s linear 0s';
if (pos == 1) {
//瞬间移动,但是由于有过渡,所以是动画
box.style.left = '1100px';
pos = 2;
} else if (pos == 2) {
box.style.left = '100px';
pos = 1;
}
//关锁
lock = false;
setTimeout(function () {
lock = true;
}, 2000);
}
</script>
</body>
</html>
动画效果开发1·无缝连续滚动特效
原理
<!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">
<style>
* {
margin: 0;
padding: 0;
}
.box {
width: 1000px;
height: 130px;
border: 1px solid #000;
margin: 50px auto;
overflow: hidden;
}
.box ul {
list-style: none;
width: 5000px;
position: relative;
}
.box ul li {
float: left;
margin-right: 10px;
}
</style>
</head>
<body>
<div id="box" class="box">
<ul id="list">
<li><img src="/images/number/0.png" alt=""></li>
<li><img src="/images/number/1.png" alt=""></li>
<li><img src="/images/number/2.png" alt=""></li>
<li><img src="/images/number/3.png" alt=""></li>
<li><img src="/images/number/4.png" alt=""></li>
<li><img src="/images/number/5.png" alt=""></li>
</ul>
</div>
<script>
var box = document.getElementById('box');
var list = document.getElementById('list');
//复制多一遍所有的li
list.innerHTML += list.innerHTML;
//全局变量,表示当前list的left值
var left = 0;
//定时器,全局变量
var timer;
move();
//动画封装成函数
function move() {
//设表先关,防止动画积累
clearInterval(timer);
timer = setInterval(function () {
left -= 4;
//验收
if (left <= -1260) {
left = 0;
}
list.style.left = left + 'px';
}, 20);
}
//鼠标进入停止计时器
box.onmouseenter = function () {
clearInterval(timer);
};
//鼠标离开继续计时器
box.onmouseleave = function () {
move();
} ;
</script>
</body>
</html>
动画效果开发2·跑马灯轮播图特效
<!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">
<style>
* {
margin: 0;
padding: 0;
}
.carousel {
width: 650px;
height: 360px;
border: 1px solid #000;
margin: 50px auto;
position: relative;
overflow: hidden;
}
.carousel ul {
list-style: none;
width: 6000px;
position: relative;
left: 0px;
transition: left .5s ease 0s;
}
.carousel ul li {
float: left;
}
.carousel .leftbtn {
position: absolute;
left: 20px;
top: 50%;
margin-top: -25px;
width: 50px;
height: 50px;
background-color: orange;
border-radius: 50%;
}
.carousel .rightbtn {
position: absolute;
right: 20px;
top: 50%;
margin-top: -25px;
width: 50px;
height: 50px;
background-color: orange;
border-radius: 50%;
}
</style>
</head>
<body>
<div class="carousel">
<ul id="list">
<li><img src="images/bj/0.jpg" </li>
<li><img src="images/bj/1.jpg" </li>
<li><img src="images/bj/2.jpg" </li>
<li><img src="images/bj/3.jpg" </li>
<li><img src="images/bj/4.jpg" </li>
</ul>
<a href="javascript:;" class="leftbtn" id="leftbtn"></a>
<a href="javascript:;" class="rightbtn" id="rightbtn"></a>
</div>
<script>
//得到按钮和ul,ul整体进行运动
var leftbtn = document.getElementById('leftbtn');
var rightbtn = document.getElementById('rightbtn');
var llist = document.getElementById('list');
//克隆第一张照片
var cloneli = list.firstElementChild.cloneNode(true);
list.appendChild(cloneli);
//当前ul显示到第几张了,从0开始数
var idx = 0;
//节流锁
var lock = true;
//右按钮监听
rightbtn.onclick = function () {
//判断锁的状态
if (!lock) return;
lock=false;
//给list加过渡,
list.style.transition = 'left .5s ease 0s';
idx++;
if (idx >4) {
//设置一个延时器,延时器的作用就是将ul瞬间拉回0的位置,延时器的目的是让过渡动画结束拉回去
setTimeout(function () {
//取消过渡,因为要的是瞬间移动
list.style.transition = 'none';
list.style.left = 0;
idx = 0;
}, 500)
}
list.style.left = -idx * 650 + 'px';
setTimeout(function () {
lock = true;
}, 500)
}
leftbtn.onclick = function () {
if (!lock) return;
lock=false;
//判断是不是第0张,如果是,那就用假的替换真的
if (idx == 0) {
//取消过渡
list.style.transition = 'none';
list.style.left = -5 * 650 + 'px';
//设置一个延时器,这个延时器的延时时间是0毫秒,虽然是0毫秒,但是可以让我们过渡先是瞬间取消,然后再加上
setTimeout(function () {
list.style.transition = 'left .5s ease 0s';
idx = 4;
list.style.left = -idx * 650 + 'px';
}, 0);
} else {
idx--;
list.style.left = -idx * 650 + 'px';
}
setTimeout(function () {
lock = true;
}, 500)
}
</script>动画效果开发2 - 轮播图特效.htm
</body>
</html>
动画效果开发3·呼吸轮播图特效
<!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">
<style>
* {
margin: 0;
padding: 0;
}
.carousel {
width: 650px;
height: 360px;
border: 1px solid #000;
margin: 50px auto;
position: relative;
}
.carousel ul {
list-style: none;
}
.carousel ul li {
position: absolute;
top: 0;
left: 0;
/*透明度都是0*/
opacity: 0;
transition: opacity 1s ease 0s;
}
/*只有第一张透明度是1*/
.carousel ul li:first-child {
opacity: 1;
}
.carousel .leftbtn {
position: absolute;
left: 20px;
top: 50%;
margin-top: -25px;
width: 50px;
height: 50px;
background-color: orange;
border-radius: 50%;
}
.carousel .rightbtn {
position: absolute;
right: 20px;
top: 50%;
margin-top: -25px;
width: 50px;
height: 50px;
background-color: orange;
border-radius: 50%;
}
</style>
</head>
<body>
<div class="carousel">
<ul id="list">
<li><img src="images/bj/0.jpg" </li>
<li><img src="images/bj/1.jpg" </li>
<li><img src="images/bj/2.jpg" </li>
<li><img src="images/bj/3.jpg" </li>
<li><img src="images/bj/4.jpg" </li>
</ul>
<a href="javascript:;" class="leftbtn" id="leftbtn"></a>
<a href="javascript:;" class="rightbtn" id="rightbtn"></a>
</div>
<script>
//得到按钮和ul,ul整体进行运动
var leftbtn = document.getElementById('leftbtn');
var rightbtn = document.getElementById('rightbtn');
var list = document.getElementById('list');
var lis = list.getElementsByTagName('li');
//当前是第几张图显示
var idx = 0;
//节流
var lock = true;
//右按钮
rightbtn.onclick = function () {
//判断节流
if (!lock) return;
lock = false;
//还没有改idx,此时的idx就是老图,老图淡出
lis[idx].style.opacity = 0;
idx++;
if (idx > 4) idx = 0;
//改了idx,此时的idx这个图片就是新图,新图淡入
lis[idx].style.opacity = 1;
//动画结束之后,开锁
setTimeout(function () {
lock = true;
}, 1000)
}
//左按钮
leftbtn.onclick = function () {
//判断节流
if (!lock) return;
lock = false;
//还没有改idx,此时的idx就是老图,老图淡出
lis[idx].style.opacity = 0;
idx--;
if (idx < 0) idx = 4;
//改了idx,此时的idx这个图片就是新图,新图淡入
lis[idx].style.opacity = 1;
//动画结束之后,开锁
setTimeout(function () {
lock = true;
}, 1000)
}
</script>
</body>
</html>













