diff --git a/simple-mind-map/index.js b/simple-mind-map/index.js index 99057704..a375d360 100644 --- a/simple-mind-map/index.js +++ b/simple-mind-map/index.js @@ -39,6 +39,10 @@ class MindMap { // 获取容器尺寸位置信息 this.getElRectInfo() + // 画布初始大小 + this.initWidth = this.width + this.initHeight = this.height + // 添加css this.cssEl = null this.addCss() diff --git a/simple-mind-map/src/core/view/View.js b/simple-mind-map/src/core/view/View.js index 09640aa2..8def88a3 100644 --- a/simple-mind-map/src/core/view/View.js +++ b/simple-mind-map/src/core/view/View.js @@ -128,6 +128,10 @@ class View { this.translateXY(mx, my) } }) + this.mindMap.on('resize', () => { + if (!this.checkNeedMindMapInCanvas()) return + this.transform() + }) } // 获取当前变换状态数据 @@ -313,20 +317,31 @@ class View { this.translateXY(newX, newY) } - // 将思维导图限制在画布内 - limitMindMapInCanvas() { + // 判断是否需要将思维导图限制在画布内 + checkNeedMindMapInCanvas() { const { isLimitMindMapInCanvasWhenHasScrollbar, isLimitMindMapInCanvas } = this.mindMap.opt // 如果注册了滚动条插件,那么使用isLimitMindMapInCanvasWhenHasScrollbar配置 if (this.mindMap.scrollbar) { - if (!isLimitMindMapInCanvasWhenHasScrollbar) return + return isLimitMindMapInCanvasWhenHasScrollbar } else { // 否则使用isLimitMindMapInCanvas配置 - if (!isLimitMindMapInCanvas) return + return isLimitMindMapInCanvas } + } + + // 将思维导图限制在画布内 + limitMindMapInCanvas() { + if (!this.checkNeedMindMapInCanvas()) return let { scale, left, top, right, bottom } = this.getPositionLimit() + // 画布宽高改变了,但是思维导图元素变换的中心点依旧是原有位置,所以需要加上中心点变化量 + const centerXChange = + ((this.mindMap.width - this.mindMap.initWidth) / 2) * scale + const centerYChange = + ((this.mindMap.height - this.mindMap.initHeight) / 2) * scale + // 如果缩放值改变了 const scaleRatio = this.scale / scale left *= scaleRatio @@ -338,10 +353,10 @@ class View { const centerX = this.mindMap.width / 2 const centerY = this.mindMap.height / 2 const scaleOffset = this.scale - 1 - left -= scaleOffset * centerX - right -= scaleOffset * centerX - top -= scaleOffset * centerY - bottom -= scaleOffset * centerY + left -= scaleOffset * centerX - centerXChange + right -= scaleOffset * centerX - centerXChange + top -= scaleOffset * centerY - centerYChange + bottom -= scaleOffset * centerY - centerYChange // 判断是否超出边界 if (this.x > left) { diff --git a/simple-mind-map/src/plugins/Scrollbar.js b/simple-mind-map/src/plugins/Scrollbar.js index b2ba6dcb..7e1c8f3c 100644 --- a/simple-mind-map/src/plugins/Scrollbar.js +++ b/simple-mind-map/src/plugins/Scrollbar.js @@ -40,6 +40,7 @@ class Scrollbar { this.mindMap.on('mouseup', this.onMouseup) this.mindMap.on('node_tree_render_end', this.updateScrollbar) this.mindMap.on('view_data_change', this.updateScrollbar) + this.mindMap.on('resize', this.updateScrollbar) } // 解绑事件 @@ -48,6 +49,7 @@ class Scrollbar { this.mindMap.off('mouseup', this.onMouseup) this.mindMap.off('node_tree_render_end', this.updateScrollbar) this.mindMap.off('view_data_change', this.updateScrollbar) + this.mindMap.off('resize', this.updateScrollbar) } // 渲染后、数据改变需要更新滚动条 @@ -202,7 +204,8 @@ class Scrollbar { yOffset - paddingY * t.scaleY + paddingY - - rootCenterOffset.y * t.scaleY + rootCenterOffset.y * t.scaleY + + ((this.mindMap.height - this.mindMap.initHeight) / 2) * t.scaleY // 画布宽高改变了,但是思维导图元素变换的中心点依旧是原有位置,所以需要加上中心点变化量 this.mindMap.view.translateYTo(chartTop) this.emitEvent({ horizontal: scrollbarData.horizontal, @@ -238,7 +241,8 @@ class Scrollbar { xOffset - paddingX * t.scaleX + paddingX - - rootCenterOffset.x * t.scaleX + rootCenterOffset.x * t.scaleX + + ((this.mindMap.width - this.mindMap.initWidth) / 2) * t.scaleX // 画布宽高改变了,但是思维导图元素变换的中心点依旧是原有位置,所以需要加上中心点变化量 this.mindMap.view.translateXTo(chartLeft) this.emitEvent({ vertical: scrollbarData.vertical,