1.三点语法
下述为三种三点语法
1. ...剩余参数
function fn(...arg){
}
2. 数组方式
var arr=[1,2,3,4]
var arr1=[...arr]
console.log(arr1)
3. 对象方式
var obj={a:1,b:2,c:3}
var obj1={...obj}
console.log(obj1) //{a: 1, b: 2, c: 3}
例:
1. ...剩余参数 不再使用arguments
function fn(...arg){
console.log(arg)
}
fn(1,2,3,4,5,6,7)
function fn(a,b,...arg){
console.log(a,b,arg)
}
fn(1,2,3,4,5)
2.数组方式
var arr=[1,2,3,4]
var arr1=[...arr,5,6,7,8]
console.log(arr1) //[1, 2, 3, 4, 5, 6, 7, 8]
var arr1=[...arr]
console.log(arr1===arr) //false
var arr2=arr.concat(arr1)
var arr2=[...arr,...arr1]
console.log(arr2) // [1, 2, 3, 4, 1, 2, 3, 4]
var arr=[1,2,3,5,6]
// Math.max()
// Math.max.apply(null,arr)
var max=Math.max(...arr)
console.log(max) //6
3.对象的释放方式
var obj={a:1,b:2,c:3}
var obj1={...obj}
console.log(obj1===obj) //false
var obj1={...obj,d:5,e:6}
console.log(obj1) //{a: 1, b: 2, c: 3, d: 5, e: 6}
4.对应函数
function fn(a,b){
console.log(a,b)
}
var obj={a:1,b:2}
fn(...obj)
function fn(...obj){//错误 只支持数组
}
fn({a:1,b:2})
2.案例-各种运动
1.碰撞运动
var div1=document.querySelector(".div1")
var div0=document.querySelector(".div0")
var x=0,y=0,speedX=2,speedY=2
setInterval(animation,16)
function animation(){
//这两句是触底反弹
if(y>div0.offsetHeight-div1.offsetHeight || y<0) speedY=-speedY
if(x>div0.offsetWidth-div1.offsetWidth || x<0) speedX=-speedX
x+=speedX
y+=speedY
div1.style.left=x+"px"
div1.style.top=y+"px"
}
2.圆周运动
var r=100
var angle=0
var div1=document.querySelector(".div1")
var x=0,y=0,speed=1,initX=200,initY=200
setInterval(animation,16)
function animation(){ //这里是让他不断地加转速
if((angle+=speed)>360){
angle-=360
speed++
}
x=initX+Math.sin(Math.PI/180*angle)*r
y=initY+Math.cos(Math.PI/180*angle)*r
div1.style.left=x+"px"
div1.style.top=y+"px"
}
/*
1\2000ms 运行完成所有距离
2、每秒运行多少次
*/
3.点到哪动到哪-这样写太麻烦
var div1=document.querySelector(".div1")
var bool=false,speedX=0,speedY=0,x=0,y=0,time=0
document.addEventListener("click",clickHandler)
setInterval(animation,16)
function clickHandler(e){
time=Math.ceil(2000/16)
speedX=(e.clientX-(div1.offsetLeft+div1.offsetWidth/2))/time
speedY=(e.clientY-(div1.offsetTop+div1.offsetHeight/2))/time
bool=true
}
function animation(){
if(!bool) return
if(time<0){
return bool=false
}
time--
x+=speedX
y+=speedY
div1.style.left=x+"px"
div1.style.top=y+"px"
}
4.弹跳悠悠球
var div1=document.querySelector(".div1")
document.addEventListener("click",clickHandler)
setInterval(animation,16)
function clickHandler(e){
var tween=new TWEEN.Tween({x:div1.offsetLeft,y:div1.offsetTop})
tween.to({x:e.clientX-div1.offsetWidth/2,y:e.clientY-div1.offsetHeight/2},2000)
tween.easing(TWEEN.Easing.Bounce.Out)
tween.repeat(1)
tween.yoyo(true)
tween.onUpdate(updateHandler)
tween.start()
}
function updateHandler(){
// console.log(this)
div1.style.left=this.x+"px"
div1.style.top=this.y+"px"
}
function animation(){
TWEEN.update()
}
3.案例-单选框和多选框
<script type="module">
import Radio from "./js/Radio.js"
var arr=["游泳","跑步","看电影","写程序","玩游戏"]
arr.forEach(item=>{
var ck=new Radio(item,"hobby")
ck.appendTo("body")
ck.addEventListener("change",changeHandler)
})
var list=["男","女"]
list.forEach(item=>{
var ck=new Radio(item,"sex")
ck.appendTo("body")
ck.addEventListener("change",changeHandler)
})
function changeHandler(e){
console.log(e)
}
4.轮播图
var icon,left,right,imgCon,prev,crousel,ids;
var pos=0,bool=false,time=300;
init();
function init(){
crousel=document.querySelector(".crousel");
icon=document.querySelector(".icon");
left=document.querySelector(".left");
right=document.querySelector(".right");
imgCon=document.querySelector(".img-con");
icon.addEventListener("click",iconClickHandler);
left.addEventListener("click",bnClickHandler);
right.addEventListener("click",bnClickHandler);
changePrev(icon.children[pos]);
setInterval(autoChange,16);
crousel.addEventListener("mouseleave",mouseHandler);
crousel.addEventListener("mouseenter",mouseHandler);
}
function mouseHandler(e){
if(e.type==="mouseleave"){
bool=true;
time=300;
}else{
bool=false;
}
}
function bnClickHandler(e){
if(ids) return;
if(this===left){
if(--pos<0)pos=4;
}else{
if(++pos>4)pos=0;
}
imgMove()
changePrev(icon.children[pos]);
}
function iconClickHandler(e){
if(ids) return;
if(e.target.nodeName!=="LI") return;
pos=Array.from(icon.children).indexOf(e.target);
changePrev(icon.children[pos]);
imgMove();
}
function imgMove(){
imgCon.style.left=(-pos*100)+'vw';
ids=setTimeout(function(){
clearTimeout(ids);
ids=undefined;
},600)
}
function changePrev(elem){
if(prev){
prev.style.backgroundColor="transparent"
}
prev=elem;
prev.style.backgroundColor="red";
}
function autoChange(){
if(!bool) return;
time--;
if(time>0) return;
time=300;
var evt=new MouseEvent("click");
right.dispatchEvent(evt);
}