16、运动框架
//for in : 遍历对象 循环变量代表key
//for of : 遍历集合set map 循环变量代表value
// var obj = {a : 1,b : 2,c : 3,d : 4};
// for(var i in obj){
// console.log(i);
// }
var arr = ['a','b','c','d'];
for(var i in arr){
console.log(i); //i是下标
}
for(var a of arr){
console.log(a); //a是内容
}
一.运动框架
1. 获取非行内样式
2. 运动框架
1> 清除上一次的计时器
2> 开启新的计时器
1>设置开关
2>遍历json
1>> 获取当前值
2>> 计算速度
3>> 判断属性是否到达目标
4>> 设置运动
3>判断开关,是否退出计时器
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
#box{
width: 100px;
height: 100px;
background: red;
opacity: 1;
}
</style>
</head>
<body>
<div id="box">
</div>
<script type="text/javascript" src="js/sport.js" ></script>
<script type="text/javascript">
var oDiv = document.getElementById("box");
oDiv.onmouseenter = function(){
sport(this,{width:300},function(){
sport(oDiv,{height:300},function(){
sport(oDiv,{opacity:30})
});
});
// sport(this,{height:300});
}
oDiv.onmouseleave = function(){
sport(this,{opacity:100},function(){
sport(oDiv,{height:100},function(){
sport(oDiv,{width:100});
})
})
}
</script>
</body>
</html>
sport.js
//sport('oDiv',{width : 300,height: 300,opacity : 0.3})
function sport(obj,json,fn){
//1.先清除上一次的计时器
clearInterval(obj.timer);
//2.开启新的计时器
obj.timer = setInterval(function(){
//假设一个变量为true,代表所有的属性都已经到达目标
var stop = true;
//遍历json对象,取出所有的属性及目标值
for(var attr in json){
//1.获取当前的值
var cur = 0;
if(attr == 'opacity'){
cur = parseInt(parseFloat(getStyle(obj,attr)) * 100)
}else{
cur = parseInt(getStyle(obj,attr));
}
//2.计算速度
var speed = (json[attr] - cur) / 8;
speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
//3.检测停止
if(cur != json[attr]){
stop = false;
}
if(attr == 'opacity'){
//改变透明度
obj.style.opacity = (cur + speed) / 100;
obj.style.filter = 'alpha(opacity=' + (cur + speed) + ')';
}else{
//改变其它属性值
obj.style[attr] = cur + speed + 'px';
}
// console.log(cur,json[attr],speed);
}
if(stop){
clearInterval(obj.timer);
if(typeof fn == 'function'){
fn();
}
}
},30)
}
//获取非行内样式
function getStyle(obj,attr){
return obj.currentStyle ? obj.currentStyle[attr] : getComputedStyle(obj,true)[attr];
}
二.轮播图
1.先获取页面中所需要的元素
2.给项目中添加相应的事件
1.左右遮罩与左右按钮(移入移出事件)——————按钮显示(隐藏)
2.左右按钮(点击事件) ——————————图片切换(当前下标) ----(zindex)
3.所有的小图(移入移出事件)----透明度变换
4.所有的小图 (点击事件)-----图片切换(改变当前下标)
3.设置轮播(大图轮播---zindex)(小图轮播----ul的left值)
4.自动轮播(计时器)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
*{
padding: 0;
margin: 0;
}
li{
list-style: none;
}
body{
background: #CCCCCC;
}
#box{
width: 400px;
margin: 50px auto;
height: 426px;
overflow: hidden;
border: 1px solid yellow;
}
#top{
position: relative;
height: 320px;
}
#top li{
position: absolute;
top: 0;
left: 0;
}
#left{
position: absolute;
width: 200px;
top: 0;
left: 0;
height: 320px;
z-index: 1000;
}
#right{
position: absolute;
width: 200px;
height: 320px;
top: 0;
right: 0;
z-index: 1000;
}
#btn_l{
position: absolute;
background: url(img/btn.gif) no-repeat;
height: 60px;
width: 60px;
left: 10px;
top: 130px;
z-index: 1001;
opacity: 0;
filter: alpha(opacity=0);
}
#btn_r{
position: absolute;
background: url(img/btn.gif) no-repeat 0 -60px;
height: 60px;
width: 60px;
right: 10px;
top: 130px;
z-index: 1001;
opacity: 0;
filter: alpha(opacity=0);
}
#bottom{
position: relative;
}
#small_ul{
position: absolute;
top: 0;
left: 0;
}
#small_ul li{
float: left;
}
#small_ul img{
height: 90px;
width: 120px;
padding: 6px;
}
</style>
<script type="text/javascript" src="js/sport.js" ></script>
<script type="text/javascript">
//
window.onload = function(){
//1.获取页面元素
//获取大盒子
let oBigBox = document.querySelector('#box');
// //获取上半部
// let oTop = document.querySelector('#top');
//获取左遮罩
let oLeftMark = document.querySelector('#left');
//获取右遮罩
let oRightMark = document.querySelector('#right');
//获取左按钮
let oLeftBtn = document.querySelector('#btn_l');
//获取右按钮
let oRightBtn = document.querySelector('#btn_r');
//获取所有的大图
let oBigPics = document.querySelectorAll('#top li');
// //获取底部
// let oBottom = document.querySelector('#bottom');
//获取小图ul
let oSmallUl = document.querySelector('#small_ul');
//获取所有的小图
let oSmallPic = document.querySelectorAll('#bottom li');
//2.设置小图UL的总宽度
oSmallUl.style.width = oSmallPic[0].offsetWidth * oSmallPic.length + 'px';
//3.给左遮罩和左按钮同时添加移入事件,使左按钮显示
oLeftMark.onmouseover = oLeftBtn.onmouseover = function(){
sport(oLeftBtn,{opacity : 100});
}
//4.给左遮罩和左按钮同时添加移出事件,使左按钮隐藏
oLeftMark.onmouseout = oLeftBtn.onmouseout = function(){
sport(oLeftBtn,{opacity:0});
}
//5.给右遮罩和右按钮同时添加移入事件,使右按钮显示
oRightMark.onmouseenter = oRightBtn.onmouseenter = function(){
sport(oRightBtn,{opacity : 100});
}
//6.给右遮罩和右按钮同时添加移出事件,使右按钮隐藏
oRightMark.onmouseleave = oRightBtn.onmouseleave = function(){
sport(oRightBtn,{opacity : 0});
}
//定义一个控制图片轮播的下标
let indexA = 0;
//定义一个改变z-index的变量
let zIndex = 1;
//记录计时器
let timer = null;
slider();
autoPlay();
//7.给左右按钮添加点击事件
oLeftBtn.onclick = function(){
indexA --;
if(indexA == -1){
indexA = oBigPics.length - 1;
}
slider();
}
oRightBtn.onclick = function(){
indexA ++;
if(indexA == oBigPics.length){
indexA = 0;
}
slider();
}
//8.给小图添加事件
for(let i = 0,len = oSmallPic.length;i < len;i ++){
//移入时,透明度100%
oSmallPic[i].onmouseenter = function(){
sport(this,{opacity : 100});
}
//移出时,透明度50%
oSmallPic[i].onmouseleave = function(){
if(indexA != i){
sport(this,{opacity:50});
}
}
//点击时,轮播到当前点击的图片
oSmallPic[i].onclick = function(){
indexA = i;
slider();
}
}
//9.设置轮播
function slider(){
//大图轮播
oBigPics[indexA].style.zIndex = ++ zIndex;
//小图轮播
if(indexA == 0){
sport(oSmallUl,{left : 0});
}else if(indexA == oSmallPic.length - 1){
sport(oSmallUl,{left : -(oSmallPic.length - 3) * oSmallPic[0].offsetWidth});
}else{
sport(oSmallUl,{left : -(indexA - 1) * oSmallPic[0].offsetWidth});
}
//初始化所有小图的透明度
for(let i = 0,len = oSmallPic.length;i < len;i ++){
sport(oSmallPic[i],{opacity:50});
}
sport(oSmallPic[indexA],{opacity:100});
}
//自动轮播
function autoPlay(){
timer = setInterval(function(){
indexA ++;
if(indexA == oBigPics.length){
indexA = 0;
}
slider();
},3000)
}
//给大盒子添加移入移出事件
oBigBox.onmouseenter = function(){
clearInterval(timer);
}
oBigBox.onmouseleave = function(){
autoPlay();
}
}
</script>
</head>
<body>
<div id="box">
<ul id="top">
<div id="left"></div>
<div id="right"></div>
<a href="javascript:;" id="btn_l"></a>
<a href="javascript:;" id="btn_r"></a>
<li style="z-index: 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>
<li><img src="img/5.jpg"/></li>
<li><img src="img/6.jpg"/></li>
</ul>
<div id="bottom">
<ul id="small_ul">
<li><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>
<li><img src="img/5.jpg"/></li>
<li><img src="img/6.jpg"/></li>
</ul>
</div>
</div>
</body>
</html>
sport.js
function getStyle(obj,attr){
return obj.currentStyle ? obj.currentStyle[attr] : getComputedStyle(obj,1)[attr];
}
//回调函数 : 将一个函数作为另一个函数的参数时。
function sport(obj,json,fn){
clearInterval(obj.timer);
obj.timer = setInterval(function(){
var stop = true;
for(var attr in json){
var cur = attr == 'opacity' ? parseInt(parseFloat(getStyle(obj,attr)) * 100) : parseInt(getStyle(obj,attr));
var speed = (json[attr] - cur) / 8; //基数
speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
if(cur != json[attr]){
stop = false;
}
if(attr == 'opacity'){
obj.style.opacity = (cur + speed) / 100;
obj.style.filter = 'alpha(opacity=' + (cur + speed) + ')';
}else{
obj.style[attr] = cur + speed + 'px';
}
}
if(stop){
clearInterval(obj.timer);
if(typeof fn === 'function'){
fn();
}
}
},30)
}
三.放大镜
1.瀑布流
响应式布局
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title></title>
<style>
* {
padding: 0;
margin: 0;
}
html {
height: 100%;
}
body {
height: 100%;
}
img {
border: 0;
}
div.wrap {
width: 100%;
margin: 0 auto;
overflow: hidden;
position: relative;
background: #DDD;
}
div.wrap div {
width: 200px;
padding: 4px;
border: 1px solid #000;
float: left;
position: absolute;
}
div.wrap div h3 {
line-height: 35px;
}
div.wrap div img {
width: 200px;
}
</style>
<script>
/*
*
*/
window.onload = function(){
loading('wrap');
}
window.onresize = function(){
loading('wrap');
}
//加载图片
function loading(id,child,space){
//初始化参数
if(!id){
return;
}
child = child || 'div';
space = space || 10;
//获取瀑布流的大盒子
let oBigBox = document.getElementById(id);
//获取所有的子节点
let oChilds = oBigBox.getElementsByTagName(child);
//获取大盒子的宽度
let bigBoxWidth = oBigBox.offsetWidth;
//获取单个子节点的宽度
let childWidth = oChilds[0].offsetWidth;
//alert(childWidth)
//计算列数
let colNum = Math.floor(bigBoxWidth / childWidth);
//alert(colNum);
//计算左右间隙
let padding = Math.floor((bigBoxWidth - childWidth * colNum) / (colNum + 1));
//初始化最一行的位置
var arr = []; //放置所有子节点的坐标值{left:x,top:x}
for(let i = 0;i < colNum;i ++){
arr[i] = new Object();
arr[i].left = padding * (i + 1) + (i * childWidth);
arr[i].top = space;
}
//加载
for(let i = 0,len = oChilds.length;i < len;i ++){
var index = minTop(arr);
oChilds[i].style.position = 'absolute';
oChilds[i].style.left = arr[index].left + 'px';
oChilds[i].style.top = arr[index].top + 'px';
//改变数组中top值
arr[index].top += oChilds[i].offsetHeight + space;
oBigBox.style.height = arr[index].top + 'px';
}
}
//求最小高度列的top值(下标)
function minTop(arr){
var min = arr[0].top; //第一个对象中top值
var index = 0;
for(let i = 0,len = arr.length;i < len;i ++){
if(min > arr[i].top){
min = arr[i].top;
index = i;
}
}
return index;
}
</script>
</head>
2.放大镜
<head>
<meta charset="utf-8" />
<title></title>
<link rel="stylesheet" type="text/css" href="css/style.css"/>
<script type="text/javascript">
/*
* 一。当鼠标移入遮罩时,滑块和大图所在的盒子显示
* 二。当鼠标移出遮罩时,滑块和大图所在的盒子隐藏
* 三。在遮罩上设置鼠标移动事件,做鼠标跟随的效果---边界
* 四。计算滑块在小图上的移动比例
* 五。设置大图的移动距离
*
* 及格率: 及格人数 / 总人数
* 移动比例: 当前滑块的left值 / 当前滑动移动的总范围
*
*/
window.onload = function(){
//获取页面所需元素
const oBigBox = document.getElementById("div1");
//获取小图
const oSmallPic = document.querySelector('.small_pic');
//获取遮罩
const oMark = document.querySelector('.mark');
//获取滑块
const oFloat = document.querySelector('.float_layer');
//获取大图盒子
const oBigPic = document.querySelector('.big_pic');
//获取大图
const oBigImg = document.querySelector('.big_pic img');
//给遮罩添加移入事件,滑块和大图所在的盒子显示
oMark.onmouseenter = function(){
oFloat.style.display = 'block';
oBigPic.style.display = 'block';
}
//给遮罩添加移出事件,滑块和大图所在的盒子隐藏
oMark.onmouseleave = function(){
oFloat.style.display = 'none';
oBigPic.style.display = 'none';
}
//给遮罩添加移动事件,实现滑块跟随并设置边界
oMark.onmousemove = function(evt){
var e = evt || window.event;
let left = e.pageX - oBigBox.offsetLeft - oMark.offsetLeft - oFloat.offsetWidth / 2;
let top = e.pageY - oBigBox.offsetTop - oMark.offsetTop - oFloat.offsetHeight / 2;
//设置边界
if(left <= 0){
left = 0;
}else if(left >= oMark.offsetWidth - oFloat.offsetWidth){
left = oMark.offsetWidth - oFloat.offsetWidth;
}
if(top <= 0){
top = 0;
}else if(top >= oMark.offsetHeight - oFloat.offsetHeight){
top = oMark.offsetHeight - oFloat.offsetHeight;
}
oFloat.style.left = left + 'px';
oFloat.style.top = top + 'px';
//滑块在小图的移动比例
let pX = left / (oMark.offsetWidth - oFloat.offsetWidth);
let pY = top / (oMark.offsetHeight - oFloat.offsetHeight);
//设置大图的坐标值
oBigImg.style.left = - pX * (oBigImg.offsetWidth - oBigPic.offsetWidth) + 'px';
oBigImg.style.top = - pY * (oBigImg.offsetHeight - oBigPic.offsetHeight) + 'px';
}
}
</script>
</head>
<body>
<div id="div1">
<div class="small_pic">
<span class="mark"></span> <!--遮罩层-->
<span class="float_layer"></span>
<img src="img/small.jpg" />
</div>
<div class="big_pic">
<img src="img/big.jpg" />
</div>
</div>
</body>
3.碰撞检测
html:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<input type="button" name="btn" id="btn" value="创建鸟" />
<script type="text/javascript" src="js/create.js" ></script>
<script type="text/javascript">
//获取按钮
let oBtn = document.getElementById("btn");
oBtn.onclick = function(){
new Bird();
}
</script>
</body>
</html>
js:
class Bird{
constructor(){
this.ele = document.createElement('img'); // 创建img
//初始化鸟
this.init();
}
init(){
//设置src属性
this.ele.src = 'img/2.gif';
//将鸟放到body里
document.body.appendChild(this.ele);
//初始化鸟的大小
this.ele.style.width = '200px';
this.ele.style.height = '200px';
//定位
this.ele.style.position = 'absolute';
//设置速度
this.speedX = this.randomInt(5,10);
this.speedY = this.randomInt(5,10);
this.fly(); //调用飞的方法
this.drag(); //调用拖拽的方法
}
//随机数
randomInt(min,max){
return Math.floor(Math.random() * (max - min + 1) + min);
}
//飞
fly(){
setInterval(()=>{
let left = this.ele.offsetLeft + this.speedX;
let top = this.ele.offsetTop + this.speedY;
//设置边界
if(left <= 0){
left = 0;
this.speedX *= -1;
}else if(left >= document.documentElement.clientWidth - this.ele.offsetWidth){
left = document.documentElement.clientWidth - this.ele.offsetWidth;
this.speedX *= -1;
}
if(top <= 0){
top = 0;
this.speedY *= -1;
}else if(top >= document.documentElement.clientHeight - this.ele.offsetHeight){
top = document.documentElement.clientHeight - this.ele.offsetHeight;
this.speedY *= -1;
}
this.ele.style.left = left + 'px';
this.ele.style.top = top + 'px';
},30)
}
drag(){
this.ele.onmousedown = (evt)=>{
var e = evt || window.event;
this.disX = e.offsetX;
this.disY = e.offsetY;
document.onmousemove = (evt) =>{
var e = evt || window.event;
let left = e.pageX - this.disX;
let top = e.pageY - this.disY;
//设置边界
if(left <= 0){
left = 0;
}else if(left >= document.documentElement.clientWidth - this.ele.offsetWidth){
left = document.documentElement.clientWidth - this.ele.offsetWidth;
}
if(top <= 0){
top = 0;
}else if(top >= document.documentElement.clientHeight - this.ele.offsetHeight){
top = document.documentElement.clientHeight - this.ele.offsetHeight;
}
this.ele.style.left = left + 'px';
this.ele.style.top = top + 'px';
}
document.onmouseup = function(){
document.onmousemove = null;
}
document.ondragstart = function(){
return false;
}
}
}
}