cione-comp-lib
Version:
`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`
286 lines (285 loc) • 12.2 kB
JavaScript
import { isString, isArray, isDom, each, bind, indexOf } from "../../../../zrender/lib/core/util.mjs";
import { normalizeEvent } from "../../../../zrender/lib/core/event.mjs";
import { transformLocalCoord } from "../../../../zrender/lib/core/dom.mjs";
import env from "../../../../zrender/lib/core/env.mjs";
import { convertToColorString, toCamelCase, normalizeCssArray } from "../../util/format.mjs";
import { toCSSVendorPrefix, TRANSITION_VENDOR, TRANSFORM_VENDOR, getComputedStyle, shouldTooltipConfine } from "./helper.mjs";
import { getPaddingFromTooltipModel } from "./tooltipMarkup.mjs";
var CSS_TRANSITION_VENDOR = toCSSVendorPrefix(TRANSITION_VENDOR, "transition");
var CSS_TRANSFORM_VENDOR = toCSSVendorPrefix(TRANSFORM_VENDOR, "transform");
var gCssText = "position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;" + (env.transform3dSupported ? "will-change:transform;" : "");
function mirrorPos(pos) {
pos = pos === "left" ? "right" : pos === "right" ? "left" : pos === "top" ? "bottom" : "top";
return pos;
}
function assembleArrow(tooltipModel, borderColor, arrowPosition) {
if (!isString(arrowPosition) || arrowPosition === "inside") {
return "";
}
var backgroundColor = tooltipModel.get("backgroundColor");
var borderWidth = tooltipModel.get("borderWidth");
borderColor = convertToColorString(borderColor);
var arrowPos = mirrorPos(arrowPosition);
var arrowSize = Math.max(Math.round(borderWidth) * 1.5, 6);
var positionStyle = "";
var transformStyle = CSS_TRANSFORM_VENDOR + ":";
var rotateDeg;
if (indexOf(["left", "right"], arrowPos) > -1) {
positionStyle += "top:50%";
transformStyle += "translateY(-50%) rotate(" + (rotateDeg = arrowPos === "left" ? -225 : -45) + "deg)";
} else {
positionStyle += "left:50%";
transformStyle += "translateX(-50%) rotate(" + (rotateDeg = arrowPos === "top" ? 225 : 45) + "deg)";
}
var rotateRadian = rotateDeg * Math.PI / 180;
var arrowWH = arrowSize + borderWidth;
var rotatedWH = arrowWH * Math.abs(Math.cos(rotateRadian)) + arrowWH * Math.abs(Math.sin(rotateRadian));
var arrowOffset = Math.round(((rotatedWH - Math.SQRT2 * borderWidth) / 2 + Math.SQRT2 * borderWidth - (rotatedWH - arrowWH) / 2) * 100) / 100;
positionStyle += ";" + arrowPos + ":-" + arrowOffset + "px";
var borderStyle = borderColor + " solid " + borderWidth + "px;";
var styleCss = ["position:absolute;width:" + arrowSize + "px;height:" + arrowSize + "px;z-index:-1;", positionStyle + ";" + transformStyle + ";", "border-bottom:" + borderStyle, "border-right:" + borderStyle, "background-color:" + backgroundColor + ";"];
return '<div style="' + styleCss.join("") + '"></div>';
}
function assembleTransition(duration, onlyFade) {
var transitionCurve = "cubic-bezier(0.23,1,0.32,1)";
var transitionOption = " " + duration / 2 + "s " + transitionCurve;
var transitionText = "opacity" + transitionOption + ",visibility" + transitionOption;
if (!onlyFade) {
transitionOption = " " + duration + "s " + transitionCurve;
transitionText += env.transformSupported ? "," + CSS_TRANSFORM_VENDOR + transitionOption : ",left" + transitionOption + ",top" + transitionOption;
}
return CSS_TRANSITION_VENDOR + ":" + transitionText;
}
function assembleTransform(x, y, toString) {
var x0 = x.toFixed(0) + "px";
var y0 = y.toFixed(0) + "px";
if (!env.transformSupported) {
return toString ? "top:" + y0 + ";left:" + x0 + ";" : [["top", y0], ["left", x0]];
}
var is3d = env.transform3dSupported;
var translate = "translate" + (is3d ? "3d" : "") + "(" + x0 + "," + y0 + (is3d ? ",0" : "") + ")";
return toString ? "top:0;left:0;" + CSS_TRANSFORM_VENDOR + ":" + translate + ";" : [["top", 0], ["left", 0], [TRANSFORM_VENDOR, translate]];
}
function assembleFont(textStyleModel) {
var cssText = [];
var fontSize = textStyleModel.get("fontSize");
var color = textStyleModel.getTextColor();
color && cssText.push("color:" + color);
cssText.push("font:" + textStyleModel.getFont());
fontSize && cssText.push("line-height:" + Math.round(fontSize * 3 / 2) + "px");
var shadowColor = textStyleModel.get("textShadowColor");
var shadowBlur = textStyleModel.get("textShadowBlur") || 0;
var shadowOffsetX = textStyleModel.get("textShadowOffsetX") || 0;
var shadowOffsetY = textStyleModel.get("textShadowOffsetY") || 0;
shadowColor && shadowBlur && cssText.push("text-shadow:" + shadowOffsetX + "px " + shadowOffsetY + "px " + shadowBlur + "px " + shadowColor);
each(["decoration", "align"], function(name) {
var val = textStyleModel.get(name);
val && cssText.push("text-" + name + ":" + val);
});
return cssText.join(";");
}
function assembleCssText(tooltipModel, enableTransition, onlyFade) {
var cssText = [];
var transitionDuration = tooltipModel.get("transitionDuration");
var backgroundColor = tooltipModel.get("backgroundColor");
var shadowBlur = tooltipModel.get("shadowBlur");
var shadowColor = tooltipModel.get("shadowColor");
var shadowOffsetX = tooltipModel.get("shadowOffsetX");
var shadowOffsetY = tooltipModel.get("shadowOffsetY");
var textStyleModel = tooltipModel.getModel("textStyle");
var padding = getPaddingFromTooltipModel(tooltipModel, "html");
var boxShadow = shadowOffsetX + "px " + shadowOffsetY + "px " + shadowBlur + "px " + shadowColor;
cssText.push("box-shadow:" + boxShadow);
enableTransition && transitionDuration && cssText.push(assembleTransition(transitionDuration, onlyFade));
if (backgroundColor) {
cssText.push("background-color:" + backgroundColor);
}
each(["width", "color", "radius"], function(name) {
var borderName = "border-" + name;
var camelCase = toCamelCase(borderName);
var val = tooltipModel.get(camelCase);
val != null && cssText.push(borderName + ":" + val + (name === "color" ? "" : "px"));
});
cssText.push(assembleFont(textStyleModel));
if (padding != null) {
cssText.push("padding:" + normalizeCssArray(padding).join("px ") + "px");
}
return cssText.join(";") + ";";
}
function makeStyleCoord(out, zr, appendToBody, zrX, zrY) {
var zrPainter = zr && zr.painter;
if (appendToBody) {
var zrViewportRoot = zrPainter && zrPainter.getViewportRoot();
if (zrViewportRoot) {
transformLocalCoord(out, zrViewportRoot, document.body, zrX, zrY);
}
} else {
out[0] = zrX;
out[1] = zrY;
var viewportRootOffset = zrPainter && zrPainter.getViewportRootOffset();
if (viewportRootOffset) {
out[0] += viewportRootOffset.offsetLeft;
out[1] += viewportRootOffset.offsetTop;
}
}
out[2] = out[0] / zr.getWidth();
out[3] = out[1] / zr.getHeight();
}
var TooltipHTMLContent = function() {
function TooltipHTMLContent2(container, api, opt) {
this._show = false;
this._styleCoord = [0, 0, 0, 0];
this._enterable = true;
this._firstShow = true;
this._longHide = true;
if (env.wxa) {
return null;
}
var el = document.createElement("div");
el.domBelongToZr = true;
this.el = el;
var zr = this._zr = api.getZr();
var appendToBody = this._appendToBody = opt && opt.appendToBody;
makeStyleCoord(this._styleCoord, zr, appendToBody, api.getWidth() / 2, api.getHeight() / 2);
if (appendToBody) {
document.body.appendChild(el);
} else {
container.appendChild(el);
}
this._container = container;
var self = this;
el.onmouseenter = function() {
if (self._enterable) {
clearTimeout(self._hideTimeout);
self._show = true;
}
self._inContent = true;
};
el.onmousemove = function(e) {
e = e || window.event;
if (!self._enterable) {
var handler = zr.handler;
var zrViewportRoot = zr.painter.getViewportRoot();
normalizeEvent(zrViewportRoot, e, true);
handler.dispatch("mousemove", e);
}
};
el.onmouseleave = function() {
self._inContent = false;
if (self._enterable) {
if (self._show) {
self.hideLater(self._hideDelay);
}
}
};
}
TooltipHTMLContent2.prototype.update = function(tooltipModel) {
var container = this._container;
var position = getComputedStyle(container, "position");
var domStyle = container.style;
if (domStyle.position !== "absolute" && position !== "absolute") {
domStyle.position = "relative";
}
var alwaysShowContent = tooltipModel.get("alwaysShowContent");
alwaysShowContent && this._moveIfResized();
this.el.className = tooltipModel.get("className") || "";
};
TooltipHTMLContent2.prototype.show = function(tooltipModel, nearPointColor) {
clearTimeout(this._hideTimeout);
clearTimeout(this._longHideTimeout);
var el = this.el;
var style = el.style;
var styleCoord = this._styleCoord;
if (!el.innerHTML) {
style.display = "none";
} else {
style.cssText = gCssText + assembleCssText(tooltipModel, !this._firstShow, this._longHide) + assembleTransform(styleCoord[0], styleCoord[1], true) + ("border-color:" + convertToColorString(nearPointColor) + ";") + (tooltipModel.get("extraCssText") || "") + (";pointer-events:" + (this._enterable ? "auto" : "none"));
}
this._show = true;
this._firstShow = false;
this._longHide = false;
};
TooltipHTMLContent2.prototype.setContent = function(content, markers, tooltipModel, borderColor, arrowPosition) {
var el = this.el;
if (content == null) {
el.innerHTML = "";
return;
}
var arrow = "";
if (isString(arrowPosition) && tooltipModel.get("trigger") === "item" && !shouldTooltipConfine(tooltipModel)) {
arrow = assembleArrow(tooltipModel, borderColor, arrowPosition);
}
if (isString(content)) {
el.innerHTML = content + arrow;
} else if (content) {
el.innerHTML = "";
if (!isArray(content)) {
content = [content];
}
for (var i = 0; i < content.length; i++) {
if (isDom(content[i]) && content[i].parentNode !== el) {
el.appendChild(content[i]);
}
}
if (arrow && el.childNodes.length) {
var arrowEl = document.createElement("div");
arrowEl.innerHTML = arrow;
el.appendChild(arrowEl);
}
}
};
TooltipHTMLContent2.prototype.setEnterable = function(enterable) {
this._enterable = enterable;
};
TooltipHTMLContent2.prototype.getSize = function() {
var el = this.el;
return [el.offsetWidth, el.offsetHeight];
};
TooltipHTMLContent2.prototype.moveTo = function(zrX, zrY) {
var styleCoord = this._styleCoord;
makeStyleCoord(styleCoord, this._zr, this._appendToBody, zrX, zrY);
if (styleCoord[0] != null && styleCoord[1] != null) {
var style_1 = this.el.style;
var transforms = assembleTransform(styleCoord[0], styleCoord[1]);
each(transforms, function(transform) {
style_1[transform[0]] = transform[1];
});
}
};
TooltipHTMLContent2.prototype._moveIfResized = function() {
var ratioX = this._styleCoord[2];
var ratioY = this._styleCoord[3];
this.moveTo(ratioX * this._zr.getWidth(), ratioY * this._zr.getHeight());
};
TooltipHTMLContent2.prototype.hide = function() {
var _this = this;
var style = this.el.style;
style.visibility = "hidden";
style.opacity = "0";
env.transform3dSupported && (style.willChange = "");
this._show = false;
this._longHideTimeout = setTimeout(function() {
return _this._longHide = true;
}, 500);
};
TooltipHTMLContent2.prototype.hideLater = function(time) {
if (this._show && !(this._inContent && this._enterable)) {
if (time) {
this._hideDelay = time;
this._show = false;
this._hideTimeout = setTimeout(bind(this.hide, this), time);
} else {
this.hide();
}
}
};
TooltipHTMLContent2.prototype.isShow = function() {
return this._show;
};
TooltipHTMLContent2.prototype.dispose = function() {
this.el.parentNode.removeChild(this.el);
};
return TooltipHTMLContent2;
}();
var TooltipHTMLContent$1 = TooltipHTMLContent;
export { TooltipHTMLContent$1 as default };