【vue hooks】useScreenOrientation-获取屏幕方向并支持低版本系统
2026年3月13日 11:03
为了解决vueuse的useScreenOrientation不支持低版本系统的问题,尤其是ios,索性自己写了个可兼容的版本。
代码
新建一个useScreenOrientation.js文件,代码如下
import { shallowRef } from "vue";
import { useEventListener, useSupported } from "@vueuse/core";
// TypeScript dropped the inline types for these types in 5.2
// We vendor them here to avoid the dependency
// export type OrientationType = 'portrait-primary' | 'portrait-secondary' | 'landscape-primary' | 'landscape-secondary'
// export type OrientationLockType = 'any' | 'natural' | 'landscape' | 'portrait' | 'portrait-primary' | 'portrait-secondary' | 'landscape-primary' | 'landscape-secondary'
// export interface ScreenOrientation extends EventTarget {
// lock: (orientation: OrientationLockType) => Promise<void>
// unlock: () => void
// readonly type: OrientationType
// readonly angle: number
// addEventListener: (type: 'change', listener: (this: this, ev: Event) => any, useCapture?: boolean) => void
// }
// export interface UseScreenOrientationReturn extends Supportable {
// orientation: ShallowRef<OrientationType | undefined>
// angle: ShallowRef<number>
// lockOrientation: (type: OrientationLockType) => Promise<void>
// unlockOrientation: () => void
// }
/**
* Reactive screen orientation
*
* @see https://vueuse.org/useScreenOrientation
*
* @__NO_SIDE_EFFECTS__
*/
export function useScreenOrientation(options = {}) {
const isSupported = useSupported(
() => window && "screen" in window && "orientation" in window.screen
);
const screenOrientation = isSupported.value ? window.screen.orientation : {};
const orientation = shallowRef(screenOrientation.type);
const angle = shallowRef(screenOrientation.angle || 0);
const isIOS = /iphone|ipad|ipod/.test(
navigator.userAgent.toLocaleLowerCase()
);
const getLandscape = () => {
if (isIOS && Object.prototype.hasOwnProperty.call(window, "orientation")) {
return Math.abs(window.orientation) === 90;
}
return window.innerHeight / window.innerWidth < 1;
};
if (isSupported.value) {
// 这部分是原代码
useEventListener(
window,
"orientationchange",
() => {
orientation.value = screenOrientation.type;
angle.value = screenOrientation.angle;
},
{ passive: true }
);
} else {
// 新增兼容低版本
const landscapeChange = () => {
orientation.value = getLandscape()
? "landscape-primary"
: "portrait-primary";
};
landscapeChange();
useEventListener(
window,
"orientationchange",
() => {
landscapeChange();
},
{ passive: true }
);
}
const lockOrientation = type => {
if (isSupported.value && typeof screenOrientation.lock === "function")
return screenOrientation.lock(type);
return Promise.reject(new Error("Not supported"));
};
const unlockOrientation = () => {
if (isSupported.value && typeof screenOrientation.unlock === "function")
screenOrientation.unlock();
};
return {
isSupported,
orientation,
angle,
lockOrientation,
unlockOrientation
};
}