function direction( elem, event, pad ) { var res = 8; var pad = pad || 4; var pos = elem.getBoundingClientRect(); var top = pos.top; var left = pos.left; var width = elem.clientWidth; var height = elem.clientHeight; var eTop = event.clientY; var eLeft = event.clientX; // [...]
var isTop = eTop - top < pad; var isRight = left + width - eLeft < pad; var isBottom = top + height - eTop < pad; var isLeft = eLeft - left < pad; if ( isTop ) res = 0; if ( isRight ) res = 1; if ( isBottom ) res = 2; if ( isLeft ) res = 3;
if ( isTop && isRight ) res = 4; if ( isRight && isBottom ) res = 5; if ( isBottom && isLeft ) res = 6; if ( isLeft && isTop ) res = 7; return res; // , // res 8
var cursors = "nwse ne se sw nw".split(" ");
function Resizable( elem, options ) { options = options || {}; options.max = options.max || [1E17, 1E17]; options.min = options.min || [10, 10]; options.allow = (options.allow || "11111111").split(""); // [...]
elem.addEventListener( "mousemove", function ( e ) { var dir = direction( this, e ); if ( options.allow[dir] == "0" ) return; this.style.cursor = dir == 8 ? "default" : cursors[ dir ] + "-resize"; // cursors } );
elem.addEventListener( "mousedown", resizeStart ); document.body.onselectstart = function (e) { return false };
elem.min = options.min; elem.max = options.max; elem.allow = options.allow; elem.pos = elem.getBoundingClientRect();
function resizeStart( ev ) { var dir = direction( this, ev ); // if ( this.allow[dir] == "0" ) return; // , document.documentElement.style.cursor = this.style.cursor = cursors[ dir ] + "-resize"; var pos = this.getBoundingClientRect(); var elem = this; // mousemove var height = this.clientHeight; var width = this.clientWidth; // // resize(). . document.addEventListener( "mousemove", resize ); // // document.addEventListener( "mouseup", function () { document.removeEventListener( "mousemove", resize ); document.documentElement.style.cursor = elem.style.cursor = "default"; document.body.onselectstart = null; }); };
function resize ( e ) { // // // if- if ( dir == 0 || dir == 4 || dir == 7 ) { elem.style.top = e.clientY - ev.clientY + pos.top; elem.style.height = height + ev.clientY - e.clientY; } if ( dir == 1 || dir == 4 || dir == 5 ) { elem.style.width = e.clientX - pos.left; } if ( dir == 2 || dir == 5 || dir == 6 ) { elem.style.height = e.clientY - pos.top; } if ( dir == 3 || dir == 6 || dir == 7 ) { elem.style.left = e.clientX - ev.clientX + pos.left; elem.style.width = width + ev.clientX - e.clientX; }
if ( e.clientY + elem.min[1] > ev.clientY + height ) return; if ( e.clientX + elem.min[0] > ev.clientX + width ) return;
if ( elem.clientHeight < elem.min[1] ) elem.style.height = elem.min[1]; if ( elem.clientWidth < elem.min[0] ) elem.style.width = elem.min[0]; if ( elem.clientHeight > elem.max[1] ) elem.style.height = elem.max[1]; if ( elem.clientWidth > elem.max[0] ) elem.style.width = elem.max[0]; if ( e.clientY < pos.bottom - elem.max[1] ) elem.style.top = pos.bottom - elem.max[1]; if ( e.clientX < pos.right - elem.max[0] ) elem.style.left = pos.right - elem.max[0];
var helper = document.createElement( "DIV" ); document.body.appendChild( helper ); helper.style.cssText = "position: fixed; border: 1px dashed black"; helper.style.width = width; helper.style.height = height; helper.style.top = pos.top; helper.style.left = pos.left;
document.addEventListener( "mouseup", function () { document.removeEventListener( "mousemove", resize ); document.documentElement.style.cursor = elem.style.cursor = "default"; document.body.onselectstart = null; var newpos = helper.getBoundingClientRect(); var start = new Date().getTime(); setTimeout( animate, 10 ); function animate() { var m = (new Date().getTime() - start) / 300; if (m > 1) m = 1; elem.style.top = pos.top + (newpos.top - pos.top) * m; elem.style.left = pos.left + (newpos.left - pos.left) * m; elem.style.height = height + (helper.clientHeight - height) * m; elem.style.width = width + (helper.clientWidth - width) * m; if (m < 1) setTimeout( animate, 10 ); } setTimeout( function () {document.body.removeChild( helper );}, 310 ); });
Source: https://habr.com/ru/post/321612/
All Articles