smart-rem

set root element fontSize dynamiclly

Usage no npm install needed!

<script type="module">
  import smartRem from 'https://cdn.skypack.dev/smart-rem';
</script>

README

Remember that if you have any questions during use, please contact email shuaiqiyupu@163.com. I'd be happy to help you.

What can this package do?

smart-rem can dynamically set the pixel value of the root element to adapt to different sizes of the screen.

Usage

npm install smart-rem -S

In the entry file(e.g. src/index.js or src/main.js)

/**
* @param designWidth It's the width of the design draft
* @param designHeight It's the height of the design draft
*/
import smartRem from 'smart-rem'
smartRem(designWidth, designHeight)

If the pixel value in the design draft is like this

width: 100px;
height: 500px;

Then, write the code as follows

/* 100px/100 = 1rem */
width: 1rem;
/* 500px/100 = 5rem */
height: 5rem;

Other attributes with px should be written as above. The calculation ratio is 100.

Other instructions:

If you still want to write px in the code, you can use post-auto-rem to compile after smart-rem is set, so that you can see rem in the browser. Posts-auto-rem is faster than other rem tools.

image

npm install postcss-auto-rem -D

Add the plugin to plugins list:

module.exports = {

  plugins: [
    
    // The default value of size is 100.
+   require('postcss-auto-rem')({size: 100}),

    require('autoprefixer')

  ]

}

After configuring smart REM and postcss, the effect is very good, as follows:

Your css code

.foo {
    /* Input example */
    margin: 100px;
    padding: 100px;
    width: 50px;
    font-size: 50px;
}

Styles in browser

.foo {
    /* Output example */
    margin: 1rem;
    /* 100px/100 = 1rem */
    padding: 1rem;
    /* 50px/100 = 0.5rem */
    width: 0.5rem;
    font-size: 0.5rem;
}

The calculation ratio is 100.

e.g.

1.Vue Framework

npm install postcss-auto-rem -D

In file .postcssrc.js or postcss.config.js. If it doesn't exist, create one under the root directory of the project.

module.exports = {
  "plugins": {
    "postcss-import": {},
    "postcss-url": {},
    "autoprefixer": {},
+   "postcss-auto-rem": {size: 100},
  }
}

2.React Framework

npm install postcss-auto-rem -D

In file config/webpack.config.js. If it doesn't exist, create one with npm run eject.

{
    loader: require.resolve('css-loader'),
    options: cssOptions,
},
{
    loader: require.resolve('postcss-loader'),
    options: {
        ident: 'postcss',
          plugins: () => [
            require('postcss-flexbugs-fixes'),
+           require('postcss-auto-rem')({size: 100}),
            require('postcss-preset-env')({
              autoprefixer: {
                flexbox: 'no-2009',
              },
              stage: 3,
            }),
            postcssNormalize(),
          ],
          sourceMap: isEnvProduction ? shouldUseSourceMap : isEnvDevelopment,
    },
},

3.Node Api

var fs = require('fs');
var postcss = require('postcss');
var postcssAutoRem = require('postcss-auto-rem');
var css = fs.readFileSync('main.css', 'utf8');
+ var options = {size: 100};
+ var processedCss = postcss(postcssAutoRem(options)).process(css).css;
 
fs.writeFile('auto-rem.css', processedCss, function (err) {
  if (err) {
    throw err;
  }
  console.log('file written.');
});

4.gulp

var gulp = require('gulp');
var postcss = require('gulp-postcss');
var autoprefixer = require('autoprefixer');
var postcssAutoRem = require('postcss-auto-rem');
 
gulp.task('css', function () {
 
    var processors = [
        autoprefixer({
            browsers: 'last 1 version'
        }),
+       postcssAutoRem({size: 100})
    ];
 
    return gulp.src(['build/css/**/*.css'])
        .pipe(postcss(processors))
        .pipe(gulp.dest('build/css'));
});

5.If your project framework is designed by yourself with webpack

(1) Add postcss-loader to webpack.config.js

module.exports = {
  module: {
    rules: [
      {
        test: /\.css$/,
        exclude: /node_modules/,
        use: [
          {
            loader: 'style-loader',
          },
          {
            loader: 'css-loader',
            options: {
              importLoaders: 1,
            }
          },
+         {
+           loader: 'postcss-loader'
+         }
        ]
      }
    ]
  }
}

if css-in-js, add astroturf to webpack.config.js

module.exports = {
  module: {
    rules: [
      {
        test: /\.css$/,
        use: ['style-loader', 'postcss-loader'],
      },
      {
        test: /\.jsx?$/,
        use: ['babel-loader', 'astroturf/loader'],
      }
    ]
  }
}

(2)Create file postcss.config.js

module.exports = {

  plugins: [

+   require('postcss-auto-rem')({size: 100}),

    require('autoprefixer')

  ]

}