我的resize 实现 javascript
in Web前端 on javascript web 前端 - Hits()
var c = 0;
function log(txt) {
var l = document.getElementById('log');
c += 1;
l.value += '[' + c + ']' + txt + '\n';
l.scrollTop = 1000000;
}
var cox = {
on : function(n, name, f, cp) {
if (n.addEventListener) {
n.addEventListener(name, f, cp);
} else {
if (n.attachEvent) {
n.attachEvent('on' + name, f, cp);
}
}
},
un : function(n, name, f, cp) {
if (n.removeEventListener) {
n.removeEventListener(name, f, cp);
} else {
if (n.detachEvent) {
n.detachEvent('on' + name, f, cp);
}
}
}
};
function resizeable(ct, ops) {
ops = ops ? ops : {};
var rz, pos = [-1, -1], x, y, fx, fy;
var off = ops.off ? ops.off : 5;
var cstyle = document.body.style.cursor;
function offset(a) {
var argObj = a;
var pixleft;
pixleft = 0;
while (argObj) {
pixleft += argObj.offsetLeft;
argObj = argObj.offsetParent;
};
var pixtop;
argObj = a;
pixtop = 0;
while (argObj) {
pixtop += argObj.offsetTop;
argObj = argObj.offsetParent;
};
return [parseInt(pixleft), parseInt(pixtop)];
}
function start(e) {
if ('absolute' !== ct.style.position) {
return;
}
var oset = offset(ct);
e = e || window.event;
if (Math.abs(e.clientX - oset[0]) <= off) {
pos[0] = 0;
}
if (Math.abs(e.clientX - oset[0] - ct.offsetWidth) <= off) {
pos[0] = 1;
}
if (Math.abs(e.clientY - oset[1]) <= off) {
pos[1] = 0;
}
if (Math.abs(e.clientY - oset[1] - ct.offsetHeight) <= off) {
pos[1] = 1;
}
if (-1 === pos[0] && -1 === pos[1]) {
pos = [-1, -1];
log('not :' + e.clientX);
return;
}
log('rz:' + pos);
rz = true;
ct.setCapture && ct.setCapture();
if ((pos[0] === 0 && pos[1] === 0) || (pos[0] === 1 && pos[1] === 1)) {
document.body.style.cursor = 'nw-resize';
} else if ((pos[0] === 0 && pos[1] === 1)
|| (pos[0] === 1 && pos[1] === 0)) {
document.body.style.cursor = 'ne-resize';
} else if (pos[1] === -1) {
document.body.style.cursor = 'e-resize';
} else if (pos[0] === -1) {
document.body.style.cursor = 'n-resize';
}
x = e.clientX;
y = e.clientY;
fx = x + parseInt(ct.offsetWidth);
fy = y + parseInt(ct.offsetHeight);
cox.on(ct, "mousemove", move);
cox.on(ct, 'mouseup', stop);
if (ops.start) {
ops.start(ct);
}
}
function move(e) {
if (!rz) {
return;
}
e = e || window.event;
var ox = e.clientX - x;
var oy = e.clientY - y;
var dir = 1 != Math.abs(pos[0]) || 1 != Math.abs(pos[1]);
if (dir) {
var nx = parseInt(ct.style.left) + ox;
var ny = parseInt(ct.style.top) + oy;
if (nx < fx) {
ct.style.left = parseInt(ct.style.left) + ox;
}
if (ny < fy) {
ct.style.top = parseInt(ct.style.top) + oy;
}
}
dir = dir ? -1 : 1;
var nw = parseInt(ct.style.width) + dir * ox;
var nh = parseInt(ct.style.height) + dir * oy;
if (0 < nw) {
ct.style.width = nw;
}
if (0 < nh) {
ct.style.height = parseInt(ct.style.height) + dir * oy;
}
x = e.clientX;
y = e.clientY;
if (ops.move) {
ops.move(ct);
}
}
function stop(e) {
e = e || window.event;
rz = false;
pos = [-1, -1];
ct.releaseCapture && ct.releaseCapture();
document.body.style.cursor = cstyle;
cox.un(ct, "mousemove", move);
cox.un(ct, 'mouseup', stop);
if (ops.stop) {
ops.stop(ct);
}
}
cox.on(ct, 'mousedown', start);
}测试页面:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>RESIZE</title> <script type="text/javascript" src="abc.js"></script> <script type="text/javascript"> function init() { var t = document.getElementById('div'); resizeable(t); } </script> </head> <body onLoad="init()"> <div id="div" style="border: 2px solid red;width: 200px;height: 200px;position: absolute;left: 300px;top: 300px;">div</div> <br> <textarea id="test" rows="15" cols="50"></textarea> <textarea id="log" rows="15" cols="50"></textarea> </body> </html>

