mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-06-07 15:09:34 +08:00
46
frontend/src/utils/windowsScaleFix.ts
Normal file
46
frontend/src/utils/windowsScaleFix.ts
Normal file
@@ -0,0 +1,46 @@
|
||||
type WindowsViewportScaleInput = {
|
||||
windowWidth: number;
|
||||
innerWidth: number;
|
||||
devicePixelRatio: number;
|
||||
visualViewportScale?: number | null;
|
||||
};
|
||||
|
||||
export const computeWindowsViewportScaleRatio = ({
|
||||
windowWidth,
|
||||
innerWidth,
|
||||
devicePixelRatio,
|
||||
}: WindowsViewportScaleInput): number => {
|
||||
const normalizedWindowWidth = Number(windowWidth);
|
||||
const normalizedInnerWidth = Number(innerWidth);
|
||||
const normalizedDevicePixelRatio = Number(devicePixelRatio);
|
||||
if (
|
||||
!Number.isFinite(normalizedWindowWidth) || normalizedWindowWidth <= 0 ||
|
||||
!Number.isFinite(normalizedInnerWidth) || normalizedInnerWidth <= 0 ||
|
||||
!Number.isFinite(normalizedDevicePixelRatio) || normalizedDevicePixelRatio <= 0
|
||||
) {
|
||||
return 1;
|
||||
}
|
||||
return (normalizedWindowWidth / normalizedDevicePixelRatio) / normalizedInnerWidth;
|
||||
};
|
||||
|
||||
export const hasWindowsViewportScaleDrift = (
|
||||
metrics: WindowsViewportScaleInput,
|
||||
tolerance = 0.08,
|
||||
): boolean => {
|
||||
const normalizedTolerance = Math.max(0.01, Number(tolerance) || 0.08);
|
||||
const visualViewportScale = Number(metrics.visualViewportScale);
|
||||
if (Number.isFinite(visualViewportScale) && Math.abs(visualViewportScale - 1) > normalizedTolerance) {
|
||||
return true;
|
||||
}
|
||||
|
||||
const viewportScaleRatio = computeWindowsViewportScaleRatio(metrics);
|
||||
return Math.abs(viewportScaleRatio - 1) > normalizedTolerance;
|
||||
};
|
||||
|
||||
export const getWindowsScaleFixNudgedWidth = (width: number): number => {
|
||||
const normalizedWidth = Math.trunc(Number(width) || 0);
|
||||
if (normalizedWidth <= 0) {
|
||||
return 0;
|
||||
}
|
||||
return normalizedWidth > 480 ? normalizedWidth - 1 : normalizedWidth + 1;
|
||||
};
|
||||
Reference in New Issue
Block a user