PostCSS is a tool for transforming CSS with JS plugins. These plugins can support variables and mixins, transpile future CSS syntax, inline images, and more.
PostCSS is used by Google, Twitter, Alibaba, and Shopify. Its plugin, Autoprefixer, is one of the most popular CSS processors.
PostCSS can do the same work as preprocessors like Sass, Less, and Stylus. But PostCSS is modular, 3-30 times faster, and much more powerful.
Twitter account: @postcss. Weibo account: postcss. VK.com page: postcss.
| Examples | Features | Usage | Plugins | Write Own Plugin | Options |
|---|
PostCSS itself is very small. It includes only a CSS parser, a CSS node tree API, a source map generator, and a node tree stringifier.
All CSS transformations are made by plugins. And these plugins are just small plain JS functions, which receive a CSS node tree, transform it, and return a modified tree.
You can use the cssnext plugin pack and write future CSS code right now:
:root {
--mainColor: #ffbbaaff;
}
@custom-media --mobile (width <= 640px);
@custom-selector --heading h1, h2, h3, h4, h5, h6;
.post-article --heading {
color: color( var(--mainColor) blackness(+20%) );
}
@media (--mobile) {
.post-article --heading {
margin-top: 0;
}
}Or if you like the Sass syntax, you could combine
postcss-nested and postcss-mixins:
@define-mixin social-icon $network $color {
&.is-$network {
background: $color;
}
}
.social-icon {
@mixin social-icon twitter #55acee;
@mixin social-icon facebook #3b5998;
padding: 10px 5px;
@media (max-width: 640px) {
padding: 0;
}
}Preprocessors are template languages, where you mix styles with code (like PHP does with HTML). In contrast, in PostCSS you write a custom subset of CSS. All code can only be in JS plugins.
As a result, PostCSS offers three main benefits:
- Performance: PostCSS, written in JS, is 3 times faster than libsass, which is written in C++.
- Future CSS: PostCSS plugins can read and rebuild an entire document, meaning that they can provide new language features. For example, cssnext transpiles the latest W3C drafts to current CSS syntax.
- New abilities: PostCSS plugins can read and change every part of CSS.
It makes many new classes of tools possible. Autoprefixer,
doiuseorpostcss-colorblindare good examples.
You just need to follow these two steps to use PostCSS:
- Add PostCSS to your build tool.
- Select plugins from the list below and add them to your PostCSS process.
There are plugins for Grunt, Gulp, webpack, Broccoli and Brunch.
gulp.task('css', function () {
var postcss = require('gulp-postcss');
return gulp.src('src/**/*.css')
.pipe( postcss([ require('cssnext'), require('cssgrace') ]) )
.pipe( gulp.dest('build/') );
});For other environments you can use the CLI tool or the JS API:
var postcss = require('postcss');
postcss([ require('cssnext'), require('cssgrace') ])
.process(css, { from: 'src/app.css', to: 'app.css' })
.then(function (result) {
fs.writeFileSync('app.css', result.css);
if ( result.map ) fs.writeFileSync('app.css.map', result.map);
});Read the PostCSS API for more details about the JS API.
With postcss-plugin-context you can run different plugins
on different parts of CSS.
.css-example.is-test-for-css4-browsers {
color: gray(255, 50%);
}
@context cssnext {
.css-example.is-fallback-for-all-browsers {
color: gray(255, 50%);
}
}cssnanocontains plugins that optimise CSS size for use in production.cssnextcontains plugins that allow you to use future CSS features today.atcsscontains plugins that transform your CSS according to special annotation comments.
postcss-color-functionsupports functions to transform colors.postcss-color-graysupports thegray()function.postcss-color-hex-alphasupports#rrggbbaaand#rgbanotation.postcss-color-hwbtransformshwb()to widely compatiblergb().postcss-color-rebeccapurplesupports therebeccapurplecolor.postcss-custom-mediasupports custom aliases for media queries.postcss-custom-propertiessupports variables, using syntax from the W3C Custom Properties.postcss-css-variablessupports variables for descendant/nested rules and at-rulespostcss-custom-selectorsadds custom aliases for selectors.postcss-font-varianttranspiles human-readablefont-variantto more widely supported CSS.postcss-hostmakes the Shadow DOM’s:hostselector work properly with pseudo-classes.postcss-media-minmaxadds<=and=>statements to media queries.postcss-selector-nottransforms CSS4:not()to CSS3:not().mq4-hover-shimsupports the@media (hover)feature.
postcss-color-rgba-fallbacktransformsrgba()to hexadecimal.postcss-epubadds the-epub-prefix to relevant properties.postcss-image-setaddsbackground-imagewith first image forimage-set()postcss-opacityadds opacity filter for IE8.postcss-pseudoelementsConvert::selectors into:selectors for IE 8 compatibility.postcss-vmingeneratesvmfallback forvminunit in IE9.postcss-will-changeinserts 3D hack beforewill-changeproperty.autoprefixeradds vendor prefixes for you, using data from Can I Use.cssgraceprovides various helpers and transpiles CSS 3 for IE and other old browsers.pixremgenerates pixel fallbacks forremunits.
postcss-color-alphatransforms#hex.a,black(alpha)andwhite(alpha)torgba().postcss-foradds@forloops.postcss-conditionalsadds@ifstatements.postcss-mixinsenables mixins more powerful than Sass’s, defined within stylesheets or in JS.postcss-mapenables configuration maps.postcss-neatis a semantic and fluid grid framework.postcss-nestedunwraps nested rules.postcss-quantity-queriesenables quantity queries.postcss-simple-extendsupports extending of silent classes, like Sass’s@extend.postcss-simple-varssupports for Sass-style variables.csstyleadds components workflow to your styles.lostfeature richcalc()grid system by Jeet author.
postcss-assetsallows you to simplify URLs, insert image dimensions, and inline files.postcss-at2xhandles retina background images via use ofat-2xkeyword.postcss-calcreducescalc()to values (when expressions involve the same units).postcss-colorminreduces color values to their smallest representations.postcss-convert-valuesreduces length and time values (e.g. ms -> s).postcss-data-packermoves embedded Base64 data out of the stylesheet and into a separate file.postcss-discard-duplicatesremoves duplicate declarations and rules.postcss-discard-emptyremoves empty rules and declarations.postcss-discard-font-faceremoves unused@font-facedeclarations.postcss-font-familyoptimisesfontandfont-familydeclarations.postcss-importinlines the stylesheets referred to by@importrules.postcss-merge-rulesmerges adjacent rules when selectors/properties overlap.postcss-minify-font-weightcompressesfont-weightvalues.postcss-minify-selectorsnormalizes selectors for better compression.postcss-normalize-urlnormalizesurl()s and trims quotes where they are unnecessary.postcss-reduce-identscompresses@keyframes,@counter-style&counteridentifiers.postcss-urlrebases or inlinesurl()s.postcss-zindexrebases positivez-indexvalues.csswringis a CSS minifier.css-byebyeremoves the CSS rules that you don’t want.css-mqpackerjoins matching CSS media queries into a single statement.webpcssadds URLs for WebP images, so they can be used by browsers that support WebP.
postcss-default-unitadds default unit to numeric CSS properties.postcss-easingsreplaces easing names from easings.net withcubic-bezier()functions.postcss-focusadds:focusselector to every:hover.postcss-generate-presetallows quick generation of rules. Useful for creating repetitive utilities.postcss-sizeadds asizeshortcut that sets width and height with one declaration.
postcss-brand-colorsinserts company brand colors in thebrand-colorsmodule.postcss-color-palettetransforms CSS 2 color keywords to a custom palette.postcss-colorblindtransforms colors using filters to simulate colorblindnesspostcss-discard-commentsremoves comments based on rules you specify.postcss-log-warningslogs warnings messages from other plugins in the console.postcss-messagesdisplays warning messages from other plugins right in your browser.postcss-single-charsetensures that there is one and only one@charsetrule at the top of file.postcss-spiffinglets you use British English in your CSSrtlcssmirrors styles for right-to-left locales.
postcss-bem-linterlints CSS for conformance to SUIT CSS methodology.postcss-cssstatsreturns an object with CSS statistics.css2modernizrcreates a Modernizr config file that requires only the tests that your CSS uses.doiuselints CSS for browser support, using data from Can I Use.list-selectorslists and categorizes the selectors used in your CSS, for code review.
PostCSS has great source maps support. It can read and interpret maps from previous transformation steps, autodetect the format that you expect, and output both external and inline maps.
To ensure that you generate an accurate source map, you must indicate the input
and output CSS files paths — using the options from and to, respectively.
To generate a new source map with the default options, simply set map: true.
This will generate an inline source map that contains the source content.
If you don’t want the map inlined, you can use set map.inline: false.
processor
.process(css, {
from: 'app.sass.css',
to: 'app.css',
map: { inline: false },
})
.then(function (result) {
result.map //=> '{ "version":3,
// "file":"app.css",
// "sources":["app.sass"],
// "mappings":"AAAA,KAAI" }'
});If PostCSS finds source maps from a previous transformation, it will automatically update that source map with the same options.
If you want more control over source map generation, you can define the map
option as an object with the following parameters:
-
inlineboolean: indicates that the source map should be embedded in the output CSS as a Base64-encoded comment. By default it istrue. But if all previous maps are external, not inline, PostCSS will not embed the map even if you do not set this option.If you have an inline source map, the
result.mapproperty will be empty, as the source map will be contained within the text ofresult.css. -
prevstring, object or boolean: source map content from a previous processing step (for example, Sass compilation). PostCSS will try to read the previous source map automatically (based on comments within the source CSS), but you can use this option to identify it manually. If desired, you can omit the previous map withprev: false. -
sourcesContentboolean: indicates that PostCSS should set the origin content (for example, Sass source) of the source map. By default it istrue. But if all previous maps do not contain sources content, PostCSS will also leave it out even if you do not set this option. -
annotationboolean or string: indicates that PostCSS should add annotation comments to the CSS. By default, PostCSS will always add a comment with a path to the source map. But if the input CSS does not have any annotation comment, PostCSS will omit it, too, even if you do not set this option.By default, PostCSS presumes that you want to save the source map as
opts.to + '.map'and will use this path in the annotation comment. But you can set another path by providing a string value forannotation.If you have set
inline: true, annotation cannot be disabled.
If you provide a safe: true option to the process or parse methods,
PostCSS will try to correct any syntax errors that it finds in the CSS.
postcss.parse('a {'); // will throw "Unclosed block"
postcss.parse('a {', { safe: true }); // will return CSS root for a {}This is useful for legacy code filled with hacks. Another use-case is interactive tools with live input — for example, the Autoprefixer demo.