diff --git a/README.md b/README.md index e4d16688..8df7584c 100644 --- a/README.md +++ b/README.md @@ -121,6 +121,10 @@ export interface UncontrolledProps { // be from the window's boundaries. // Default: 0 zoomMargin?: number + + // Align the zoomed image vertically to the top or center of the viewport. + // Default: 'center' + zoomAlignmentY?: 'top' | 'center' | 'bottom' } ``` diff --git a/source/Controlled.tsx b/source/Controlled.tsx index b05723d1..3f12e11f 100644 --- a/source/Controlled.tsx +++ b/source/Controlled.tsx @@ -72,6 +72,7 @@ export interface ControlledProps { onUnzoom: () => void }) => React.ReactElement zoomImg?: React.ImgHTMLAttributes + zoomAlignmentY?: 'top' | 'center' | 'bottom' zoomMargin?: number } @@ -87,6 +88,7 @@ interface ControlledDefaultProps { IconZoom: React.ElementType swipeToUnzoomThreshold: number wrapElement: 'div' | 'span' + zoomAlignmentY: 'top' | 'center' | 'bottom' zoomMargin: number } @@ -110,6 +112,7 @@ class ControlledBase extends React.Component { const hasScalableSrc = isSvg || @@ -519,7 +521,20 @@ export const getStyleModalImg: GetStyleModalImg = ({ const childCenterY = parseFloat(String(style.top || 0)) + (parseFloat(String(style.height || 0)) / 2) const translateX = viewportX - childCenterX - const translateY = viewportY - childCenterY + let translateY + + switch (zoomAlignmentY) { + case 'top': + translateY = -style.top; + break + case 'bottom': + translateY = window.innerHeight - style.height - style.top; + break + case 'center': + default: + translateY = viewportY - childCenterY + break + } // For scenarios like resizing the browser window if (shouldRefresh) {