a postcss plugin for converting px to rem and vw, also you can choose only convert one of then.
This version requires postcss
version 8
For postcss v7, you have to use postcss-pixel-to-remvw v1
npm install postcss-pixel-to-remvw -D
- Input
h1 {
margin: 0 0 20px 20px;
font-size: 32px;
line-height: 1.2;
letter-spacing: 1px;
}
- Output
h1 {
margin: 0 0 0.26667rem 0.26667rem;
margin: 0 0 2.66667vw 2.66667vw;
font-size: 0.42667rem;
font-size: 4.26667vw;
line-height: 1.2;
letter-spacing: 0.01333rem;
letter-spacing: 0.13333vw;
}
Now, the disabled convert marker does not have to be at the top of the file, you can place it outside any root-level node
- Input
/*disable-convert*/
h1 {
margin: 0 0 20px 20px;
font-size: 32px;
line-height: 1.2;
letter-spacing: 1px;
}
- Output
/*disable-convert*/
h1 {
margin: 0 0 20px 20px;
font-size: 32px;
line-height: 1.2;
letter-spacing: 1px;
}
- Input
/*disable-convert-vw*/
h1 {
margin: 0 0 20px 20px;
font-size: 32px;
line-height: 1.2;
letter-spacing: 1px;
}
- Output
/*disable-convert-vw*/
h1 {
margin: 0 0 0.26667rem 0.26667rem;
font-size: 0.42667rem;
line-height: 1.2;
letter-spacing: 0.01333rem;
}
- Input
/*disable-convert-vw*/
h1 {
margin: 0 0 20px 20px;
font-size: 32px; /*no*/
line-height: 1.2;
letter-spacing: 1px;
}
- Output
/*disable-convert-vw*/
h1 {
margin: 0 0 0.26667rem 0.26667rem;
font-size: 32px; /*no*/
line-height: 1.2;
letter-spacing: 0.01333rem;
}
export default {
module: {
loaders: [
{
test: /\.css$/,
loader: [
'style-loader',
'css-loader',
{
loader: 'postcss-loader',
options: {
postcssOptions: {
plugins: [
[
'postcss-pixel-to-remvw',
{
// Options
},
],
],
},
},
},
],
},
],
},
};
const { writeFile, readFileSync } = require('fs');
const postcss = require('postcss');
const pxtoremvw = require('postcss-pixel-to-remvw');
const processedCss = postcss(pxtoremvw()).process(readFileSync('test.css')).css;
writeFile('test.remvw.css', processedCss, err => {
if (err) throw err;
console.log('Rem file written.');
});
default:
{
baseSize: {
rem: 75, // 10rem = 750px
vw: 7.5, // 100vw = 750px
},
unitPrecision: 5,
selectorBlackList: [],
propList: ['*'],
minPixelValue: 0,
exclude: null,
// Single rule does not convert
keepRuleComment: 'no',
// The entire file is not converted
commentOfDisableAll: 'disable-convert',
// The entire file is not converted to rem
commentOfDisableRem: 'disable-convert-rem',
// nThe entire file is not converted to vw
commentOfDisableVW: 'disable-convert-vw',
};
baseSize
{Object} the base size config, default is { rem: 75, vw: 7.5 }rem
{Number | undefined} the root element font size, means 1rem = [your setting] px; It won't convert to rem whilerem
is undefinedvw
{Number | undefined} the base ratio for viewport width, means 1vw = [your setting] px; It won't convert to vw whilevw
is undefined
unitPrecision
{Number} the digital accurarcy of converted stylesheetselectorBlackList
{string[]} The selectors list to ignore conversion- If value is string, it checks to see if selector contains the string.['body'] will match .body-class
- If value is regexp, it checks to see if the selector matches the regexp. [/^body$/] will match body but not .body
propList
{string[]} The properties that can do the conversion.- Values need to be exact matches.
- Use wildcard _ to enable all properties. Example: ['_']
- Use * at the start or end of a word. (['*position*'] will match background-position-y)
- Use ! to not match a property. Example: ['*', '!letter-spacing']
- Combine the "not" prefix with the other prefixes. Example: ['', '!font']
minPixelValue
{Number} the minimum pixel value to replaceexclude
{String | Regexp | ()=>boolean} the file path to ignore conversion- If value is string, it checks to see if file path contains the string.
- 'exclude' will match \project\postcss-pxtorem\exclude\path
- If value is regexp, it checks to see if file path matches the regexp.
- /exclude/i will match \project\postcss-pxtorem\exclude\path
- If value is function, you can use exclude function to return a true and the file will be ignored.
- the callback will pass the file path as a parameter, it should returns a Boolean result.
- function (file) { return file.indexOf('exclude') !== -1; }
- If value is string, it checks to see if file path contains the string.
keepRuleComment
{String} a comment stating that the property will not be convertedcommentOfDisableAll
{String} a comment stating that the whole file will not be convertedcommentOfDisableRem
{String} a comment stating that the whole file will not be converted to rem,but keep convert to vwcommentOfDisableVW
{String} a comment stating that the whole file will not be converted to vw,but keep convert to rem
- compact with older version of postcss
- unit test
- baseSize
- keepRuleComment
- commentOfDisableAll
- commentOfDisableRem
- commentOfDisableVW
- unitPrecision
- selectorBlackList
- propList
- minPixelValue
- exclude
Thanks to postcss-pxtorem