UNPKG

vuevite-style-pxtovm

Version:

vue vite 项目行内样式px转vw的js库

72 lines (66 loc) 2.15 kB
// 默认参数 let defaultsProp = { // unitToConvert: "px", viewportWidth: 750, //UI设计稿的宽度 unitPrecision: 2, // 转换后的精度,即小数点位数,行内样式只能小数点后4位 viewportUnit: "vw", //转换后的单位(包括字体) // fontViewportUnit: "vw", minPixelValue: 1, //小于多少px的不转换 }; function toFixed(number, precision) { var multiplier = Math.pow(10, precision + 1), wholeNumber = Math.floor(number * multiplier); return (Math.round(wholeNumber / 10) * 10) / multiplier; } function createPxReplace( viewportSize, minPixelValue, unitPrecision, viewportUnit ) { return function ($0, $1) { if (!$1) return; var pixels = parseFloat($1); if (pixels <= minPixelValue) return; // console.log(toFixed((pixels / viewportSize) * 100, unitPrecision)) return toFixed((pixels / viewportSize) * 100, unitPrecision) + viewportUnit; }; } const templateReg = /<template>([\s\S]+)<\/template>/gi; const pxGlobalReg = /(\d+)px/gi; // 生成插件的工厂方法 const pluginGenerator = (customOptions) => { // 返回插件 Object.assign(defaultsProp,customOptions) return { // 插件名称 name: "stylePxToVw", // transform 钩子 async transform(code, id) { let _source = ""; if (/.vue$/.test(id)) { let _source = ""; // 匹配template里的内容 if (templateReg.test(code)) { _source = code.match(templateReg)[0]; } // 匹配template里(数字加px)的内容,并根据设计稿宽度转换为vw if (pxGlobalReg.test(_source)) { let $_source = _source.replace( pxGlobalReg, createPxReplace( defaultsProp.viewportWidth, defaultsProp.minPixelValue, defaultsProp.unitPrecision, defaultsProp.viewportUnit ) ); code = code.replace(_source, $_source); // console.log(code); } } return { code }; }, }; }; export default pluginGenerator;