一.浏览器的默认行为

    1.默认行为的概念

    默认行为是指事件本身具有的行为,如a标签可以跳转,文本框可输入文字,右键浏览器会出现菜单等行为便被称为浏览器的默认行为。

    浏览器的默认行为会影响到开发,可以通过事件对象下面的属性和方法阻止浏览器的默认行为。

    event.preventDefault(); 标准浏览器阻止默认事件。

    event.returnValue = false; 非标准浏览器(IE8)阻止默认事件,标准也可以使用

    return false; 退出执行, 所有触发事件和动作都不会被执行. 可以用来替代 preventDefault.

    小例子:阻止浏览器的默认行为

    // var link = document.querySelector(‘a’);

    // link.onclick = function(e) {

    // e.preventDefault();

    // };

    oncontextmenu:右键事件

    // document.oncontextmenu = function(e) {

    // e.preventDefault();

    // e.returnValue = false;

    // return false;

    // }

    二.拖拽图片

    限制图片不能跑出可视区。

    documentElement:返回当前元素节点的文档。

    常用方法:document.documentElement //返回HTML的根节点,即 HTML 。

    这个用法和 document.body 的区别是, document.body 返回的是 dom 中的 body 节点。

    clientWidth,clientHeigth ,元素可见区的宽高

    当我们在移动的时候使用e.offsetX/e.offsetY这两个属性时,会意外出现移动块重复回到左上角的问题,这是因为在移动的时候,mousemove事件触发的事件源元素在不断切换,当鼠标移动时会移动到div中这时 offset的源元素不再是父级的div而是移动的div,这时offset值是相对于移动的div 所以是较小的值 ,所以会回到左上角。除了换成client之外,还可以在一定元素上加上一个css的样式 pointer-events: none;这个属性除了指示该元素不是鼠标事件的目标之外,值none表示鼠标事件“穿透”该元素并且指定该元素“下面”的任何东西。这样该元素就不会出发触mousemove事件了。原文链接:https://blog.csdn.net/q970654226/article/details/80282838

    用client实现的拖拽

    var img = document.querySelector(‘img’); img.onmousedown = function(e) { var shortx = e.offsetX; var shorty = e.offsetY; document.onmousemove = function(e) { var leftPosition = e.clientX - shortx; //盒子的left值 var topPosition = e.clientY - shorty; //盒子的top值。 // 限定范围 if (leftPosition < 0) { leftPosition = 0; } else if (leftPosition > document.documentElement.clientWidth - img.offsetWidth) { leftPosition = document.documentElement.clientWidth - img.offsetWidth; } if (topPosition < 0) { topPosition = 0; } else if (topPosition > document.documentElement.clientHeight - img.offsetHeight) { topPosition = document.documentElement.clientHeight - img.offsetHeight; } img.style.left = leftPosition + ‘px’; img.style.top = topPosition + ‘px’; }; document.onmouseup = function() { document.onmousemove = null; }; returnfalse; //阻止浏览器的默认行为 };

    用offset实现的拖拽

    //拖拽效果,用e.offset实现 //常规效果是用e.client实现,因为e.offset存在一个意料之外的情况 //e.client是以浏览器可视区为边界,这个参照物是不变的,但是在鼠标mosemove的过程中,offset的参照系会不断在我们设定的参照系和我们移动的物体上不断切换,这是因为移动的过程其实就是不断高频调用鼠标移动的方法,而我们鼠标此时是放在small方块上的,移动事件需要冒泡到大盒子中,在这个过程中event的对象就会在small->big上进行一个切换,所以就发生了我们用offset的时候,移动的方块不断地往左上角闪现的现象 //解决方法:在单一物体移动的简单运动系统中,可以在给运动物体施加效果后加上一个css属性{pointer-event:none},这个属性是使该元素不被任何鼠标事件影响,这导致了该次运动为一次性运动,即点击一次之后后续的点击事件对运动物体都不会在生效 <style> .box{ height:500px; width:500px; background-color:yellow; position:relative; } .smallbox{ height:50px; width:50px; background-color:red; position:absolute; top:0px; left:0px; / pointer-events:none; / } </style> <divclass=“box”> <divclass=“smallbox”></div> </div> <script> functionboxMove() { letbox = document.querySelector(‘.box’); letsmall = document.querySelector(‘.smallbox’); small.onmousedown = function(e) { letshortX = e.offsetX; letshortY = e.offsetY; small.style.pointerEvents = ‘none’; e.stopPropagation(); box.onmousemove = e=> { letlongX = e.offsetX - shortX; letlongY = e.offsetY - shortY; console.log(e.offsetX) small.style.left = longX + ‘px’; small.style.top = longY + ‘px’; } } } boxMove(); </script>