From 3926eb3827e15a7e85e2d5e1648091b076f8a0ee Mon Sep 17 00:00:00 2001 From: infeng Date: Wed, 27 Nov 2019 00:27:17 +0800 Subject: [PATCH] feat: support maxScale and minScale --- src/ViewerCore.tsx | 16 ++++++++++++++-- src/ViewerProps.ts | 6 ++++++ src/__tests__/viewer.test.tsx | 20 ++++++++++++++++++++ 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/ViewerCore.tsx b/src/ViewerCore.tsx index d1d0f6f..1ad37da 100644 --- a/src/ViewerCore.tsx +++ b/src/ViewerCore.tsx @@ -71,6 +71,7 @@ export default (props: ViewerProps) => { noImgDetails = false, noToolbar = false, showTotal = true, + minScale = 0.1, } = props; const initialState: ViewerCoreState = { @@ -588,8 +589,19 @@ export default (props: ViewerProps) => { let directY = state.scaleY > 0 ? 1 : -1; scaleX = state.scaleX + scale * direct * directX; scaleY = state.scaleY + scale * direct * directY; - if (Math.abs(scaleX) < 0.1 || Math.abs(scaleY) < 0.1) { - return; + if (typeof props.maxScale !== 'undefined') { + if (Math.abs(scaleX) > props.maxScale) { + scaleX = props.maxScale * directX; + } + if (Math.abs(scaleY) > props.maxScale) { + scaleY = props.maxScale * directY; + } + } + if (Math.abs(scaleX) < minScale) { + scaleX = minScale * directX; + } + if (Math.abs(scaleY) < minScale) { + scaleY = minScale * directY; } top = state.top + -direct * diffY / state.scaleX * scale * directX; left = state.left + -direct * diffX / state.scaleY * scale * directY; diff --git a/src/ViewerProps.ts b/src/ViewerProps.ts index 0569d4f..83efdc2 100644 --- a/src/ViewerProps.ts +++ b/src/ViewerProps.ts @@ -108,6 +108,12 @@ interface ViewerProps { // whether to display the total number and range showTotal?: boolean; + + // max scale + maxScale?: number; + + // min scale + minScale?: number; } export default ViewerProps; diff --git a/src/__tests__/viewer.test.tsx b/src/__tests__/viewer.test.tsx index 5a7a2c2..f780ea4 100644 --- a/src/__tests__/viewer.test.tsx +++ b/src/__tests__/viewer.test.tsx @@ -750,4 +750,24 @@ describe('Viewer', () => { triggerKeyboard(document, 'keydown', 39); expect($$('.react-viewer-showTotal')[0].innerHTML).toBe('2 of 2'); }); + + it('max scale and min scale', () => { + viewerHelper.new({ + className: 'my-react-viewer', + maxScale: 1.06, + minScale: 0.88, + }); + viewerHelper.open(); + + let imgNode = $$('img.react-viewer-image')[0]; + + $$('li[data-key=zoomIn]')[0].click(); + $$('li[data-key=zoomIn]')[0].click(); + expect(getTransformValue(imgNode.style.transform).scaleX).toBe('1.06'); + $$('li[data-key=reset]')[0].click(); + $$('li[data-key=zoomOut]')[0].click(); + $$('li[data-key=zoomOut]')[0].click(); + $$('li[data-key=zoomOut]')[0].click(); + expect(getTransformValue(imgNode.style.transform).scaleX).toBe('0.88'); + }); });