Files
vant/src/utils/format/unit.ts

82 lines
1.7 KiB
TypeScript

import { CSSProperties } from 'vue';
import { inBrowser } from '../base';
import { isDef, isNumeric } from '../validate';
export function addUnit(value?: string | number): string | undefined {
if (!isDef(value)) {
return undefined;
}
return isNumeric(value) ? `${value}px` : String(value);
}
export function getSizeStyle(
originSize?: string | number
): CSSProperties | undefined {
if (isDef(originSize)) {
const size = addUnit(originSize);
return {
width: size,
height: size,
};
}
}
export function getZIndexStyle(zIndex?: string | number) {
const style: CSSProperties = {};
if (zIndex !== undefined) {
style.zIndex = +zIndex;
}
return style;
}
// cache
let rootFontSize: number;
function getRootFontSize() {
if (!rootFontSize) {
const doc = document.documentElement;
const fontSize =
doc.style.fontSize || window.getComputedStyle(doc).fontSize;
rootFontSize = parseFloat(fontSize);
}
return rootFontSize;
}
function convertRem(value: string) {
value = value.replace(/rem/g, '');
return +value * getRootFontSize();
}
function convertVw(value: string) {
value = value.replace(/vw/g, '');
return (+value * window.innerWidth) / 100;
}
function convertVh(value: string) {
value = value.replace(/vh/g, '');
return (+value * window.innerHeight) / 100;
}
export function unitToPx(value: string | number): number {
if (typeof value === 'number') {
return value;
}
if (inBrowser) {
if (value.includes('rem')) {
return convertRem(value);
}
if (value.includes('vw')) {
return convertVw(value);
}
if (value.includes('vh')) {
return convertVh(value);
}
}
return parseFloat(value);
}