24行代码,让你的网页元素任意放大、缩小、拖拽、移动

6 篇文章 0 订阅

原文地址:点击打开链接

前段时间写的,蛮长时间了。个人很喜欢,一段很简单的代码,却能够实现很多功能。到底多简单,先来看代码:

基于jQuery:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$(document).mousemove( function (e) {
     if (!! this .move) {
         var posix = !document.move_target ? { 'x' : 0, 'y' : 0} : document.move_target.posix,
             callback = document.call_down || function () {
                 $( this .move_target).css({
                     'top' : e.pageY - posix.y,
                     'left' : e.pageX - posix.x
                 });
             };
 
         callback.call( this , e, posix);
     }
}).mouseup( function (e) {
     if (!! this .move) {
         var callback = document.call_up || function (){};
         callback.call( this , e);
         $.extend( this , {
             'move' : false ,
             'move_target' : null ,
             'call_down' : false ,
             'call_up' : false
         });
     }
});

原理稍后分析,先来看看效果:

简单的拖拽

src="http://jsfiddle.net/aiyuchen/Kpb8p/embedded/result,js,css,html" style="border-width: 0px; border-style: initial; margin: 0px; padding: 0px; vertical-align: baseline; color: rgb(51, 51, 51); font-family: Georgia, 'Bitstream Charter', serif; font-size: 16px; line-height: 28.8px; width: 861.078px; height: 300px; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">

将代码剥离,只要写5行就可以实现拖拽了,是不是很简单:

1
2
3
4
5
6
$( '#box' ).mousedown( function (e) {
     var offset = $( this ).offset();
     
     this .posix = { 'x' : e.pageX - offset.left, 'y' : e.pageY - offset.top};
     $.extend(document, { 'move' : true , 'move_target' : this });
});

放大、缩小

我们给拖拽增加点功能,支持放大、缩小,先看效果

src="http://jsfiddle.net/aiyuchen/FmMc2/embedded/result,js,css,html" style="border-width: 0px; border-style: initial; margin: 0px; padding: 0px; vertical-align: baseline; color: rgb(51, 51, 51); font-family: Georgia, 'Bitstream Charter', serif; font-size: 16px; line-height: 28.8px; width: 861.078px; height: 300px; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">

将代码剥离,原先的代码保留不变,增加一个绑定事件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var $box = $( '#box' ).mousedown( function (e) {
     var offset = $( this ).offset();
     
     this .posix = { 'x' : e.pageX - offset.left, 'y' : e.pageY - offset.top};
     $.extend(document, { 'move' : true , 'move_target' : this });
}).on( 'mousedown' , '#coor' , function (e) {
     var posix = {
             'w' : $box.width(),
             'h' : $box.height(),
             'x' : e.pageX,
             'y' : e.pageY
         };
     
     $.extend(document, { 'move' : true , 'call_down' : function (e) {
         $box.css({
             'width' : Math.max(30, e.pageX - posix.x + posix.w),
             'height' : Math.max(30, e.pageY - posix.y + posix.h)
         });
     }});
     return false ;
});

这样来实现放大、缩小、拖拽是不是很简答,还能实现很多其他效果,大家慢慢领悟。

原理分析:

放大、缩小、拖拽都离不开在网页上拖动鼠标,对于前端来说就是document的mousemove,当鼠标在网页上移动的时候,无时无刻不在触发mousemove事件,当鼠标触发事件时,什么时候需要执行我们特定的操作,这就是我们要做的了。我在mousemove中增加了几个对象来判定是否进行操作:

  • move:是否执行触发操作
  • move_target:操作的元素对象
  • move_target.posix:操作对象的坐标
  • call_down:mousemove的时候的回调函数,传回来的this指向document
  • call_up:当鼠标弹起的时候执行的回调函数,传回来的this指向document

小提示:

  1. 简单的操作,只需要设定move_target对象,设置move_target的时候不要忘记了move_target.posix哦;
  2. 复杂的操作可以通过call_down、call_up进行回调操作,这个时候是可以不用设置move_target对象的

深入研究

