元素移动到边界的时候需要添加限制条件,没思路

元素移动到边界的时候需要添加限制条件,没思路

老师提醒下,没思路了

正在回答

登陆购买课程后可参与讨论,去登陆

4回答

同学你好,关于同学的问题解答如下:

1、第一个原因是使用定位的left、top设置距离,会影响盒子移动距离的计算,检测结果如下:

http://img1.sycdn.imooc.com//climg/5dcbf02b09295b7f14080462.jpg

因此,建议使用translate3d()来设置盒子距离左侧和上方的距离,参考代码:

http://img1.sycdn.imooc.com//climg/5dcbef0709350cfc05760448.jpg

2、js代码中缺少对边界控制的代码,参考如下:

http://img1.sycdn.imooc.com//climg/5dcbf1710929ed5005680258.jpg

http://img1.sycdn.imooc.com//climg/5dcbf1290994e42f06230720.jpg

3、下列代码可以进行优化,建议参考:http://img1.sycdn.imooc.com//climg/5dcbf19009b3ab0e08100354.jpg

如果我的回答帮助了你,希望采纳,祝学习愉快~

提问者 慕言_7946275 2019-11-13 19:41:26
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no">
<title>单指拖拽运动练习</title>
<style>
body{
height: 2000px;
background-color: pink;
}
.box{
position: absolute;
top:20px;
left:20px;
width: 50px;
            height: 50px;
            background-color: #f14f14;
}
</style>
</head>
<body>
<div id="box" class="box"></div>


<script>

var box=document.getElementById("box");

function drag(el,options){
options.x=typeof options.x!=='undefined'?options.x:true;
options.y=typeof options.y!=='undefined'?options.y:false;
if(!options.x && options.y) return;
var curPoint={
x:0,
y:0
};
var startPoint={};
var isTouchMove=false;


el.addEventListener('touchstart',handleStart,false);
el.addEventListener('touchmove',handleMove,false);
el.addEventListener('touchend',handleEnd,false);

function handleStart(ev){
var touch=ev.changedTouches[0];
startPoint.x=touch.pageX;
startPoint.y=touch.pageY;
}
function handleMove(ev){
ev.preventDefault();
isTouchMove=true;
var touch=ev.changedTouches[0];
var diffPoint={};
var movePoint={
x:0,
y:0
};
diffPoint.x=touch.pageX-startPoint.x;
diffPoint.y=touch.pageY-startPoint.y;
if(options.x){
movePoint.x=diffPoint.x+curPoint.x;
}
if(options.y){
movePoint.y=diffPoint.y+curPoint.y;
}
move(el,movePoint.x,movePoint.y);

}
function handleEnd(ev){
if(!isTouchMove)return;
var touch=ev.changedTouches[0];
curPoint.x+=touch.pageX-startPoint.x;
curPoint.y+=touch.pageY-startPoint.y;
isTouchMove=false;
}

console.log(el.parentNode.offsetHeight);
console.log(el.offsetHeight);
var maxWidth=el.parentNode.offsetWidth-el.offsetWidth-20;
var maxHeight=el.parentNode.offsetHeight-el.offsetHeight-20;
function move(el,x,y){
if(x<0){
x=0;
}else if(x>maxWidth){
x=maxWidth;
}

if(y<0){
y=0;
}else if(y>maxHeight){
y=maxHeight;
}

el.style.transform='translate3d(' +x+ 'px,' +y+'px,0)';
}
}

drag(box,{
x:true,
y:true
});
</script>

</body>
</html>

上下左右距离边界都还有20px,不能完全到达边界,问题在哪老师

卡布琦诺 2019-11-13 19:36:18

同学你好,关于同学的疑问解答如下:

1、修改css样式,盒子与左侧和上方的距离使用translate3d()实现,使用定位设置top和left距离,会导致无法控制盒子的边界,参考代码:

http://img1.sycdn.imooc.com//climg/5dcbe8d7094ef66905490441.jpg

2、修改js代码,具体操作如下:

(1)获取页面的宽度和高度、盒子的宽度和高度

http://img1.sycdn.imooc.com//climg/5dcbe9ef0948ae3105760257.jpg

(2)修改边界的判断条件

http://img1.sycdn.imooc.com//climg/5dcbe9f709163dce05400694.jpg

如果我的回答帮助了你,希望采纳,祝学习愉快!

  • 提问者 慕言_7946275 #1
    老师,.我 刚刚试了下之前老师给其它同学的方法,,结果还是有点问题,不能完全到达边界,上下左右都离边界还有20px的距离,问题出在哪呢,具体代码我重新回复到下一楼层
    2019-11-13 19:40:42
提问者 慕言_7946275 2019-11-13 18:06:30
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no">
<title>单指拖拽运动练习</title>
<style>
body{
height: 2000px;
background-color: pink;
}
.box{
position: fixed;
top:20px;
left:20px;
width: 50px;
            height: 50px;
            background-color: #f14f14;
}
</style>
</head>
<body>
<div id="box" class="box"></div>


<script>
function drag(el,options){
options.x=typeof options.x!==undefined?options.x:true;
options.y=typeof options.x!==undefined?options.x:false;
if(!options.x && options.y) return;
var curPoint={
x:0,
y:0
}
var startPoint={};
var isTouchMove=false;


el.addEventListener('touchstart',handleStart,false);
el.addEventListener('touchmove',handleMove,false);
el.addEventListener('touchend',handleEnd,false);

function handleStart(ev){
var touch=ev.changedTouches[0];
startPoint.x=touch.pageX;
startPoint.y=touch.pageY;
}
function handleMove(ev){
var touch=ev.changedTouches[0];
ev.preventDefault();
var diffPoint={};
var movePoint={
x:0,
y:0,
}
diffPoint.x=touch.pageX-startPoint.x;
diffPoint.y=touch.pageY-startPoint.y;
if(options.x){
movePoint.x=diffPoint.x+curPoint.x;
}
if(options.y){
movePoint.y=diffPoint.y+curPoint.y;
}
move(el,movePoint.x,movePoint.y);

}
function handleEnd(ev){
if(!isTouchMove)return;
var touch=ev.changedTouches[0];
curPoint.x+=touch.pageX-startPoint.x;
curPoint.y+=touch.pageY-startPoint.y;
isTouchMove=false;
}

function move(el,x,y){
x=x||0;
y=y||0;
el.style.transform='translate3d(' +x+ 'px,' +y+'px,0)';
}
}
</script>
<script>
var box=document.getElementById("box");
drag(box,{
x:true,
y:true
});

</script>
</body>
</html>


问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
3.WebAPP开发与小程序
  • 参与学习           人
  • 提交作业       622    份
  • 解答问题       6815    个

微信带火了小程序,也让前端工程师有了更多的展现机会,本阶段带你从移动基础知识的学习到webAPP开发,及小程序开发,让你PC端与移动端两端通吃。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师