动画
一个简单的动画
#box{width: 100px;height: 100px;background: #000;color:#fff;text-align: center;line-height: 100px;position: absolute;top: 50px;left: 0;}
<div id="box">盒子</div>
<script type="text/javascript">
function $(id){
return document.getElementById(id);
}
function getStyle(obj, attr){
return obj.currentStyle ? ob.currentStyle[attr] : getComputedStyle(obj)[attr];
}
</script>
<script type="text/javascript">
window.onload = function(){
var oBox = $('box');
var start = 0;
var end = 500;
var speed = 0;
var timer = setInterval(function(){
speed += 10;
var pos = parseInt( getStyle(oBox, 'left') );
oBox.style.left = speed + 'px';
if(pos > end){
oBox.style.left = '0px';
speed = 0;
}
}, 30);
}
</script>
QQ客户悬浮窗
body{height:2000px;}
#box1{width:100px;height:200px;background:red;position:fixed;top:100px;left:-100px;}
#box2{width:30px;height:65px;background:pink;text-align:center;position:absolute;right:-30px;top:50%;margin-top:-40px;}
<div id="box1">
<div id="box2">QQ客服</div>
</div>
<script type="text/javascript">
function $(id){
return document.getElementById(id);
}
function getStyle(obj, attr){
return obj.currentStyle ? ob.currentStyle[attr] : getComputedStyle(obj)[attr];
}
</script>
<script type="text/javascript">
window.onload = function(){
var oBox1 = $('box1');
oBox1.onmouseover = function(){
startRun();
}
oBox1.onmouseout = function(){
endRun();
}
var timer = null;
function startRun(){
var target = 0;
var speed = 10;
clearInterval(timer);
timer = setInterval(function(){
var pos = parseInt( getStyle(oBox1, 'left') );
if(pos == target){
clearInterval(timer);
}else{
oBox1.style.left = pos + speed + 'px';
}
},30);
}
function endRun(){
var target = -100;
var speed = -10;
clearInterval(timer);
timer = setInterval(function(){
var pos = parseInt( getStyle(oBox1, 'left') );
if(pos == target){
clearInterval(timer);
}else{
oBox1.style.left = pos + speed + 'px';
}
},30);
}
}
</script>
动画封装
function Run(dom, json, callback){
clearInterval(dom.timer);
dom.timer = setInterval(function(){
var flag = true;
for(var attr in json){
var pos = null;
if(attr == 'opacity'){
pos = getStyle(dom, attr)*100;
}else{
pos = parseInt( getStyle(dom, attr) ) || 0;
}
var target = json[attr];
var speed = (target - pos) * 0.2;
speed = speed>0 ? Math.ceil(speed) : Math.floor(speed);
if(pos!=target){
if(attr == 'opacity'){
dom.style[attr] = (pos + speed)/100;
}else{
dom.style[attr] = pos + speed + 'px';
}
flag = false;
}
}
if(flag){
clearInterval(dom.timer);
if(callback){
callback.call(dom);
}
}
},30);
}
#box{width: 100px;height: 100px;background: green;line-height: 100px;text-align: center;color:#fff;opacity: .5;filter: alpha(opacity=50)}
<div id="box">盒子</div>
<script type="text/javascript" src="js/run.js"></script>
<script type="text/javascript">
window.onload = function(){
var oBox = $('#box');
oBox.onmouseover = function(){
Run(this, {width: 200, height: 400, lineHeight: 400, opacity: 100});
}
}
</script>
案例-Banner轮播图
焦点淡入淡出
* {padding: 0;margin: 0px;}
ul li {list-style:none;float:left;}
#box {width: 700px;margin: 50px auto;overflow: hidden;position: relative;}
#imgbox {width: 1000%;height: 300px;}
#imgbox li {opacity: 0;position: absolute;top: 0;left: 0;}
#imgbox li img{width: 700px;height: 300px;}
#list {width: 120px; height: 30px;position: absolute;bottom: 10px;left: 50%;margin-left: -60px;}
#list li {width: 20px;height: 20px;line-height: 20px;background: #000;color: #fff;text-align: center;border-radius: 50%;margin: 5px;cursor: pointer;}
#list .active {background: grey;}
<div id="box">
<ul id="imgbox">
<li style="opacity: 1;">
<img src="img/1.jpg">
</li>
<li>
<img src="img/2.jpg">
</li>
<li>
<img src="img/3.jpg">
</li>
<li>
<img src="img/4.jpg">
</li>
</ul>
<ul id="list">
<li class="active">1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
</div>
<script type="text/javascript" src="js/run.js"></script>
<script type="text/javascript">
var lis = $('#list').children;
var lisLen = lis.length;
var imgs = $('#imgbox').children;
for(var i=0; i<lisLen; i++){
lis[i].index = i;
lis[i].onmouseover = function(){
for(var i=0; i<lisLen; i++){
lis[i].className = '';
Run(imgs[i], {opacity: 0})
}
this.className = 'active';
Run(imgs[this.index], {opacity: 100})
}
}
</script>
向上向下
var lis = $('#list').children;
var lisLen = lis.length;
$('#imgbox').innerHTML += $('#imgbox').innerHTML;
var imgs = $('#imgbox').children;
var imgHeight = imgs[0].offsetHeight;
for(var i=0; i<lisLen; i++){
lis[i].index = i;
lis[i].onmouseover = function(){
for(var i=0; i<lisLen; i++){
lis[i].className = '';
}
this.className = 'active';
Run($('#imgbox'), {top: -imgHeight*this.index})
}
}
向左向右
var lis = $('#list').children;
var lisLen = lis.length;
var imgs = $('#imgbox').children;
var imgWidth = imgs[0].offsetWidth;
for(var i=0; i<lisLen; i++){
lis[i].index = i;
lis[i].onmouseover = function(){
for(var i=0; i<lisLen; i++){
lis[i].className = '';
}
this.className = 'active';
Run($('#imgbox'), {left: -imgWidth*this.index})
}
}
无缝自动播放
window.onload = function(){
var lis = $('#list').children;
var lisLen = lis.length;
var imgs = $('#imgbox').children;
var imgWidth = imgs[0].offsetWidth;
var timer = null;
var index = 0;
for(var i=0; i<lisLen; i++){
lis[i].index = i;
lis[i].onmouseover = function(){
for(var i=0; i<lisLen; i++){
lis[i].className = '';
imgs[i].removeAttribute('style');
}
this.className = 'active';
Run($('#imgbox'), {left: -imgWidth*this.index})
index = this.index;
index2 = this.index;
}
}
var time = 1000;
timer = setInterval(playBanner, time);
var index2 = 0
function playBanner(){
if(index == 0){
imgs[0].style.position = 'static';
$('#imgbox').style.left = 0;
index2 = 0;
}
if(index == lisLen-1){
index = 0;
imgs[0].style.position = 'relative';
imgs[0].style.left = lisLen * imgWidth + 'px'
}else{
index++;
}
index2++;
for(var i=0; i<lisLen; i++){
lis[i].className = '';
}
lis[index].className = 'active';
Run($('#imgbox'), {left: -imgWidth*index2})
}
$('#box').onmouseover = function(){
clearInterval(timer);
}
$('#box').onmouseout = function(){
timer = setInterval(playBanner, time);
}
}
事件委托
事件之冒泡
一个元素绑定事件有两种
1、属性事件
2、动态绑定:addEventListener(事件名,回调函数,是否捕捉)
1、false 冒泡
2、true 捕捉
<div class="a" onclick="clickme();">点我</div>
<script type="text/javascript">
function clickme(){
alert(2);
};
document.querySelectorAll('.a')[0].onclick = function(){
alert(1);
};
document.querySelectorAll('.a')[0].addEventListener("click",function(){
alert(3);
}, false);
</script>
<div class="a">点我</div>
<script type="text/javascript">
window.addEventListener('click', function(e){
console.log("window被点击了");
}, false);
document.addEventListener('click', function(e){
console.log("html被点击了");
}, false);
document.body.addEventListener('click', function(e){
console.log("body被点击了");
}, false);
document.querySelector('div').addEventListener('click', function(e){
console.log("div被点击了");
e.cancelBubble = true;
e.stopPropagation();
}, false);
</script>
window.addEventListener('click', function(e){
console.log("window被点击了");
}, true);
document.addEventListener('click', function(e){
console.log("html被点击了");
}, true);
document.body.addEventListener('click', function(e){
console.log("body被点击了");
}, true);
document.querySelector('div').addEventListener('click', function(e){
console.log("div被点击了");
}, true);
案例
#box{width: 700px;margin: 50px auto;}
#list{width: 100%;border-collapse: collapse;}
#list td{border: 1px solid gray;}
<div id="box">
<table id="list">
<tr>
<td><input type="checkbox"></td>
<td>a111</td><td>a222</td><td>a333</td><td>a444</td>
<td><a href="javascript:void(0)" onclick="del(event, this)">删除</a></td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>b111</td><td>b222</td><td>b333</td><td>b444</td>
<td><a href="javascript:void(0)" onclick="del(event, this)">删除</a></td>
</tr>
<tr>
<td><input type="checkbox"></td>
<td>c111</td><td>c222</td><td>c333</td><td>c444</td>
<td><a href="javascript:void(0)" onclick="del(event, this)">删除</a></td>
</tr>
</table>
</div>
<script type="text/javascript">
window.onload = function(){
var oList = document.querySelector('#list');
var items = oList.getElementsByTagName('td');
for(var i=0; i<items.length; i++){
items[i].addEventListener('click', function(ev){
var item = this.parentElement;
var input = item.querySelector('input');
if(input.checked){
item.style.background = '';
input.checked = false;
}else{
item.style.background = 'yellow';
input.checked = true;
}
}, false);
if (items[i].children[0]) {
items[i].children[0].addEventListener('click', function(ev){
this.checked = !this.checked;
}, false);
}
}
}
function del(ev, obj){
var e = ev || event;
var tr = obj.parentNode.parentNode;
var table = tr.parentNode;
table.removeChild(tr);
e.stopPropagation();
};
</script>
事件之默认行为
阻止冒泡:event.stopPropagation();
阻止浏览器默认行为:event.preventDefault();
<a href="http://www.baidu.com" onclick="clickme(event);">点我</a>
<input type="text"/>
<input type="checkbox"/>
<script type="text/javascript">
function clickme(e){
alert(1);
e.preventDefault();
};
document.querySelector('input[type="checkbox"]').addEventListener('click', function(e){
e.preventDefault();
}, false);
document.querySelector('input[type="text"]').addEventListener('keydown', function(e){
e.preventDefault();
});
</script>
事件委托
获取触发事件的当前对象和目标对象
event.currentTarget
event.target
<div id="box">
<a href="javascript:void(0);" >点我</a>
</div>
<script type="text/javascript">
document.querySelector('a').addEventListener('click', function(e){
this.style.cssText = 'background:green;padding:10px;color:#fff';
alert(e.currentTarget === e.target);
});
</script>
<div id="box">
<a href="javascript:void(0)">点我1</a>
<a href="javascript:void(0)">点我2</a>
<a href="javascript:void(0)">点我3</a>
<a href="javascript:void(0)">点我4</a>
</div>
<a href="javascript:void(0)" onclick="add();">增加</a>
<script type="text/javascript">
var oBox = document.getElementById('box');
var aDoms = oBox.children;
for(var i=0; i<aDoms.length; i++){
aDoms[i].addEventListener('click', function(){
this.style.cssText = 'background:green;padding:10px;color:#fff';
}, false);
}
var i = 4;
function add(){
i++;
var aDom = document.createElement('a');
aDom.href = 'javascript:void(0);';
aDom.innerText = '点我' + i;
oBox.appendChild(aDom);
aDom.addEventListener('click', function(){
this.style.cssText = 'background:green;padding:10px;color:#fff';
}, false);
}
</script>
<div id="box">
<a href="javascript:void(0)" onclick="clickme(this);">点我1</a>
<a href="javascript:void(0)" onclick="clickme(this);">点我2</a>
<a href="javascript:void(0)" onclick="clickme(this);">点我3</a>
<a href="javascript:void(0)" onclick="clickme(this);">点我4</a>
</div>
<a href="javascript:void(0)" onclick="add();">增加</a>
<script type="text/javascript">
function clickme(obj){
obj.style.cssText = 'background:green;padding:10px;color:#fff';
}
var i = 4;
var oBox = document.getElementById('box');
function add(){
i++;
oBox.innerHTML += '<a href="javascript:void(0);" onclick="clickme(this)">点我'+i+'</a>';
}
</script>
<div id="box">
<a href="javascript:void(0)">点我1</a>
<a href="javascript:void(0)">点我2</a>
<a href="javascript:void(0)">点我3</a>
<a href="javascript:void(0)">点我4</a>
</div>
<a href="javascript:void(0)" onclick="add();">增加</a>
<script type="text/javascript">
document.getElementById('box').addEventListener('click', function(e){
var ct = e.currentTarget;
var t = e.target;
if(t.tagName.toLowerCase() === 'a'){
t.style.cssText = 'background:green;padding:10px;color:#fff';
}
}, false);
var i = 4;
var oBox = document.getElementById('box');
function add(){
i++;
var aDom = document.createElement('a');
aDom.href = 'javascript:void(0);';
aDom.innerText = '点我' + i;
oBox.appendChild(aDom);
}
</script>
<div id="box">
<a href="javascript:void(0)">点我1</a>
<a href="javascript:void(0)">点我2</a>
<a href="javascript:void(0)">点我3</a>
<a href="javascript:void(0)">点我4</a>
</div>
<a href="javascript:void(0)" onclick="add();">增加</a>
<script type="text/javascript" src="js/jquery-1.11.2.min.js"></script>
<script type="text/javascript">
var _$ = function(id){
var dom = document.getElementById(id);
return {
on: function(eventType, targetElement, callback){
dom.addEventListener(eventType, function(ev){
var e = ev || event;
var target = e.target || e.srcElement;
if(target.tagName.toLowerCase() == targetElement){
callback.call(target);
}
}, false);
}
}
}
_$('box').on('click', 'a', function(){
this.style.cssText = 'background:green;padding:10px;color:#fff';
});
</script>
3DBanner
CSS实现滑动banner
#box{width: 805px;height: 300px;box-shadow: 2px 2px 1em pink;margin: 50px auto;overflow: hidden;}
#box ul{width: 1000%}
#box ul li{list-style: none;float: left;width: 160px;border-left: 1px solid #fff;transition: all 1s ease;position: relative;}
#box ul li img{width: 600px;height: 300px;}
#box ul li{width: 125px;}
#box ul li:nth-child(3){width: 300px;}
#box ul:hover li{width: 50px;}
#box ul li:hover{width: 600px;}
#box ul li .title{width: 100%;height: 50px;line-height: 50px;position: absolute;bottom: -50px;background: rgba(0, 0, 0, .5);padding-left: 10px;}
.title a{text-decoration: none;color:#e5e5e5;display: block;cursor: pointer;}
#box ul li:hover .title{bottom: 0;transition: all .5s ease;}
<div id="box">
<ul>
<li><a href="#"><img src="img/1.jpg"></a><div class="title"><a href="#">title_title1</a></div></li>
<li><a href="#"><img src="img/2.jpg"></a><div class="title"><a href="#">title_title2</a></div></li>
<li style=""><a href="#"><img src="img/3.jpg"></a><div class="title"><a href="#">title_title3</a></div></li>
<li><a href="#"><img src="img/4.jpg"></a><div class="title"><a href="#">title_title4</a></div></li>
<li><a href="#"><img src="img/5.jpg"></a><div class="title"><a href="#">title_title5</a></div></li>
</ul>
</div>
3D Banner
<style type="text/css">
*{padding: 0;margin: 0;}
#banner{width: 800px;height: 360px;background: pink;margin: 50px auto;perspective: 800px;}
#list li{list-style: none;width: 200px;height: 360px;float: left;position: relative;transform-style: preserve-3d; transition: 2s;transform: translateZ(-180px);}
#list li div{width: 200px;height: 360px;position: absolute;}
#list li div:nth-child(1){bottom: 360px; background: green;transform-origin: bottom;transform: translateZ(180px) rotateX(90deg);}
#list li div:nth-child(2){bottom: -360px; background: yellow;transform-origin: top;transform: translateZ(180px) rotateX(-90deg);}
#list li div:nth-child(5){width: 360px; background: red;right: 200px;transform-origin: right;transform: translateZ(180px) rotateY(-90deg);}
#list li div:nth-child(6){width: 360px; background: blue;left: 200px;transform-origin: left;transform: translateZ(180px) rotateY(90deg);}
#list li div:nth-child(4){background: gray;transform: translateZ(-180px);}
#list li div:nth-child(3){transform: translateZ(180px);}
#banner:hover ul li{transform: translateZ(-180px) rotateX(180deg);}
</style>
<div id="banner">
<ul id="list">
<li>
<div>上</div>
<div>下</div>
<div>前</div>
<div>后</div>
<div>左</div>
<div>右</div>
</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
</div>
<style type="text/css">
*{padding: 0;margin: 0;}
#banner{width: 800px;height: 360px;margin: 50px auto;perspective: 800px;}
#list li{list-style: none;width: 200px;height: 360px;float: left;position: relative;transform-style: preserve-3d; transform: translateZ(-180px);}
#list li div{width: 200px;height: 360px;position: absolute;}
#list li div:nth-child(1){bottom: 360px; transform-origin: bottom;transform: translateZ(180px) rotateX(90deg);background-image: url('img/1.png');}
#list li div:nth-child(2){bottom: -360px; transform-origin: top;transform: translateZ(180px) rotateX(-90deg);background-image: url('img/2.png');}
#list li div:nth-child(3){transform: translateZ(180px);background-image: url('img/3.png');}
#list li div:nth-child(4){transform: translateZ(-180px) rotateX(180deg);background-image: url('img/4.png');}
#banner:hover ul li{transform: translateZ(-180px) rotateX(180deg);}
#list li:nth-child(1) div{background-position: 0px;}
#list li:nth-child(2) div{background-position: -200px;}
#list li:nth-child(3) div{background-position: -400px;}
#list li:nth-child(4) div{background-position: -600px;}
#list li:nth-child(1) {transition: 1s 0s;}
#list li:nth-child(2) {transition: 1s 0.2s;}
#list li:nth-child(3) {transition: 1s 0.4s;}
#list li:nth-child(4) {transition: 1s 0.6s;}
</style>
<div id="banner">
<ul id="list">
<li>
<div>上</div> <div>下</div><div>前</div><div>后</div>
</li>
<li>
<div>上</div> <div>下</div><div>前</div><div>后</div>
</li>
<li>
<div>上</div> <div>下</div><div>前</div><div>后</div>
</li>
<li style="z-index: -1">
<div>上</div> <div>下</div><div>前</div><div>后</div>
</li>
</ul>
</div>
<style type="text/css" id="css">
*{padding: 0;margin: 0;}
#banner{width: 800px;height: 360px;margin: 50px auto;perspective: 800px;position: relative;}
#list li{list-style: none;width: 200px;height: 360px;float: left;position: relative;transform-style: preserve-3d; transform: translateZ(-180px);}
#list li div{width: 200px;height: 360px;position: absolute;}
#list li div:nth-child(1){bottom: 360px; transform-origin: bottom;transform: translateZ(180px) rotateX(90deg);background-image: url('img/1.png');}
#list li div:nth-child(2){bottom: -360px; transform-origin: top;transform: translateZ(180px) rotateX(-90deg);background-image: url('img/2.png');}
#list li div:nth-child(3){transform: translateZ(180px);background-image: url('img/3.png');}
#list li div:nth-child(4){transform: translateZ(-180px) rotateX(180deg);background-image: url('img/4.png');}
#list li:nth-child(1) div{background-position: 0px;}
#list li:nth-child(2) div{background-position: -200px;}
#list li:nth-child(3) div{background-position: -400px;}
#list li:nth-child(4) div{background-position: -600px;}
#list li:nth-child(1) {transition: 1s 0s;}
#list li:nth-child(2) {transition: 1s 0.2s;}
#list li:nth-child(3) {transition: 1s 0.4s;}
#list li:nth-child(4) {transition: 1s 0.6s;}
#banner ol{position: absolute;width: 120px;height: 30px;bottom: 10px;right: 10px;}
#banner ol li{width: 20px;height: 20px;background: grey;line-height: 20px;border-radius: 50px;color:#fff;text-align: center;margin: 5px;float: left;list-style: none;cursor: pointer;}
#banner ol li.on{background: #f60;}
</style>
<div id="banner">
<ul id="list">
<li>
<div>上</div> <div>下</div><div>前</div><div>后</div>
</li>
<li>
<div>上</div> <div>下</div><div>前</div><div>后</div>
</li>
<li>
<div>上</div> <div>下</div><div>前</div><div>后</div>
</li>
<li style="z-index: -1">
<div>上</div> <div>下</div><div>前</div><div>后</div>
</li>
</ul>
<ol>
<li class="on">1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ol>
</div>
window.onload = function(){
var ol = document.getElementsByTagName('ol');
var ul = document.getElementsByTagName('ul');
var oLis = ol[0].getElementsByTagName('li');
var uLis = ul[0].getElementsByTagName('li');
var css = document.querySelector('#css');
for(var i=0; i<oLis.length; i++){
(function(s){
oLis[s].onclick = function(){
css.innerHTML += '#banner ul li{transform: translateZ(-180px) rotateX('+(s*-90)+'deg)}';
for(var i=0;i<oLis.length;i++){
oLis[i].className = '';
}
this.className = 'on';
}
})(i);
}
}
<style type="text/css" id="css">
*{padding: 0;margin: 0;}
#banner{width: 800px;height: 360px;margin: 50px auto;perspective: 800px;position: relative;}
#list li{list-style: none;height: 360px;float: left;position: relative;transform-style: preserve-3d; transform: translateZ(-180px);}
#list li div{height: 360px;position: absolute;}
#list li div:nth-child(1){bottom: 360px; transform-origin: bottom;transform: translateZ(180px) rotateX(90deg);background-image: url('img/1.png');}
#list li div:nth-child(2){bottom: -360px; transform-origin: top;transform: translateZ(180px) rotateX(-90deg);background-image: url('img/2.png');}
#list li div:nth-child(3){transform: translateZ(180px);background-image: url('img/3.png');}
#list li div:nth-child(4){transform: translateZ(-180px) rotateX(180deg);background-image: url('img/4.png');}
#banner ol{position: absolute;width: 120px;height: 30px;bottom: 10px;right: 10px;}
#banner ol li{width: 20px;height: 20px;background: grey;line-height: 20px;border-radius: 50px;color:#fff;text-align: center;margin: 5px;float: left;list-style: none;cursor: pointer;}
#banner ol li.on{background: #f60;}
input[type="text"]{display: block;margin: 50px auto;height: 40px;outline: none;}
</style>
<input type="text" placeholder="请输入切割数..." id="txt">
<div id="banner">
<ul id="list">
</ul>
<ol>
<li class="on">1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ol>
</div>
window.onload = function(){
var ol = document.getElementsByTagName('ol');
var ul = document.getElementById('list');
var oLis = ol[0].getElementsByTagName('li');
var uLis = ul.getElementsByTagName('li');
var css = document.querySelector('#css');
init(4);
for(var i=0; i<oLis.length; i++){
(function(s){
oLis[s].onclick = function(){
css.innerHTML += '#banner ul li{transform: translateZ(-180px) rotateX('+(s*-90)+'deg)}';
for(var i=0;i<oLis.length;i++){
oLis[i].className = '';
}
this.className = 'on';
}
})(i);
}
function init(num){
var banner = document.querySelector('#banner');
var bWidth = banner.offsetWidth;
var liWidth = bWidth/num;
css.innerHTML += '#list li,#list li div{width:'+liWidth+'px}';
var uHtml = '';
var z = 0;
for(var i=0;i<num;i++){
uHtml += '<li><div></div><div></div><div></div><div></div></li>';
css.innerHTML += '#list li:nth-child('+(i+1)+') div{background-position:'+(-i*liWidth)+'px}';
css.innerHTML += '#list li:nth-child('+(i+1)+'){transition: 1s '+(0.2*i/num)+'s;}';
css.innerHTML += '#list li:nth-child('+(i+1)+'){z-index:0}';
if(i>num/2){
z--;
css.innerHTML += '#list li:nth-child('+(i+1)+'){z-index: '+z+'}';
}
}
ul.innerHTML = uHtml;
}
var oTxt = document.getElementById('txt');
oTxt.onkeyup = function(e){
if(e.keyCode == 13){
var num = parseInt(this.value);
if( !isNaN(num) ){
init(num);
}
}
}
}