拖拽和放大、缩小实现了,但是有个问题,当我们鼠标点击并滑动的时候,是会选中文本的,为了避免这个问题,大家可以参考这篇文章

难道你以为仅仅这样就可以阻止firefox选中文本了嘛

网页的放大、缩小、拖拽事件就研究到这里了,如果你还有什么疑问,欢迎留言哦~~

最后,有什么问题,大家可以给我留言哦,别忘了关注我的博客哦:

http://list.qq.com/cgi-bin/qf_invite?id=b6eb34388fd016582957d6e50d005146e24fe6b166ee66c0

### 回答1: jtopo是一款JavaScript的绘图库,可以用于在网页中创建各种图形和拓扑图。在jtopo中,画布是一个用于展示图形的区域,而默认情况下,这个画布是不可移动的。 jtopo的画布不可移动的意思是,用户无法通过鼠标或其他操作手段去拖动整个画布。这是因为在jtopo的设计中,画布是用来展示图形的,而不是用来进任意移动和调整的。这样的设计有其合理性和优点。 首先,不可移动的画布可以保证图形的稳定性和准确性。当我们布局一些复杂的图形和拓扑时,每个节点的位置和位置关系都是经过精心调整和设计的,任意移动画布可能会破坏这些布局,导致图形错乱甚至丧失原本的信息和意义。 其次,不可移动的画布可以提高用户体验。如果画布可以随意移动,那么用户在进操作时可能会频繁地无意识地拖动画布,导致视图的不稳定和不连贯,给用户使用带来困扰和不便。 当然,jtopo也提供了一些其他的操作方式,例如可以通过鼠标滚轮来进画布的放大缩小,以及通过其他操作来调整整个图形的布局。但是整体来说,不可移动的画布是jtopo的设计原则之一,它的目的是为了使图形的展示更加稳定和准确,提升用户体验。 ### 回答2: jtopo是一个基于HTML5 Canvas的开源绘图库,它可以用于在网页中创建各种图形、流程图、网络拓扑图等等。jtopo的画布在默认情况下是可移动的,但如果你希望画布不可移动,可以使用以下方法进设置。 首先,在创建画布的时候,需要添加`movable: false`属性,将其设置为false,表示画布不可移动,例如: ```javascript var stage = new JTopo.Stage(canvas); stage.movable = false; ``` 这样就可以将画布设为不可移动。 除此之外,你还可以通过设置鼠标事件来禁止画布的移动。可以通过判断鼠标移动事件的坐标,如果落在画布上则不进移动操作。具体的代码如下: ```javascript canvas.onmousedown = function(event){ var e = event || window.event; var mousePos = stage.getMousePos(e); var x = mousePos.x; var y = mousePos.y; if(x > stage.canvas.width * 0.1 && x < stage.canvas.width * 0.9 && y > stage.canvas.height * 0.1 && y < stage.canvas.height * 0.9){ stage.clickEventHandle(event); } } ``` 上述代码中,通过获取鼠标点击的坐标,判断其是否在画布的可移动范围内,如果在范围内则调用`clickEventHandle`方法来处理点击事件,从而禁止画布的移动。 通过以上方法,你可以将jtopo的画布设置为不可移动。希望能对你有所帮助! ### 回答3: jtopo 是一个免费的 JavaScript 图形绘制库,它可以在网页中创建图形和拓扑图。在 jtopo 中,画布(Canvas)默认是可移动的,也就是可以通过鼠标拖动来改变画布的位置。 但是,如果希望禁止画布移动,可以使用 jtopo 中的相关方法来实现。通过设置画布的可拖拽属性为 false,可以禁止画布移动。具体的实现步骤如下: 1. 在创建画布的时候,通过设置属性 `topoData.dragable = false` ,将画布的可拖拽属性设置为 false。 2. 将该属性应用到画布上,例如 `scene.add(topoData)`。 3. 这样,画布就不可移动了,无法通过鼠标拖动来改变画布的位置。 需要注意的是,jtopo 的画布主要用于绘制图形和拓扑图,禁止画布移动可能会限制用户与图形的交互体验,因此需要根据具体需求来决定是否禁止画布的移动功能。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值