?? cropper.uncompressed.js
字號:
this.handleS.style.left = horizHandlePos;
this.handleW.style.top = vertHandlePos;
// draw the four overlays
this.north.style.height = params[1];
var eastStyle = this.east.style;
eastStyle.top = params[1];
eastStyle.height = params[3];
eastStyle.left = params[4];
eastStyle.width = params[6];
var southStyle = this.south.style;
southStyle.top = params[5];
southStyle.height = params[7];
var westStyle = this.west.style;
westStyle.top = params[1];
westStyle.height = params[3];
westStyle.width = params[0];
// call the draw method on sub classes
this.subDrawArea();
this.forceReRender();
},
/**
* Force the re-rendering of the selArea element which fixes rendering issues in Safari
* & IE PC, especially evident when re-sizing perfectly vertical using any of the south handles
*
* @access private
* @return void
*/
forceReRender: function() {
if( this.isIE || this.isWebKit) {
var n = document.createTextNode(' ');
var d,el,fixEL,i;
if( this.isIE ) fixEl = this.selArea;
else if( this.isWebKit ) {
fixEl = document.getElementsByClassName( 'imgCrop_marqueeSouth', this.imgWrap )[0];
/* we have to be a bit more forceful for Safari, otherwise the the marquee &
* the south handles still don't move
*/
d = Builder.node( 'div', '' );
d.style.visibility = 'hidden';
var classList = ['SE','S','SW'];
for( i = 0; i < classList.length; i++ ) {
el = document.getElementsByClassName( 'imgCrop_handle' + classList[i], this.selArea )[0];
if( el.childNodes.length ) el.removeChild( el.childNodes[0] );
el.appendChild(d);
}
}
fixEl.appendChild(n);
fixEl.removeChild(n);
}
},
/**
* Starts the resize
*
* @access private
* @param obj Event
* @return void
*/
startResize: function( e ) {
this.startCoords = this.cloneCoords( this.areaCoords );
this.resizing = true;
this.resizeHandle = Event.element( e ).classNames().toString().replace(/([^N|NE|E|SE|S|SW|W|NW])+/, '');
// dump( 'this.resizeHandle : ' + this.resizeHandle + '\n' );
Event.stop( e );
},
/**
* Starts the drag
*
* @access private
* @param obj Event
* @return void
*/
startDrag: function( e ) {
this.selArea.show();
this.clickCoords = this.getCurPos( e );
this.setAreaCoords( { x1: this.clickCoords.x, y1: this.clickCoords.y, x2: this.clickCoords.x, y2: this.clickCoords.y }, false, false, null );
this.dragging = true;
this.onDrag( e ); // incase the user just clicks once after already making a selection
Event.stop( e );
},
/**
* Gets the current cursor position relative to the image
*
* @access private
* @param obj Event
* @return obj x,y pixels of the cursor
*/
getCurPos: function( e ) {
// get the offsets for the wrapper within the document
var el = this.imgWrap, wrapOffsets = Position.cumulativeOffset( el );
// remove any scrolling that is applied to the wrapper (this may be buggy) - don't count the scroll on the body as that won't affect us
while( el.nodeName != 'BODY' ) {
wrapOffsets[1] -= el.scrollTop || 0;
wrapOffsets[0] -= el.scrollLeft || 0;
el = el.parentNode;
}
return curPos = {
x: Event.pointerX(e) - wrapOffsets[0],
y: Event.pointerY(e) - wrapOffsets[1]
}
},
/**
* Performs the drag for both resize & inital draw dragging
*
* @access private
* @param obj Event
* @return void
*/
onDrag: function( e ) {
if( this.dragging || this.resizing ) {
var resizeHandle = null;
var curPos = this.getCurPos( e );
var newCoords = this.cloneCoords( this.areaCoords );
var direction = { x: 1, y: 1 };
if( this.dragging ) {
if( curPos.x < this.clickCoords.x ) direction.x = -1;
if( curPos.y < this.clickCoords.y ) direction.y = -1;
this.transformCoords( curPos.x, this.clickCoords.x, newCoords, 'x' );
this.transformCoords( curPos.y, this.clickCoords.y, newCoords, 'y' );
} else if( this.resizing ) {
resizeHandle = this.resizeHandle;
// do x movements first
if( resizeHandle.match(/E/) ) {
// if we're moving an east handle
this.transformCoords( curPos.x, this.startCoords.x1, newCoords, 'x' );
if( curPos.x < this.startCoords.x1 ) direction.x = -1;
} else if( resizeHandle.match(/W/) ) {
// if we're moving an west handle
this.transformCoords( curPos.x, this.startCoords.x2, newCoords, 'x' );
if( curPos.x < this.startCoords.x2 ) direction.x = -1;
}
// do y movements second
if( resizeHandle.match(/N/) ) {
// if we're moving an north handle
this.transformCoords( curPos.y, this.startCoords.y2, newCoords, 'y' );
if( curPos.y < this.startCoords.y2 ) direction.y = -1;
} else if( resizeHandle.match(/S/) ) {
// if we're moving an south handle
this.transformCoords( curPos.y, this.startCoords.y1, newCoords, 'y' );
if( curPos.y < this.startCoords.y1 ) direction.y = -1;
}
}
this.setAreaCoords( newCoords, false, e.shiftKey, direction, resizeHandle );
this.drawArea();
Event.stop( e ); // stop the default event (selecting images & text) in Safari & IE PC
}
},
/**
* Applies the appropriate transform to supplied co-ordinates, on the
* defined axis, depending on the relationship of the supplied values
*
* @access private
* @param int Current value of pointer
* @param int Base value to compare current pointer val to
* @param obj Coordinates to apply transformation on x1, x2, y1, y2
* @param string Axis to apply transformation on 'x' || 'y'
* @return void
*/
transformCoords : function( curVal, baseVal, coords, axis ) {
var newVals = [ curVal, baseVal ];
if( curVal > baseVal ) newVals.reverse();
coords[ axis + '1' ] = newVals[0];
coords[ axis + '2' ] = newVals[1];
},
/**
* Ends the crop & passes the values of the select area on to the appropriate
* callback function on completion of a crop
*
* @access private
* @return void
*/
endCrop : function() {
this.dragging = false;
this.resizing = false;
this.options.onEndCrop(
this.areaCoords,
{
width: this.calcW(),
height: this.calcH()
}
);
},
/**
* Abstract method called on the end of initialization
*
* @access private
* @abstract
* @return void
*/
subInitialize: function() {},
/**
* Abstract method called on the end of drawArea()
*
* @access private
* @abstract
* @return void
*/
subDrawArea: function() {}
};
/**
* Extend the Cropper.Img class to allow for presentation of a preview image of the resulting crop,
* the option for displayOnInit is always overridden to true when displaying a preview image
*
* Usage:
* @param obj Image element to attach to
* @param obj Optional options:
* - see Cropper.Img for base options
*
* - previewWrap obj
* HTML element that will be used as a container for the preview image
*/
Cropper.ImgWithPreview = Class.create();
Object.extend( Object.extend( Cropper.ImgWithPreview.prototype, Cropper.Img.prototype ), {
/**
* Implements the abstract method from Cropper.Img to initialize preview image settings.
* Will only attach a preview image is the previewWrap element is defined and the minWidth
* & minHeight options are set.
*
* @see Croper.Img.subInitialize
*/
subInitialize: function() {
/**
* Whether or not we've attached a preview image
* @var boolean
*/
this.hasPreviewImg = false;
if( typeof(this.options.previewWrap) != 'undefined'
&& this.options.minWidth > 0
&& this.options.minHeight > 0
) {
/**
* The preview image wrapper element
* @var obj HTML element
*/
this.previewWrap = $( this.options.previewWrap );
/**
* The preview image element
* @var obj HTML IMG element
*/
this.previewImg = this.img.cloneNode( false );
// set the ID of the preview image to be unique
this.previewImg.id = 'imgCrop_' + this.previewImg.id;
// set the displayOnInit option to true so we display the select area at the same time as the thumbnail
this.options.displayOnInit = true;
this.hasPreviewImg = true;
this.previewWrap.addClassName( 'imgCrop_previewWrap' );
this.previewWrap.setStyle(
{
width: this.options.minWidth + 'px',
height: this.options.minHeight + 'px'
}
);
this.previewWrap.appendChild( this.previewImg );
}
},
/**
* Implements the abstract method from Cropper.Img to draw the preview image
*
* @see Croper.Img.subDrawArea
*/
subDrawArea: function() {
if( this.hasPreviewImg ) {
// get the ratio of the select area to the src image
var calcWidth = this.calcW();
var calcHeight = this.calcH();
// ratios for the dimensions of the preview image
var dimRatio = {
x: this.imgW / calcWidth,
y: this.imgH / calcHeight
};
//ratios for the positions within the preview
var posRatio = {
x: calcWidth / this.options.minWidth,
y: calcHeight / this.options.minHeight
};
// setting the positions in an obj before apply styles for rendering speed increase
var calcPos = {
w: Math.ceil( this.options.minWidth * dimRatio.x ) + 'px',
h: Math.ceil( this.options.minHeight * dimRatio.y ) + 'px',
x: '-' + Math.ceil( this.areaCoords.x1 / posRatio.x ) + 'px',
y: '-' + Math.ceil( this.areaCoords.y1 / posRatio.y ) + 'px'
}
var previewStyle = this.previewImg.style;
previewStyle.width = calcPos.w;
previewStyle.height = calcPos.h;
previewStyle.left = calcPos.x;
previewStyle.top = calcPos.y;
}
}
});
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -