UNPKG

cione-comp-lib

Version:

`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`

286 lines (285 loc) 12.2 kB
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 };