摘要:
最近在项目中要做一个图片预览的功能,这时候会遇到用户上传很大的图片,已经超出视图界面。最终决定做一个在固定宽和高的位置,用户可以拖动图片查看。所以自己就写了一个支持ie5+,chrome,Firefox,opera等浏览器的可拖动dom元素的插件。
实现这个功能所需要的知识点不多,如下:
1、js中element.style.left
style.left返回的变量是个字符串,是个可改变量
js中element.offsetLeft
offsetLeft返回的是个int类型,不可改变量(意思就是说,改这个变量是不会影响布局的)
2、js 中event.clientX
clientX 事件属性返回当事件被触发时鼠标指针向对于浏览器页面(或客户区)的水平坐标。
3、js中element.className
改变样式的类的方法
以上三点都是些比较熟的知识了,想说的是以下这点:
4、js中为对象添加事件监控
element.addEventListener("event","fun","boolen");
event:表示事件
fun:指的是事件触发后执行的函数
项目地址:https://github.com/baixuexiyang/drag
实例:
var drag = new Drag("test", { onStart: function(){ }, onMove: function(){ document.getElementById('position').innerHTML = '距离左边:' + drag.getPositions().left + ';距离顶部:' + drag.getPositions().top; }, onStop: function(){ } });
我们再开看一个实例中遇到的问题,这个问题我弄了好久都找不出很好的解决方法
我们来看个例子:(方便测试,我把代码写在一个文件里面 )
drag.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>鼠标拖拽</title> <style type="text/css"> <!-- #dragdiv{ background-color:#0A0909; height:200px; width:157px; position:absolute; } .ondrag{ filter:alpha(opacity=200); cursor:move; } .enddrag{ filter:alpha(opacity=100); cursor:default; } #father{ width:600px; height:700px; background:#C63535; } --> </style> </head> <body> <div id="father"> <div id="dragdiv"></div> </div> <script language="JavaScript"> var dragdiv=document.getElementById("dragdiv"); var father=document.getElementById("father"); var offsetx=0; var offsety=0; var draging=false; function beforeDrag(ev){ if (!draging) { draging = true; var l = dragdiv.offsetLeft; var t = dragdiv.offsetTop; offsetx = ev.clientX - l; offsety = ev.clientY - t; } else { dragdiv.className = "enddrag"; dragdiv.removeEventListener("mousemove",onDrag); draging = false; return; } } function endDrag(){ draging=false; dragdiv.className="enddrag"; } function onDrag(ev){ if (!draging) { dragdiv.className = "enddrag"; return; } else { dragdiv.className = "ondrag"; dragdiv.style.left = (ev.clientX - offsetx) + "px"; dragdiv.style.top = (ev.clientY - offsety) + "px"; } } dragdiv.addEventListener("mousedown",beforeDrag,true); dragdiv.addEventListener("mousemove",onDrag,false); dragdiv.addEventListener("mouseup",endDrag,true); </script> </body> </html>
代码很简单,肯用一点点心看的话,都能看懂了
第一次拖拽很成功,按住鼠标进行拖。第二次就不正常了,要想第二次正常,必须鼠标点一下其他地方(就是非拖拽部分)
上面的鼠标事件
"mousedown”是指按下鼠标时触发此事件,(上面触发了beforeDrag函数)
"mousemove"指鼠标移动时触发此事件,(上面触发了onDrag函数)
"mouseup"指鼠标按下后松开鼠标时触发此事件。(上面触发了endDrag函数)
ps:网上查的鼠标时间是"onmousedown",笔者实验"onmousedown"没有事件响应,"mousedowm"才正常
上面所说的问题,尝试了很多实验,考虑到了addEventListener的顺序问题,第三个参数true/false的事件流问题,还是没有找到完美的解决方法
"mouseup"事件在第二次监控就失败了,重新获取焦点才正常(就是鼠标点一下其他地方)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]