css-viewport-units-transform
Version:
Transform CSS viewport units of a style object to pixels based on window dimensions
69 lines (56 loc) • 1.44 kB
JavaScript
const viewportUnitRE = /^([+-]?[0-9.]+)(vh|vw|vmin|vmax)$/;
function isViewportUnit(value) {
return viewportUnitRE.test(value);
}
function getMatchObject(dim) {
const vh = dim.height;
const vw = dim.width;
return {
vh: vh,
vw: vw,
vmax: Math.max(vw, vh),
vmin: Math.min(vw, vh)
};
}
function clone(aObject) {
let value;
const bObject = {};
for (const key in aObject) {
value = aObject[key];
bObject[key] = typeof value === "object" ? clone(value) : value;
}
return bObject;
}
export function transform(styles, dimensions) {
const dim = getMatchObject(dimensions);
function replaceViewportUnit(_, number, unit) {
const base = dim[unit];
const val = parseFloat(number) / 100;
return val * base;
}
function replace(value) {
return parseFloat(value.replace(viewportUnitRE, replaceViewportUnit));
}
const replacement = clone(styles);
for (const key in replacement) {
const selector = replacement[key];
if (isViewportUnit(selector)) {
replacement[key] = replace(selector);
continue;
}
for (const key in selector) {
const val = selector[key];
if (isViewportUnit(val)) {
selector[key] = replace(val);
continue;
}
for (const key in val) {
if (isViewportUnit(val[key])) {
val[key] = replace(val[key]);
continue;
}
}
}
}
return replacement;
}