PHP程序员站--PHP编程开发平台
 当前位置:主页 >> 网页制作 >> Javascript >> 

JavaScript 拖拉缩放效果

JavaScript 拖拉缩放效果

来源:互联网  作者:  发布时间:2009-04-20
拖拉缩放效果,实现通过鼠标拖动来调整层的面积(宽高)大

拖拉缩放效果,实现通过鼠标拖动来调整层的面积(宽高)大小。例如选框效果。

这里的拖拉缩放比一般的选框复杂一点,能设置八个方位(方向)的固定触发点,能设置最小范围,最大范围和比例缩放。

跟拖放效果一样,程序的原型也是在做图片切割效果的时候做出来的。但这个效果的参考少的多,基本上靠自己摸索,走了不少弯路,现在总算把自己想要的效果做出来了,程序跟上一个版本比较也已经“面目全非”,还是觉得有很多需要改进的地方,就像永远没有最完美的土耳其地毯。

这里也有一个简化版的SimpleResize,方便学习。

程序说明

其中用到的鼠标捕获、清除选择等,在拖放效果中有说明的这里就略过。下面以SimpleResize为例说一下基本原理。

【程序原理】

程序需要用Set来添加触发对象(就是用来拖拉的对象,详细看使用说明),主要是设置mousedown事件来触发Start程序开始缩放。

Start程序主要用来设置缩放程序_fun和缩放需要的参数,最后设置mousemove事件触发Resize程序进行缩放,mouseup事件中执行取消缩放Stop程序。

Resize程序的任务是执行缩放程序_fun和设置整理后的样式,这里为了简化程序样式是全部一起设置的,这样程序的注意流程就完成了。


ps:设置样式的值必须是大于0的数,否则ie会报错。

下面说说缩放的原理,先以右边拖拉为例,右边拖拉一般是以左边为固定点,右边进行缩放。
首先记录左边定位参数_sideLeft:

this._sideLeft = e.clientX - this._styleWidth;

在拖拉时,就可以根据这个参照值计算拖拉后要设置的样式参数_styleWidth:

this._styleWidth = Math.max(e.clientX - this._sideLeft, 0);

上面的程序能保证样式是大于等于0的数。

至于左边就麻烦一点,因为左边拖拉是以右边为固定点,这就必须在设置宽度的同时设置left才能,保证右边固定。
首先记录右边定位参数_sideRight:

this._sideRight = e.clientX + this._styleWidth;

还有left的定位参数_fixLeft:

this._fixLeft = this._styleWidth + this._styleLeft;

在拖拉时,计算_styleWidth:

this._styleWidth = Math.max(this._sideRight - e.clientX, 0);

在根据_styleWidth设置_styleLeft:

this._styleLeft = this._fixLeft - this._styleWidth;

上下同理,至于斜角的四个方向只是同时执行两个方向,例如右下就是同时执行右边和下边:

this.Right(e); this.Down(e);

【程序结构】

在更详细的程序说明之前,先了解一下程序结构。

当点击触发点,就会根据设置给缩放程序_fun设置为八个方向的缩放程序的其中一个。
八个缩放程序分别是:Up(上)、Down(下)、Right(右)、Left(左)、RightDown(右下)、RightUp(右上)、LeftDown(左下)和LeftUp(左上)。

在这些缩放程序,首先会进行宽和高的设置,由于宽和高的设置还需要经过范围限制和比例缩放的修正,而这些会在修正程序中处理。
修正程序包括几个部分:
RepairX:水平方向修正(左右方向);
RepairY:垂直方向修正(上下方向);
RepairAngle:对角方向修正(右下、右上、左下、左上);
RepairTop:top修正(用于以右边为固定点定位);
RepairLeft:left修正(用于以下边为固定点定位);
RepairHeight:高度修正;
RepairWidth:宽度修正。

如果没有设置最小范围限制,当缩放超过定位边时就会自动转向,例如右边缩放,左边定位,当拖动到左边定位的左边时,就会切换成左边缩放,右边定位,而这个切换是在转向程序中进行的。
转向程序包括几个部分:
TurnRight:右转程序;
TurnLeft:左转程序;
TurnUp:上转程序;
TurnDown:下转程序。

基本结构了解后,下面就开始介绍程序细节。


【最小范围限制】

最小范围限制就是限制缩放的宽和高,程序中把Min设为true,就可以通过minWidth和minHeight属性进行限制。
单是限制很简单,只要超过限制就把值设成限制值就行了,这个主要是在修正程序RepairHeight和RepairWidth中修正:
例如RepairWidth中:

iWidth = Math.max(this.Min ? this.minWidth : iWidth, iWidth, 0);

注意这里带了个0,保证最小值大于等于0。

【最大范围限制】

最大范围限制,复杂一点,是固定一个(矩形)范围,然后把缩放限制在范围内。
这个范围限制跟拖放效果的类似,有四个范围属性:上(mxTop)、下(mxBottom)、左(mxLeft)、右(mxRight)。
程序中把Max设为true就可以设置。
然后根据这四个范围属性设置四个范围参数,_mxRightWidth、_mxDownHeight、_mxUpHeight和_mxLeftWidth。
这四个围参数代表的是相对于定位边的最大宽度或高度,例如_mxRightWidth就是当右边缩放时(左边固定),宽度可以设置的最大值:

this._mxRightWidth = Math.max(mxRight - this._styleLeft - this._borderX, this.Min ? this.minWidth : 0);

这里要小心的是不要把边框忽略了。

然后在Right缩放程序中,把这个参数传递给RepairX,而RepairX把参数传递给RepairWidth并在里面修正宽度:

iWidth = Math.min(this.Max ? mxWidth : iWidth, iWidth);

还有容器范围限制,这个跟拖放效果的差不多,这里就不重复了。此外在Start程序中还会对异常的范围参数进行修正,不过这里考虑的不多,估计并不很完善,最好还是不要设一些奇怪的参数。

【比例缩放】

比例缩放就是缩放的时候同时设置宽和高,使用宽和高按照一定的比例显示。
程序中把Scale设为true就可以启用,并且Ratio可以设置比例大小(宽/高),如果不设置的话就会自动取当前的宽/高比例。

对于对角方向,在比例缩放的情况下宽和高就不能同时设置,而必须有


延伸阅读:
网页输入框的样式触发效果
JAVASCRIPT做激活搜索框关键字消失,失去焦点关键字出现的效果
CSS梯度文本效果
弹出窗口,背景变暗js效果
js拖拽效果源码
js实现字体渐渐消失效果
Tags: javascript   js   拖拉   缩放   效果   特效   js特效   效果   程序   设置   限制   参数   定位   java   ip   C   as  
最新文章
推荐阅读
月点击排行榜
PHP程序员站 Copyright © 2007-2010,PHPERZ.COM All Rights Reserved 粤ICP备07503606号