Normalize keyword values for position into length values.
npx @tessl/cli install tessl/npm-postcss-normalize-positions@7.0.0PostCSS Normalize Positions is a PostCSS plugin that normalizes CSS position keyword values by converting them to their equivalent length values. It transforms CSS background-position and position properties from human-readable keywords like 'bottom left' to more compact percentage or pixel values like '0 100%', optimizing CSS file size while maintaining the same visual appearance.
npm install postcss-normalize-positionsconst postcssNormalizePositions = require('postcss-normalize-positions');For modern ESM environments:
import postcssNormalizePositions from 'postcss-normalize-positions';TypeScript:
import postcssNormalizePositions from 'postcss-normalize-positions';
import type { Plugin } from 'postcss';
const plugin: Plugin = postcssNormalizePositions();const postcss = require('postcss');
const postcssNormalizePositions = require('postcss-normalize-positions');
// Apply the plugin to CSS
const result = await postcss([
postcssNormalizePositions()
])
.process(css, { from: undefined });
console.log(result.css);Example transformation:
Input CSS:
div {
background-position: bottom left;
}Output CSS:
div {
background-position: 0 100%;
}Creates a PostCSS plugin instance that normalizes position keyword values in CSS declarations.
/**
* Creates a PostCSS plugin instance for normalizing position values
* @returns {Plugin} PostCSS plugin object that processes CSS during the OnceExit phase
*/
function postcssNormalizePositions(): Plugin;The plugin creator function has a marker property that identifies it as a PostCSS plugin:
postcssNormalizePositions.postcss = true;The returned plugin object implements the PostCSS plugin interface:
interface Plugin {
/** Plugin name identifier */
postcssPlugin: "postcss-normalize-positions";
/** Main plugin processing function that runs once after all other processing */
OnceExit(css: Root): void;
}The plugin processes the following CSS properties and their values:
background (background shorthand property)background-positionperspective-origin-webkit-perspective-origin)The plugin performs the following keyword-to-value transformations:
center → 50%left → 0right → 100%top → 0bottom → 100%left bottom → 0 100%right top → 100% 0center left → 0center right → 100%top center → 50% 0bottom center → 50% 100%30% center → 30% (removes redundant center)The plugin preserves certain values without transformation:
calc(), min(), max(), clamp()var(), env(), constant()/ separator)OnceExit hookOnceExit phase// postcss.config.js
module.exports = {
plugins: [
require('postcss-normalize-positions')(),
// other plugins...
]
};// webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: [
'style-loader',
'css-loader',
{
loader: 'postcss-loader',
options: {
postcssOptions: {
plugins: [
require('postcss-normalize-positions')(),
]
}
}
}
]
}
]
}
};const postcss = require('postcss');
const normalizePositions = require('postcss-normalize-positions');
async function processCSS(inputCSS) {
const result = await postcss([
normalizePositions()
]).process(inputCSS, { from: undefined });
return result.css;
}
// Example usage
const css = `
.hero {
background: url(hero.jpg) center center no-repeat;
background-position: right bottom;
}
.sidebar {
perspective-origin: left top;
}
`;
processCSS(css)
.then(optimizedCSS => console.log(optimizedCSS));Output:
.hero {
background: url(hero.jpg) 50% no-repeat;
background-position: 100% 100%;
}
.sidebar {
perspective-origin: 0 0;
}