📄 graphics.js
字号:
/**
* @fileOverview Graphics utility functions and constants
* @name SimileAjax.Graphics
*/
SimileAjax.Graphics = new Object();
/**
* A boolean value indicating whether PNG translucency is supported on the
* user's browser or not.
*
* @type Boolean
*/
SimileAjax.Graphics.pngIsTranslucent = (!SimileAjax.Platform.browser.isIE) || (SimileAjax.Platform.browser.majorVersion > 6);
if (!SimileAjax.Graphics.pngIsTranslucent) {
SimileAjax.includeCssFile(document, SimileAjax.urlPrefix + "styles/graphics-ie6.css");
}
/*==================================================
* Opacity, translucency
*==================================================
*/
SimileAjax.Graphics._createTranslucentImage1 = function(url, verticalAlign) {
var elmt = document.createElement("img");
elmt.setAttribute("src", url);
if (verticalAlign != null) {
elmt.style.verticalAlign = verticalAlign;
}
return elmt;
};
SimileAjax.Graphics._createTranslucentImage2 = function(url, verticalAlign) {
var elmt = document.createElement("img");
elmt.style.width = "1px"; // just so that IE will calculate the size property
elmt.style.height = "1px";
elmt.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + url +"', sizingMethod='image')";
elmt.style.verticalAlign = (verticalAlign != null) ? verticalAlign : "middle";
return elmt;
};
/**
* Creates a DOM element for an <code>img</code> tag using the URL given. This
* is a convenience method that automatically includes the necessary CSS to
* allow for translucency, even on IE.
*
* @function
* @param {String} url the URL to the image
* @param {String} verticalAlign the CSS value for the image's vertical-align
* @return {Element} a DOM element containing the <code>img</code> tag
*/
SimileAjax.Graphics.createTranslucentImage = SimileAjax.Graphics.pngIsTranslucent ?
SimileAjax.Graphics._createTranslucentImage1 :
SimileAjax.Graphics._createTranslucentImage2;
SimileAjax.Graphics._createTranslucentImageHTML1 = function(url, verticalAlign) {
return "<img src=\"" + url + "\"" +
(verticalAlign != null ? " style=\"vertical-align: " + verticalAlign + ";\"" : "") +
" />";
};
SimileAjax.Graphics._createTranslucentImageHTML2 = function(url, verticalAlign) {
var style =
"width: 1px; height: 1px; " +
"filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + url +"', sizingMethod='image');" +
(verticalAlign != null ? " vertical-align: " + verticalAlign + ";" : "");
return "<img src='" + url + "' style=\"" + style + "\" />";
};
/**
* Creates an HTML string for an <code>img</code> tag using the URL given.
* This is a convenience method that automatically includes the necessary CSS
* to allow for translucency, even on IE.
*
* @function
* @param {String} url the URL to the image
* @param {String} verticalAlign the CSS value for the image's vertical-align
* @return {String} a string containing the <code>img</code> tag
*/
SimileAjax.Graphics.createTranslucentImageHTML = SimileAjax.Graphics.pngIsTranslucent ?
SimileAjax.Graphics._createTranslucentImageHTML1 :
SimileAjax.Graphics._createTranslucentImageHTML2;
/**
* Sets the opacity on the given DOM element.
*
* @param {Element} elmt the DOM element to set the opacity on
* @param {Number} opacity an integer from 0 to 100 specifying the opacity
*/
SimileAjax.Graphics.setOpacity = function(elmt, opacity) {
if (SimileAjax.Platform.browser.isIE) {
elmt.style.filter = "progid:DXImageTransform.Microsoft.Alpha(Style=0,Opacity=" + opacity + ")";
} else {
var o = (opacity / 100).toString();
elmt.style.opacity = o;
elmt.style.MozOpacity = o;
}
};
/*==================================================
* Bubble
*==================================================
*/
SimileAjax.Graphics.bubbleConfig = {
containerCSSClass: "simileAjax-bubble-container",
innerContainerCSSClass: "simileAjax-bubble-innerContainer",
contentContainerCSSClass: "simileAjax-bubble-contentContainer",
borderGraphicSize: 50,
borderGraphicCSSClassPrefix: "simileAjax-bubble-border-",
arrowGraphicTargetOffset: 33, // from tip of arrow to the side of the graphic that touches the content of the bubble
arrowGraphicLength: 100, // dimension of arrow graphic along the direction that the arrow points
arrowGraphicWidth: 49, // dimension of arrow graphic perpendicular to the direction that the arrow points
arrowGraphicCSSClassPrefix: "simileAjax-bubble-arrow-",
closeGraphicCSSClass: "simileAjax-bubble-close",
extraPadding: 20
};
/**
* Creates a nice, rounded bubble popup with the given content in a div,
* page coordinates and a suggested width. The bubble will point to the
* location on the page as described by pageX and pageY. All measurements
* should be given in pixels.
*
* @param {Element} the content div
* @param {Number} pageX the x coordinate of the point to point to
* @param {Number} pageY the y coordinate of the point to point to
* @param {Number} contentWidth a suggested width of the content
* @param {String} orientation a string ("top", "bottom", "left", or "right")
* that describes the orientation of the arrow on the bubble
* @param {Number} maxHeight. Add a scrollbar div if bubble would be too tall.
* Default of 0 or null means no maximum
*/
SimileAjax.Graphics.createBubbleForContentAndPoint = function(
div, pageX, pageY, contentWidth, orientation, maxHeight) {
if (typeof contentWidth != "number") {
contentWidth = 300;
}
if (typeof maxHeight != "number") {
maxHeight = 0;
}
div.style.position = "absolute";
div.style.left = "-5000px";
div.style.top = "0px";
div.style.width = contentWidth + "px";
document.body.appendChild(div);
window.setTimeout(function() {
var width = div.scrollWidth + 10;
var height = div.scrollHeight + 10;
var scrollDivW = 0; // width of the possible inner container when we want vertical scrolling
if (maxHeight > 0 && height > maxHeight) {
height = maxHeight;
scrollDivW = width - 25;
}
var bubble = SimileAjax.Graphics.createBubbleForPoint(pageX, pageY, width, height, orientation);
document.body.removeChild(div);
div.style.position = "static";
div.style.left = "";
div.style.top = "";
// create a scroll div if needed
if (scrollDivW > 0) {
var scrollDiv = document.createElement("div");
div.style.width = "";
scrollDiv.style.width = scrollDivW + "px";
scrollDiv.appendChild(div);
bubble.content.appendChild(scrollDiv);
} else {
div.style.width = width + "px";
bubble.content.appendChild(div);
}
}, 200);
};
/**
* Creates a nice, rounded bubble popup with the given page coordinates and
* content dimensions. The bubble will point to the location on the page
* as described by pageX and pageY. All measurements should be given in
* pixels.
*
* @param {Number} pageX the x coordinate of the point to point to
* @param {Number} pageY the y coordinate of the point to point to
* @param {Number} contentWidth the width of the content box in the bubble
* @param {Number} contentHeight the height of the content box in the bubble
* @param {String} orientation a string ("top", "bottom", "left", or "right")
* that describes the orientation of the arrow on the bubble
* @return {Element} a DOM element for the newly created bubble
*/
SimileAjax.Graphics.createBubbleForPoint = function(pageX, pageY, contentWidth, contentHeight, orientation) {
contentWidth = parseInt(contentWidth, 10); // harden against bad input bugs
contentHeight = parseInt(contentHeight, 10); // getting numbers-as-strings
var bubbleConfig = SimileAjax.Graphics.bubbleConfig;
var pngTransparencyClassSuffix =
SimileAjax.Graphics.pngIsTranslucent ? "pngTranslucent" : "pngNotTranslucent";
var bubbleWidth = contentWidth + 2 * bubbleConfig.borderGraphicSize;
var bubbleHeight = contentHeight + 2 * bubbleConfig.borderGraphicSize;
var generatePngSensitiveClass = function(className) {
return className + " " + className + "-" + pngTransparencyClassSuffix;
};
/*
* Render container divs
*/
var div = document.createElement("div");
div.className = generatePngSensitiveClass(bubbleConfig.containerCSSClass);
div.style.width = contentWidth + "px";
div.style.height = contentHeight + "px";
var divInnerContainer = document.createElement("div");
divInnerContainer.className = generatePngSensitiveClass(bubbleConfig.innerContainerCSSClass);
div.appendChild(divInnerContainer);
/*
* Create layer for bubble
*/
var close = function() {
if (!bubble._closed) {
document.body.removeChild(bubble._div);
bubble._doc = null;
bubble._div = null;
bubble._content = null;
bubble._closed = true;
}
}
var bubble = { _closed: false };
var layer = SimileAjax.WindowManager.pushLayer(close, true, div);
bubble._div = div;
bubble.close = function() { SimileAjax.WindowManager.popLayer(layer); }
/*
* Render border graphics
*/
var createBorder = function(classNameSuffix) {
var divBorderGraphic = document.createElement("div");
divBorderGraphic.className = generatePngSensitiveClass(bubbleConfig.borderGraphicCSSClassPrefix + classNameSuffix);
divInnerContainer.appendChild(divBorderGraphic);
};
createBorder("top-left");
createBorder("top-right");
createBorder("bottom-left");
createBorder("bottom-right");
createBorder("left");
createBorder("right");
createBorder("top");
createBorder("bottom");
/*
* Render content
*/
var divContentContainer = document.createElement("div");
divContentContainer.className = generatePngSensitiveClass(bubbleConfig.contentContainerCSSClass);
divInnerContainer.appendChild(divContentContainer);
bubble.content = divContentContainer;
/*
* Render close button
*/
var divClose = document.createElement("div");
divClose.className = generatePngSensitiveClass(bubbleConfig.closeGraphicCSSClass);
divInnerContainer.appendChild(divClose);
SimileAjax.WindowManager.registerEventWithObject(divClose, "click", bubble, "close");
(function() {
var dims = SimileAjax.Graphics.getWindowDimensions();
var docWidth = dims.w;
var docHeight = dims.h;
var halfArrowGraphicWidth = Math.ceil(bubbleConfig.arrowGraphicWidth / 2);
var createArrow = function(classNameSuffix) {
var divArrowGraphic = document.createElement("div");
divArrowGraphic.className = generatePngSensitiveClass(bubbleConfig.arrowGraphicCSSClassPrefix + "point-" + classNameSuffix);
divInnerContainer.appendChild(divArrowGraphic);
return divArrowGraphic;
};
if (pageX - halfArrowGraphicWidth - bubbleConfig.borderGraphicSize - bubbleConfig.extraPadding > 0 &&
pageX + halfArrowGraphicWidth + bubbleConfig.borderGraphicSize + bubbleConfig.extraPadding < docWidth) {
/*
* Bubble can be positioned above or below the target point.
*/
var left = pageX - Math.round(contentWidth / 2);
left = pageX < (docWidth / 2) ?
Math.max(left, bubbleConfig.extraPadding + bubbleConfig.borderGraphicSize) :
Math.min(left, docWidth - bubbleConfig.extraPadding - bubbleConfig.borderGraphicSize - contentWidth);
if ((orientation && orientation == "top") ||
(!orientation &&
(pageY
- bubbleConfig.arrowGraphicTargetOffset
- contentHeight
- bubbleConfig.borderGraphicSize
- bubbleConfig.extraPadding > 0))) {
/*
* Position bubble above the target point.
*/
var divArrow = createArrow("down");
divArrow.style.left = (pageX - halfArrowGraphicWidth - left) + "px";
div.style.left = left + "px";
div.style.top = (pageY - bubbleConfig.arrowGraphicTargetOffset - contentHeight) + "px";
return;
} else if ((orientation && orientation == "bottom") ||
(!orientation &&
(pageY
+ bubbleConfig.arrowGraphicTargetOffset
+ contentHeight
+ bubbleConfig.borderGraphicSize
+ bubbleConfig.extraPadding < docHeight))) {
/*
* Position bubble below the target point.
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -