📄 graphics.js
字号:
var divArrow = createArrow("up");
divArrow.style.left = (pageX - halfArrowGraphicWidth - left) + "px";
div.style.left = left + "px";
div.style.top = (pageY + bubbleConfig.arrowGraphicTargetOffset) + "px";
return;
}
}
var top = pageY - Math.round(contentHeight / 2);
top = pageY < (docHeight / 2) ?
Math.max(top, bubbleConfig.extraPadding + bubbleConfig.borderGraphicSize) :
Math.min(top, docHeight - bubbleConfig.extraPadding - bubbleConfig.borderGraphicSize - contentHeight);
if ((orientation && orientation == "left") ||
(!orientation &&
(pageX
- bubbleConfig.arrowGraphicTargetOffset
- contentWidth
- bubbleConfig.borderGraphicSize
- bubbleConfig.extraPadding > 0))) {
/*
* Position bubble left of the target point.
*/
var divArrow = createArrow("right");
divArrow.style.top = (pageY - halfArrowGraphicWidth - top) + "px";
div.style.top = top + "px";
div.style.left = (pageX - bubbleConfig.arrowGraphicTargetOffset - contentWidth) + "px";
} else {
/*
* Position bubble right of the target point, as the last resort.
*/
var divArrow = createArrow("left");
divArrow.style.top = (pageY - halfArrowGraphicWidth - top) + "px";
div.style.top = top + "px";
div.style.left = (pageX + bubbleConfig.arrowGraphicTargetOffset) + "px";
}
})();
document.body.appendChild(div);
return bubble;
};
SimileAjax.Graphics.getWindowDimensions = function() {
if (typeof window.innerHeight == 'number') {
return { w:window.innerWidth, h:window.innerHeight }; // Non-IE
} else if (document.documentElement && document.documentElement.clientHeight) {
return { // IE6+, in "standards compliant mode"
w:document.documentElement.clientWidth,
h:document.documentElement.clientHeight
};
} else if (document.body && document.body.clientHeight) {
return { // IE 4 compatible
w:document.body.clientWidth,
h:document.body.clientHeight
};
}
};
/**
* Creates a floating, rounded message bubble in the center of the window for
* displaying modal information, e.g. "Loading..."
*
* @param {Document} doc the root document for the page to render on
* @param {Object} an object with two properties, contentDiv and containerDiv,
* consisting of the newly created DOM elements
*/
SimileAjax.Graphics.createMessageBubble = function(doc) {
var containerDiv = doc.createElement("div");
if (SimileAjax.Graphics.pngIsTranslucent) {
var topDiv = doc.createElement("div");
topDiv.style.height = "33px";
topDiv.style.background = "url(" + SimileAjax.urlPrefix + "images/message-top-left.png) top left no-repeat";
topDiv.style.paddingLeft = "44px";
containerDiv.appendChild(topDiv);
var topRightDiv = doc.createElement("div");
topRightDiv.style.height = "33px";
topRightDiv.style.background = "url(" + SimileAjax.urlPrefix + "images/message-top-right.png) top right no-repeat";
topDiv.appendChild(topRightDiv);
var middleDiv = doc.createElement("div");
middleDiv.style.background = "url(" + SimileAjax.urlPrefix + "images/message-left.png) top left repeat-y";
middleDiv.style.paddingLeft = "44px";
containerDiv.appendChild(middleDiv);
var middleRightDiv = doc.createElement("div");
middleRightDiv.style.background = "url(" + SimileAjax.urlPrefix + "images/message-right.png) top right repeat-y";
middleRightDiv.style.paddingRight = "44px";
middleDiv.appendChild(middleRightDiv);
var contentDiv = doc.createElement("div");
middleRightDiv.appendChild(contentDiv);
var bottomDiv = doc.createElement("div");
bottomDiv.style.height = "55px";
bottomDiv.style.background = "url(" + SimileAjax.urlPrefix + "images/message-bottom-left.png) bottom left no-repeat";
bottomDiv.style.paddingLeft = "44px";
containerDiv.appendChild(bottomDiv);
var bottomRightDiv = doc.createElement("div");
bottomRightDiv.style.height = "55px";
bottomRightDiv.style.background = "url(" + SimileAjax.urlPrefix + "images/message-bottom-right.png) bottom right no-repeat";
bottomDiv.appendChild(bottomRightDiv);
} else {
containerDiv.style.border = "2px solid #7777AA";
containerDiv.style.padding = "20px";
containerDiv.style.background = "white";
SimileAjax.Graphics.setOpacity(containerDiv, 90);
var contentDiv = doc.createElement("div");
containerDiv.appendChild(contentDiv);
}
return {
containerDiv: containerDiv,
contentDiv: contentDiv
};
};
/*==================================================
* Animation
*==================================================
*/
/**
* Creates an animation for a function, and an interval of values. The word
* "animation" here is used in the sense of repeatedly calling a function with
* a current value from within an interval, and a delta value.
*
* @param {Function} f a function to be called every 50 milliseconds throughout
* the animation duration, of the form f(current, delta), where current is
* the current value within the range and delta is the current change.
* @param {Number} from a starting value
* @param {Number} to an ending value
* @param {Number} duration the duration of the animation in milliseconds
* @param {Function} [cont] an optional function that is called at the end of
* the animation, i.e. a continuation.
* @return {SimileAjax.Graphics._Animation} a new animation object
*/
SimileAjax.Graphics.createAnimation = function(f, from, to, duration, cont) {
return new SimileAjax.Graphics._Animation(f, from, to, duration, cont);
};
SimileAjax.Graphics._Animation = function(f, from, to, duration, cont) {
this.f = f;
this.cont = (typeof cont == "function") ? cont : function() {};
this.from = from;
this.to = to;
this.current = from;
this.duration = duration;
this.start = new Date().getTime();
this.timePassed = 0;
};
/**
* Runs this animation.
*/
SimileAjax.Graphics._Animation.prototype.run = function() {
var a = this;
window.setTimeout(function() { a.step(); }, 100);
};
/**
* Increments this animation by one step, and then continues the animation with
* <code>run()</code>.
*/
SimileAjax.Graphics._Animation.prototype.step = function() {
this.timePassed += 50;
var timePassedFraction = this.timePassed / this.duration;
var parameterFraction = -Math.cos(timePassedFraction * Math.PI) / 2 + 0.5;
var current = parameterFraction * (this.to - this.from) + this.from;
try {
this.f(current, current - this.current);
} catch (e) {
}
this.current = current;
if (this.timePassed < this.duration) {
this.run();
} else {
this.f(this.to, 0);
this["cont"]();
}
};
/*==================================================
* CopyPasteButton
*
* Adapted from http://spaces.live.com/editorial/rayozzie/demo/liveclip/liveclipsample/techPreview.html.
*==================================================
*/
/**
* Creates a button and textarea for displaying structured data and copying it
* to the clipboard. The data is dynamically generated by the given
* createDataFunction parameter.
*
* @param {String} image an image URL to use as the background for the
* generated box
* @param {Number} width the width in pixels of the generated box
* @param {Number} height the height in pixels of the generated box
* @param {Function} createDataFunction a function that is called with no
* arguments to generate the structured data
* @return a new DOM element
*/
SimileAjax.Graphics.createStructuredDataCopyButton = function(image, width, height, createDataFunction) {
var div = document.createElement("div");
div.style.position = "relative";
div.style.display = "inline";
div.style.width = width + "px";
div.style.height = height + "px";
div.style.overflow = "hidden";
div.style.margin = "2px";
if (SimileAjax.Graphics.pngIsTranslucent) {
div.style.background = "url(" + image + ") no-repeat";
} else {
div.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + image +"', sizingMethod='image')";
}
var style;
if (SimileAjax.Platform.browser.isIE) {
style = "filter:alpha(opacity=0)";
} else {
style = "opacity: 0";
}
div.innerHTML = "<textarea rows='1' autocomplete='off' value='none' style='" + style + "' />";
var textarea = div.firstChild;
textarea.style.width = width + "px";
textarea.style.height = height + "px";
textarea.onmousedown = function(evt) {
evt = (evt) ? evt : ((event) ? event : null);
if (evt.button == 2) {
textarea.value = createDataFunction();
textarea.select();
}
};
return div;
};
/*==================================================
* getWidthHeight
*==================================================
*/
SimileAjax.Graphics.getWidthHeight = function(el) {
// RETURNS hash {width: w, height: h} in pixels
var w, h;
// offsetWidth rounds on FF, so doesn't work for us.
// See https://bugzilla.mozilla.org/show_bug.cgi?id=458617
if (el.getBoundingClientRect == null) {
// use offsetWidth
w = el.offsetWidth;
h = el.offsetHeight;
} else {
// use getBoundingClientRect
var rect = el.getBoundingClientRect();
w = Math.ceil(rect.right - rect.left);
h = Math.ceil(rect.bottom - rect.top);
}
return {
width: w,
height: h
};
};
/*==================================================
* FontRenderingContext
*==================================================
*/
SimileAjax.Graphics.getFontRenderingContext = function(elmt, width) {
return new SimileAjax.Graphics._FontRenderingContext(elmt, width);
};
SimileAjax.Graphics._FontRenderingContext = function(elmt, width) {
this._elmt = elmt;
this._elmt.style.visibility = "hidden";
if (typeof width == "string") {
this._elmt.style.width = width;
} else if (typeof width == "number") {
this._elmt.style.width = width + "px";
}
};
SimileAjax.Graphics._FontRenderingContext.prototype.dispose = function() {
this._elmt = null;
};
SimileAjax.Graphics._FontRenderingContext.prototype.update = function() {
this._elmt.innerHTML = "A";
this._lineHeight = this._elmt.offsetHeight;
};
SimileAjax.Graphics._FontRenderingContext.prototype.computeSize = function(text, className) {
// className arg is optional
var el = this._elmt;
el.innerHTML = text;
el.className = className === undefined ? '' : className;
var wh = SimileAjax.Graphics.getWidthHeight(el);
el.className = ''; // reset for the next guy
return wh;
};
SimileAjax.Graphics._FontRenderingContext.prototype.getLineHeight = function() {
return this._lineHeight;
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -