用js仿探探拖拽卡片的效果、飞卡片的效果,感觉挺酷,高级前端程序员必会
时间:2024-04-07 07:55:41 来源:网络cs 作者:璐璐 栏目:社群媒体 阅读:
var obj = boxStack[i];
obj.style.left=left+‘px’;
obj.style.top=top+‘px’;
obj.style.marginLeft=marginLeft-i*6+‘px’;
obj.style.marginTop=marginTop-i*6+‘px’;
obj.style.zIndex=zIndex+i;
obj.style.width=(width+i*12)+‘px’;
obj.style.height=height+‘px’;
//obj.children[0].style.width=(width+i*12)+‘px’;
//obj.children[0].style.height=height+‘px’;
//每个卡片设置不同的颜色
switch (obj.id) {
case ‘card1’:
obj.style.background = ‘aliceblue’;
break;
case ‘card2’:
obj.style.background = ‘skyblue’;
break;
case ‘card3’:
obj.style.background = ‘powderblue’;
break;
case ‘card4’:
obj.style.background = ‘steelblue’;
break;
}
}
}
//拖动卡片的事件函数
function tran(e){
var e = e || window.event;
var target = e.target || e.srcElement;
console.log(target.id);
if(target.id){
//拖动当前的卡片
move_tran(target);
}
}
//点击box的事件函数
function tranBox(e){
var e = e || window.event;
var target = e.target || e.srcElement;
if(target.id){
if(target.id===‘div_box’){//点击div_box从最上面开始飞
move_tran(boxStack[boxStack.length-1]);
}
}
}
var moveFlag=false;//正在移动表示,有卡片正在移动,move 函数将不会被调用
function move_tran(obj,direction,step){
if(moveFlag) return ;//表示有卡片正在移动,move 函数将不会被调用
if(obj.timer) return ;//避免重复点击
moveFlag=true;//设置当前正在移动
step=step||0;
var cb = (function (){//回调函数
var speed=5;
var screenTotal=0;
var distance = 0;
var endFlag=false;
function init(){//处理初始步距
if(direction==‘top’||direction==‘bottom’){
speed=10;
screenTotal = window.screen.availHeight;
distance = Math.ceil((top+step)/screenTotal*100);
}else{
screenTotal = window.screen.availWidth;
distance = Math.ceil((left+step)/screenTotal*100);
}
}
init();
return function(){
//针对上下左右有不同的设置
if(direction==‘left’){
distance -= speed;
dire=‘left’;
if(distance<=1){
endFlag=true;
}
}else if(direction==‘top’){
distance -= speed;
dire=‘top’;
if(distance<=1){
endFlag=true;
}
}else if(direction==‘bottom’){
distance += speed;
dire=‘top’;
if(distance>=90){
endFlag=true;
}
}else{
distance += speed;
dire=‘left’;
//超过一定范围就调整卡片
if(distance>=90){
endFlag=true;
}
}
if(endFlag){
//清除定时器
clearInterval(obj.timer);
obj.timer=null;
//把当前元素 从盒子队列中移动到最前面
moveFlag=false;
var index = boxStack.findIndex(function(item){
return obj.id==item.id;
})
var cur = boxStack.splice(index,1);
boxStack.unshift(cur[0]);//添加到队列最前面
setTimeout(function(){
reset();//重新部署盒子
},50)//设置重写设置盒子样式的延时,看起来更舒服
return ;
}
console.log(“distance===”,distance)
//设置left或者top作移动
obj.style[dire]=distance +‘%’;
}
})();
obj.timer = setInterval(cb,35);
}
/* 鼠标拖动 */
/*
分析:
获取鼠标实时移动的坐标;m_move_x,m_move_y
鼠标按下时的坐标;m_down_x,m_down_y
div的坐标;dx,dy
div的新坐标;ndx,ndy
最大边界maxX,maxY
鼠标相对位移 nx,ny
*/
var isDown = false;//记录鼠标状态
var recover = false;
var move_div;//要操作的div对象
var m_move_x,m_move_y,m_down_x,m_down_y,dx,dy,ndx,ndy,maxX,maxY,nx=0,ny=0;
//鼠标按下
function drag(e){
var e = e || event;
move_div = this;
isDown = true;
//获取鼠标按下时坐标
m_down_x = e.clientX;
m_down_y = e.clientY;
//实时更新div的坐标
dx = move_div.offsetLeft;
dy = move_div.offsetTop;
}
//鼠标移动
document.οnmοusemοve=function move(e){
var e = e || event;
//鼠标按下时移动才触发
if(isDown && move_div){
//获取鼠标移动实时坐标
m_move_x = e.clientX;
m_move_y = e.clientY;
nx = m_move_x-m_down_x;
ny = m_move_y-m_down_y;
if(Math.abs(nx)>=200){
move_tran(move_div,nx>0?‘right’:‘left’,nx);
isDown = false;
move_div= null;
return ;
}else if(Math.abs(ny)>=100){
move_tran(move_div,ny>0?‘bottom’:‘top’,ny);
isDown = false;
move_div= null;
return ;
}
var id = move_div.id.substr(4);
ndx = dx+nx-(id-1)*4;
ndy = dy+ny-(id-1)*4;
//设置拖动的边界
maxX = window.screen.availWidth-20-move_div.offsetWidth;
maxY = window.screen.availHeight-110-move_div.offsetHeight;
if(ndx<=0){
ndx=1;
}
if(ndy<=0){
ndy=1;
}
if(ndx>=maxX){
ndx=maxX;
}
if(ndy>=maxY){
ndy=maxY;
}
//把新div坐标值赋给div对象
move_div.style.left = ndx+“px”;
move_div.style.top = ndy+“px”;
}
}
//鼠标释放
document.οnmοuseup=function up(e){
var e = e || event;
//获取鼠标移动实时坐标
m_move_x = e.clientX;
m_move_y = e.clientY;
nx = m_move_x-m_down_x;
ny = m_move_y-m_down_y;
if(nx<300){
reset();
}
isDown = false;
move_div= null;
}
//初始化
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
Vue 面试题
1.Vue 双向绑定原理
2.描述下 vue 从初始化页面–修改数据–刷新页面 UI 的过程?
3.你是如何理解 Vue 的响应式系统的?
4.虚拟 DOM 实现原理
5.既然 Vue 通过数据劫持可以精准探测数据变化,为什么还需要虚拟 DOM 进行 diff 检测差异?
6.Vue 中 key 值的作用?
7.Vue 的生命周期
8.Vue 组件间通信有哪些方式?
9.watch、methods 和 computed 的区别?
10.vue 中怎么重置 data?
11.组件中写 name 选项有什么作用?
12.vue-router 有哪些钩子函数?
13.route 和 router 的区别是什么?
14.说一下 Vue 和 React 的认识,做一个简单的对比
15.Vue 的 nextTick 的原理是什么?
16.Vuex 有哪几种属性?
17.vue 首屏加载优化
18.Vue 3.0 有没有过了解?
19.vue-cli 替我们做了哪些工作?
Vue 面试题
1.Vue 双向绑定原理
2.描述下 vue 从初始化页面–修改数据–刷新页面 UI 的过程?
3.你是如何理解 Vue 的响应式系统的?
4.虚拟 DOM 实现原理
5.既然 Vue 通过数据劫持可以精准探测数据变化,为什么还需要虚拟 DOM 进行 diff 检测差异?
6.Vue 中 key 值的作用?
7.Vue 的生命周期
8.Vue 组件间通信有哪些方式?
9.watch、methods 和 computed 的区别?
10.vue 中怎么重置 data?
11.组件中写 name 选项有什么作用?
12.vue-router 有哪些钩子函数?
13.route 和 router 的区别是什么?
14.说一下 Vue 和 React 的认识,做一个简单的对比
15.Vue 的 nextTick 的原理是什么?
16.Vuex 有哪几种属性?
17.vue 首屏加载优化
18.Vue 3.0 有没有过了解?
19.vue-cli 替我们做了哪些工作?
[外链图片转存中…(img-jm2CVYuN-1711871064007)]
CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
本文链接:https://www.kjpai.cn/news/2024-04-07/155004.html,文章来源:网络cs,作者:璐璐,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!
下一篇:返回列表