|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119 |
- # Autoprefixer [![Cult Of Martians][cult-img]][cult]
-
- <img align="right" width="94" height="71"
- src="http://postcss.github.io/autoprefixer/logo.svg"
- title="Autoprefixer logo by Anton Lovchikov">
-
- [PostCSS] plugin to parse CSS and add vendor prefixes to CSS rules using values
- from [Can I Use]. It is [recommended] by Google and used in Twitter and Alibaba.
-
- Write your CSS rules without vendor prefixes (in fact, forget about them
- entirely):
-
- ```css
- ::placeholder {
- color: gray;
- }
-
- .image {
- background-image: url(image@1x.png);
- }
- @media (min-resolution: 2dppx) {
- .image {
- background-image: url(image@2x.png);
- }
- }
- ```
-
- Autoprefixer will use the data based on current browser popularity and property
- support to apply prefixes for you. You can try the [interactive demo]
- of Autoprefixer.
-
- ```css
- ::-moz-placeholder {
- color: gray;
- }
- :-ms-input-placeholder {
- color: gray;
- }
- ::-ms-input-placeholder {
- color: gray;
- }
- ::placeholder {
- color: gray;
- }
-
- .image {
- background-image: url(image@1x.png);
- }
- @media (-webkit-min-device-pixel-ratio: 2),
- (min-resolution: 2dppx) {
- .image {
- background-image: url(image@2x.png);
- }
- }
- ```
-
- Twitter account for news and releases: [@autoprefixer].
-
- <a href="https://evilmartians.com/?utm_source=autoprefixer">
- <img src="https://evilmartians.com/badges/sponsored-by-evil-martians.svg" alt="Sponsored by Evil Martians" width="236" height="54">
- </a>
-
- [interactive demo]: https://autoprefixer.github.io/
- [@autoprefixer]: https://twitter.com/autoprefixer
- [recommended]: https://developers.google.com/web/tools/setup/setup-buildtools#dont_trip_up_with_vendor_prefixes
- [Can I Use]: https://caniuse.com/
- [cult-img]: http://cultofmartians.com/assets/badges/badge.svg
- [PostCSS]: https://github.com/postcss/postcss
- [cult]: http://cultofmartians.com/tasks/autoprefixer-grid.html
-
-
- ## Contents
-
- * [Contents](#contents)
- * [Browsers](#browsers)
- * [FAQ](#faq)
- * [Does Autoprefixer polyfill Grid Layout for IE?](#does-autoprefixer-polyfill-grid-layout-for-ie)
- * [Does it add polyfills?](#does-it-add-polyfills)
- * [Why doesn’t Autoprefixer add prefixes to `border-radius`?](#why-doesnt-autoprefixer-add-prefixes-to-border-radius)
- * [Why does Autoprefixer use unprefixed properties in `@-webkit-keyframes`?](#why-does-autoprefixer-use-unprefixed-properties-in--webkit-keyframes)
- * [How to work with legacy `-webkit-` only code?](#how-to-work-with-legacy--webkit--only-code)
- * [Does Autoprefixer add `-epub-` prefix?](#does-autoprefixer-add--epub--prefix)
- * [Why doesn’t Autoprefixer transform generic font-family `system-ui`?](#why-doesnt-autoprefixer-transform-generic-font-family-system-ui)
- * [Usage](#usage)
- * [Gulp](#gulp)
- * [Webpack](#webpack)
- * [CSS-in-JS](#css-in-js)
- * [CLI](#cli)
- * [Other Build Tools](#other-build-tools)
- * [Preprocessors](#preprocessors)
- * [GUI Tools](#gui-tools)
- * [JavaScript](#javascript)
- * [Text Editors and IDE](#text-editors-and-ide)
- * [Warnings](#warnings)
- * [Disabling](#disabling)
- * [Prefixes](#prefixes)
- * [Features](#features)
- * [Control Comments](#control-comments)
- * [Options](#options)
- * [Environment Variables](#environment-variables)
- * [Using environment variables to support CSS Grid prefixes in Create React App](#using-environment-variables-to-support-css-grid-prefixes-in-create-react-app)
- * [Grid Autoplacement support in IE](#grid-autoplacement-support-in-ie)
- * [Beware of enabling autoplacement in old projects](#beware-of-enabling-autoplacement-in-old-projects)
- * [Autoplacement limitations](#autoplacement-limitations)
- * [Both columns and rows must be defined](#both-columns-and-rows-must-be-defined)
- * [Repeat auto-fit and auto-fill are not supported](#repeat-auto-fit-and-auto-fill-are-not-supported)
- * [No manual cell placement or column/row spans allowed inside an autoplacement grid](#no-manual-cell-placement-or-columnrow-spans-allowed-inside-an-autoplacement-grid)
- * [Do not create `::before` and `::after` pseudo elements](#do-not-create-before-and-after-pseudo-elements)
- * [When changing the `grid gap` value, columns and rows must be re-declared](#when-changing-the-grid-gap-value-columns-and-rows-must-be-re-declared)
- * [Debug](#debug)
- * [Security Contact](#security-contact)
- * [For Enterprise](#for-enterprise)
-
- ## Browsers
-
- Autoprefixer uses [Browserslist], so you can specify the browsers
- you want to target in your project with queries like `> 5%`
- (see [Best Practices]).
-
- The best way to provide browsers is a `.browserslistrc` file in your project
- root, or by adding a `browserslist` key to your `package.json`.
-
- We recommend the use of these options over passing options to Autoprefixer so
- that the config can be shared with other tools such as [babel-preset-env] and
- [Stylelint].
-
- See [Browserslist docs] for queries, browser names, config format, and defaults.
-
- [Browserslist docs]: https://github.com/browserslist/browserslist#queries
- [babel-preset-env]: https://github.com/babel/babel/tree/master/packages/babel-preset-env
- [Best Practices]: https://github.com/browserslist/browserslist#best-practices
- [Browserslist]: https://github.com/browserslist/browserslist
- [Stylelint]: https://stylelint.io/
-
-
- ## FAQ
-
- ### Does Autoprefixer polyfill Grid Layout for IE?
-
- Autoprefixer can be used to translate modern CSS Grid syntax into IE 10
- and IE 11 syntax, but this polyfill will not work in 100% of cases.
- This is why it is disabled by default.
-
- First, you need to enable Grid prefixes by using either the `grid: "autoplace"`
- option or the `/* autoprefixer grid: autoplace */` control comment.
- Also you can use environment variable to enable Grid:
- `AUTOPREFIXER_GRID=autoplace npm build`.
-
- Second, you need to test every fix with Grid in IE. It is not an enable and
- forget feature, but it is still very useful.
- Financial Times and Yandex use it in production.
-
- Third, there is only very limited auto placement support. Read the
- [Grid Autoplacement support in IE](#grid-autoplacement-support-in-ie) section
- for more details.
-
- Fourth, if you are not using the autoplacement feature, the best way
- to use Autoprefixer is by using `grid-template` or `grid-template-areas`.
-
- ```css
- .page {
- display: grid;
- grid-gap: 33px;
- grid-template:
- "head head head" 1fr
- "nav main main" minmax(100px, 1fr)
- "nav foot foot" 2fr /
- 1fr 100px 1fr;
- }
- .page__head {
- grid-area: head;
- }
- .page__nav {
- grid-area: nav;
- }
- .page__main {
- grid-area: main;
- }
- .page__footer {
- grid-area: foot;
- }
- ```
-
- See also:
-
- * [The guide about Grids in IE and Autoprefixer].
- * [`postcss-gap-properties`] to use new `gap` property
- instead of old `grid-gap`.
- * [`postcss-grid-kiss`] has alternate “everything in one property” syntax,
- which makes using Autoprefixer’s Grid translations safer.
-
- [The guide about Grids in IE and Autoprefixer]: https://css-tricks.com/css-grid-in-ie-css-grid-and-the-new-autoprefixer/
- [`postcss-gap-properties`]: https://github.com/jonathantneal/postcss-gap-properties
- [`postcss-grid-kiss`]: https://github.com/sylvainpolletvillard/postcss-grid-kiss
-
-
- ### Does it add polyfills?
-
- No. Autoprefixer only adds prefixes.
-
- Most new CSS features will require client side JavaScript to handle a new
- behavior correctly.
-
- Depending on what you consider to be a “polyfill”, you can take a look at some
- other tools and libraries. If you are just looking for syntax sugar,
- you might take a look at:
-
- - [postcss-preset-env] is a plugins preset with polyfills and Autoprefixer
- to write future CSS today.
- - [Oldie], a PostCSS plugin that handles some IE hacks (opacity, rgba, etc).
- - [postcss-flexbugs-fixes], a PostCSS plugin to fix flexbox issues.
-
- [postcss-flexbugs-fixes]: https://github.com/luisrudge/postcss-flexbugs-fixes
- [postcss-preset-env]: https://github.com/jonathantneal/postcss-preset-env
- [Oldie]: https://github.com/jonathantneal/oldie
-
-
- ### Why doesn’t Autoprefixer add prefixes to `border-radius`?
-
- Developers are often surprised by how few prefixes are required today.
- If Autoprefixer doesn’t add prefixes to your CSS, check if they’re still
- required on [Can I Use].
-
- [Can I Use]: https://caniuse.com/
-
-
- ### Why does Autoprefixer use unprefixed properties in `@-webkit-keyframes`?
-
- Browser teams can remove some prefixes before others, so we try to use all
- combinations of prefixed/unprefixed values.
-
-
- ### How to work with legacy `-webkit-` only code?
-
- Autoprefixer needs unprefixed property to add prefixes. So if you only
- wrote `-webkit-gradient` without W3C’s `gradient`,
- Autoprefixer will not add other prefixes.
-
- But [PostCSS] has plugins to convert CSS to unprefixed state.
- Use [postcss-unprefix] before Autoprefixer.
-
- [postcss-unprefix]: https://github.com/gucong3000/postcss-unprefix
-
-
- ### Does Autoprefixer add `-epub-` prefix?
-
- No, Autoprefixer works only with browsers prefixes from Can I Use.
- But you can use [postcss-epub] for prefixing ePub3 properties.
-
- [postcss-epub]: https://github.com/Rycochet/postcss-epub
-
-
- ### Why doesn’t Autoprefixer transform generic font-family `system-ui`?
-
- `system-ui` is technically not a prefix and the transformation is not
- future-proof. You can use [postcss-font-family-system-ui] to transform
- `system-ui` to a practical font-family list.
-
- [postcss-font-family-system-ui]: https://github.com/JLHwung/postcss-font-family-system-ui
-
-
- ## Usage
-
- ### Gulp
-
- In Gulp you can use [gulp-postcss] with `autoprefixer` npm package.
-
- ```js
- gulp.task('autoprefixer', () => {
- const autoprefixer = require('autoprefixer')
- const sourcemaps = require('gulp-sourcemaps')
- const postcss = require('gulp-postcss')
-
- return gulp.src('./src/*.css')
- .pipe(sourcemaps.init())
- .pipe(postcss([ autoprefixer() ]))
- .pipe(sourcemaps.write('.'))
- .pipe(gulp.dest('./dest'))
- })
- ```
-
- With `gulp-postcss` you also can combine Autoprefixer
- with [other PostCSS plugins].
-
- [gulp-postcss]: https://github.com/postcss/gulp-postcss
- [other PostCSS plugins]: https://github.com/postcss/postcss#plugins
-
-
- ### Webpack
-
- In [webpack] you can use [postcss-loader] with `autoprefixer`
- and [other PostCSS plugins].
-
- ```js
- module.exports = {
- module: {
- rules: [
- {
- test: /\.css$/,
- use: ["style-loader", "css-loader", "postcss-loader"]
- }
- ]
- }
- }
- ```
-
- And create a `postcss.config.js` with:
-
- ```js
- module.exports = {
- plugins: [
- require('autoprefixer')
- ]
- }
- ```
-
- [other PostCSS plugins]: https://github.com/postcss/postcss#plugins
- [postcss-loader]: https://github.com/postcss/postcss-loader
- [webpack]: https://webpack.js.org/
-
-
- ### CSS-in-JS
-
- The best way to use PostCSS with CSS-in-JS is [`astroturf`].
- Add its loader to your `webpack.config.js`:
-
- ```js
- module.exports = {
- module: {
- rules: [
- {
- test: /\.css$/,
- use: ['style-loader', 'postcss-loader'],
- },
- {
- test: /\.jsx?$/,
- use: ['babel-loader', 'astroturf/loader'],
- }
- ]
- }
- }
- ```
-
- Then create `postcss.config.js`:
-
- ```js
- module.exports = {
- plugins: [
- require('autoprefixer')
- ]
- }
- ```
-
- [`astroturf`]: https://github.com/4Catalyzer/astroturf
-
-
- ### CLI
-
- You can use the [postcss-cli] to run Autoprefixer from CLI:
-
- ```sh
- npm install postcss-cli autoprefixer
- npx postcss *.css --use autoprefixer -d build/
- ```
-
- See `postcss -h` for help.
-
- [postcss-cli]: https://github.com/postcss/postcss-cli
-
-
- ### Other Build Tools
-
- * **Grunt:** [grunt-postcss]
- * **Ruby on Rails**: [autoprefixer-rails]
- * **Neutrino**: [neutrino-middleware-postcss]
- * **Jekyll**: add `autoprefixer-rails` and `jekyll-assets` to `Gemfile`
- * **Brunch**: [postcss-brunch]
- * **Broccoli**: [broccoli-postcss]
- * **Middleman**: [middleman-autoprefixer]
- * **Mincer**: add `autoprefixer` npm package and enable it:
- `environment.enable('autoprefixer')`
-
- [neutrino-middleware-postcss]: https://www.npmjs.com/package/neutrino-middleware-postcss
- [middleman-autoprefixer]: https://github.com/middleman/middleman-autoprefixer
- [autoprefixer-rails]: https://github.com/ai/autoprefixer-rails
- [broccoli-postcss]: https://github.com/jeffjewiss/broccoli-postcss
- [postcss-brunch]: https://github.com/iamvdo/postcss-brunch
- [grunt-postcss]: https://github.com/C-Lodder/grunt-postcss
-
-
- #### Preprocessors
-
- * **Less**: [less-plugin-autoprefix]
- * **Stylus**: [autoprefixer-stylus]
- * **Compass**: [autoprefixer-rails#compass]
-
- [less-plugin-autoprefix]: https://github.com/less/less-plugin-autoprefix
- [autoprefixer-stylus]: https://github.com/jenius/autoprefixer-stylus
- [autoprefixer-rails#compass]: https://github.com/ai/autoprefixer-rails#compass
-
-
- #### GUI Tools
-
- * [CodeKit](https://codekitapp.com/help/autoprefixer/)
- * [Prepros](https://prepros.io)
-
-
- ### JavaScript
-
- You can use Autoprefixer with [PostCSS] in your Node.js application
- or if you want to develop an Autoprefixer plugin for a new environment.
-
- ```js
- const autoprefixer = require('autoprefixer')
- const postcss = require('postcss')
-
- postcss([ autoprefixer ]).process(css).then(result => {
- result.warnings().forEach(warn => {
- console.warn(warn.toString())
- })
- console.log(result.css)
- })
- ```
-
- There is also a [standalone build] for the browser or for a non-Node.js runtime.
-
- You can use [html-autoprefixer] to process HTML with inlined CSS.
-
- [html-autoprefixer]: https://github.com/RebelMail/html-autoprefixer
- [standalone build]: https://raw.github.com/ai/autoprefixer-rails/master/vendor/autoprefixer.js
- [PostCSS]: https://github.com/postcss/postcss
-
-
- ### Text Editors and IDE
-
- Autoprefixer should be used in assets build tools. Text editor plugins are not
- a good solution, because prefixes decrease code readability and you will need
- to change values in all prefixed properties.
-
- I recommend you to learn how to use build tools like [Parcel].
- They work much better and will open you a whole new world of useful plugins
- and automation.
-
- If you can’t move to a build tool, you can use text editor plugins:
-
- * [Visual Studio Code](https://github.com/mrmlnc/vscode-autoprefixer)
- * [Atom Editor](https://github.com/sindresorhus/atom-autoprefixer)
- * [Sublime Text](https://github.com/sindresorhus/sublime-autoprefixer)
- * [Brackets](https://github.com/mikaeljorhult/brackets-autoprefixer)
-
- [Parcel]: https://parceljs.org/
-
-
- ## Warnings
-
- Autoprefixer uses the [PostCSS warning API] to warn about really important
- problems in your CSS:
-
- * Old direction syntax in gradients.
- * Old unprefixed `display: box` instead of `display: flex`
- by latest specification version.
-
- You can get warnings from `result.warnings()`:
-
- ```js
- result.warnings().forEach(warn => {
- console.warn(warn.toString())
- })
- ```
-
- Every Autoprefixer runner should display these warnings.
-
- [PostCSS warning API]: http://api.postcss.org/Warning.html
-
-
- ## Disabling
-
- ### Prefixes
-
- Autoprefixer was designed to have no interface – it just works.
- If you need some browser specific hack just write a prefixed property
- after the unprefixed one.
-
- ```css
- a {
- transform: scale(0.5);
- -moz-transform: scale(0.6);
- }
- ```
-
- If some prefixes were generated incorrectly, please create an [issue on GitHub].
-
- [issue on GitHub]: https://github.com/postcss/autoprefixer/issues
-
-
- ### Features
-
- You can use these plugin options to control some of Autoprefixer’s features.
-
- * `grid: "autoplace"` will enable `-ms-` prefixes for Grid Layout including some
- [limited autoplacement support](#grid-autoplacement-support-in-ie).
- * `supports: false` will disable `@supports` parameters prefixing.
- * `flexbox: false` will disable flexbox properties prefixing.
- Or `flexbox: "no-2009"` will add prefixes only for final and IE
- versions of specification.
- * `remove: false` will disable cleaning outdated prefixes.
-
- You should set them inside the plugin like so:
-
- ```js
- autoprefixer({ grid: 'autoplace' })
- ```
-
-
- ### Control Comments
-
- If you do not need Autoprefixer in some part of your CSS,
- you can use control comments to disable Autoprefixer.
-
- ```css
- .a {
- transition: 1s; /* will be prefixed */
- }
-
- .b {
- /* autoprefixer: off */
- transition: 1s; /* will not be prefixed */
- }
-
- .c {
- /* autoprefixer: ignore next */
- transition: 1s; /* will not be prefixed */
- mask: url(image.png); /* will be prefixed */
- }
- ```
-
- There are three types of control comments:
-
- * `/* autoprefixer: (on|off) */`: enable/disable all Autoprefixer translations for the
- whole block both *before* and *after* the comment.
- * `/* autoprefixer: ignore next */`: disable Autoprefixer only for the next property
- or next rule selector or at-rule parameters (but not rule/at‑rule body).
- * `/* autoprefixer grid: (autoplace|no-autoplace|off) */`: control how Autoprefixer handles
- grid translations for the whole block:
- * `autoplace`: enable grid translations with autoplacement support.
- * `no-autoplace`: enable grid translations with autoplacement
- support *disabled* (alias for deprecated value `on`).
- * `off`: disable all grid translations.
-
- You can also use comments recursively:
-
- ```css
- /* autoprefixer: off */
- @supports (transition: all) {
- /* autoprefixer: on */
- a {
- /* autoprefixer: off */
- }
- }
- ```
-
- Note that comments that disable the whole block should not be featured in the same
- block twice:
-
- ```css
- /* How not to use block level control comments */
-
- .do-not-do-this {
- /* autoprefixer: off */
- transition: 1s;
- /* autoprefixer: on */
- transform: rotate(20deg);
- }
- ```
-
-
- ## Options
-
- Function `autoprefixer(options)` returns a new PostCSS plugin.
- See [PostCSS API] for plugin usage documentation.
-
- ```js
- autoprefixer({ cascade: false })
- ```
-
- Available options are:
-
- * `env` (string): environment for Browserslist.
- * `cascade` (boolean): should Autoprefixer use Visual Cascade,
- if CSS is uncompressed. Default: `true`
- * `add` (boolean): should Autoprefixer add prefixes. Default is `true`.
- * `remove` (boolean): should Autoprefixer [remove outdated] prefixes.
- Default is `true`.
- * `supports` (boolean): should Autoprefixer add prefixes for `@supports`
- parameters. Default is `true`.
- * `flexbox` (boolean|string): should Autoprefixer add prefixes for flexbox
- properties. With `"no-2009"` value Autoprefixer will add prefixes only
- for final and IE 10 versions of specification. Default is `true`.
- * `grid` (false|`"autoplace"`|`"no-autoplace"`): should Autoprefixer
- add IE 10-11 prefixes for Grid Layout properties?
- * `false` (default): prevent Autoprefixer from outputting
- CSS Grid translations.
- * `"autoplace"`: enable Autoprefixer grid translations
- and *include* autoplacement support. You can also use
- `/* autoprefixer grid: autoplace */` in your CSS.
- * `"no-autoplace"`: enable Autoprefixer grid translations
- but *exclude* autoplacement support. You can also use
- `/* autoprefixer grid: no-autoplace */` in your CSS.
- (alias for the deprecated `true` value)
- * `stats` (object): custom [usage statistics] for `> 10% in my stats`
- browsers query.
- * `overrideBrowserslist` (array): list of queries for target browsers.
- Try to not use it. The best practice is to use `.browserslistrc` config
- or `browserslist` key in `package.json` to share target browsers
- with Babel, ESLint and Stylelint. See [Browserslist docs]
- for available queries and default value.
- * `ignoreUnknownVersions` (boolean): do not raise error on unknown browser
- version in Browserslist config. Default is `false`.
-
- Plugin object has `info()` method for debugging purpose.
-
- You can use PostCSS processor to process several CSS files
- to increase performance.
-
- [usage statistics]: https://github.com/browserslist/browserslist#custom-usage-data
- [PostCSS API]: http://api.postcss.org
-
- ## Environment Variables
-
- * `AUTOPREFIXER_GRID`: (`autoplace`|`no-autoplace`) should Autoprefixer
- add IE 10-11 prefixes for Grid Layout properties?
- * `autoplace`: enable Autoprefixer grid translations
- and *include* autoplacement support.
- * `no-autoplace`: enable Autoprefixer grid translations
- but *exclude* autoplacement support.
-
- Environment variables are useful, when you want to change Autoprefixer options but don't have access to config files.
- [Create React App] is a good example of this.
-
- [Create React App]: (https://reactjs.org/docs/create-a-new-react-app.html#create-react-app)
-
- ### Using environment variables to support CSS Grid prefixes in Create React App
-
- 1. Install the latest version of Autoprefixer and [cross-env](https://www.npmjs.com/package/cross-env):
-
- ```
- npm install autoprefixer@latest cross-env --save-dev
- ```
-
- 2. Under `"browserslist"` > `"development"` in the package.json file, add `"last 1 ie version"`
-
- ```
- "browserslist": {
- "production": [
- ">0.2%",
- "not dead",
- "not op_mini all"
- ],
- "development": [
- "last 1 chrome version",
- "last 1 firefox version",
- "last 1 safari version",
- "last 1 ie version"
- ]
- }
- ```
-
- 3. Update `"scripts"` in the package.json file to the following:
-
- ```
- "scripts": {
- "start": "cross-env AUTOPREFIXER_GRID=autoplace react-scripts start",
- "build": "cross-env AUTOPREFIXER_GRID=autoplace react-scripts build",
- "test": "cross-env AUTOPREFIXER_GRID=autoplace react-scripts test",
- "eject": "react-scripts eject"
- },
- ```
-
- Replace `autoplace` with `no-autoplace` in the above example if you prefer to disable Autoprefixer Grid autoplacement support.
-
- Now when you run `npm start` you will see CSS Grid prefixes automatically being applied to your output CSS.
-
- See also [Browserslist environment variables] for more examples on how to use environment variables in your project.
-
- [Browserslist environment variables]: https://github.com/browserslist/browserslist#environment-variables
-
- ## Grid Autoplacement support in IE
-
- If the `grid` option is set to `"autoplace"`, limited autoplacement support is added to Autoprefixers grid translations. You can also use
- the `/* autoprefixer grid: autoplace */` control comment or
- `AUTOPREFIXER_GRID=autoplace npm build` environment variable.
-
- Autoprefixer will only autoplace grid cells if both `grid-template-rows`
- and `grid-template-columns` has been set. If `grid-template`
- or `grid-template-areas` has been set, Autoprefixer will use area based
- cell placement instead.
-
- Autoprefixer supports autoplacement by using `nth-child` CSS selectors.
- It creates [number of columns] x [number of rows] `nth-child` selectors.
- For this reason Autoplacement is only supported within the explicit grid.
-
- ```css
- /* Input CSS */
-
- /* autoprefixer grid: autoplace */
-
- .autoplacement-example {
- display: grid;
- grid-template-columns: 1fr 1fr;
- grid-template-rows: auto auto;
- grid-gap: 20px;
- }
- ```
-
- ```css
- /* Output CSS */
-
- /* autoprefixer grid: autoplace */
-
- .autoplacement-example {
- display: -ms-grid;
- display: grid;
- -ms-grid-columns: 1fr 20px 1fr;
- grid-template-columns: 1fr 1fr;
- -ms-grid-rows: auto 20px auto;
- grid-template-rows: auto auto;
- grid-gap: 20px;
- }
-
- .autoplacement-example > *:nth-child(1) {
- -ms-grid-row: 1;
- -ms-grid-column: 1;
- }
-
- .autoplacement-example > *:nth-child(2) {
- -ms-grid-row: 1;
- -ms-grid-column: 3;
- }
-
- .autoplacement-example > *:nth-child(3) {
- -ms-grid-row: 3;
- -ms-grid-column: 1;
- }
-
- .autoplacement-example > *:nth-child(4) {
- -ms-grid-row: 3;
- -ms-grid-column: 3;
- }
- ```
-
- ### Beware of enabling autoplacement in old projects
-
- Be careful about enabling autoplacement in any already established projects that have
- previously not used Autoprefixer's grid autoplacement feature before.
-
- If this was your html:
-
- ```html
- <div class="grid">
- <div class="grid-cell"></div>
- </div>
- ```
-
- The following CSS will not work as expected with the autoplacement feature enabled:
-
- ```css
- /* Unsafe CSS when Autoplacement is enabled */
-
- .grid-cell {
- grid-column: 2;
- grid-row: 2;
- }
-
- .grid {
- display: grid;
- grid-template-columns: repeat(3, 1fr);
- grid-template-rows: repeat(3, 1fr);
- }
- ```
-
- Swapping the rules around will not fix the issue either:
-
- ```css
- /* Also unsafe to use this CSS */
-
- .grid {
- display: grid;
- grid-template-columns: repeat(3, 1fr);
- grid-template-rows: repeat(3, 1fr);
- }
-
- .grid-cell {
- grid-column: 2;
- grid-row: 2;
- }
- ```
-
- One way to deal with this issue is to disable autoplacement in the
- grid-declaration rule:
-
- ```css
- /* Disable autoplacement to fix the issue */
-
- .grid {
- /* autoprefixer grid: no-autoplace */
- display: grid;
- grid-template-columns: repeat(3, 1fr);
- grid-template-rows: repeat(3, 1fr);
- }
-
- .grid-cell {
- grid-column: 2;
- grid-row: 2;
- }
- ```
-
- The absolute best way to integrate autoplacement into already existing projects
- though is to leave autoplacement turned off by default and then use a control
- comment to enable it when needed. This method is far less likely to cause
- something on the site to break.
-
- ```css
- /* Disable autoplacement by default in old projects */
- /* autoprefixer grid: no-autoplace */
-
- /* Old code will function the same way it always has */
- .old-grid {
- display: grid;
- grid-template-columns: repeat(3, 1fr);
- grid-template-rows: repeat(3, 1fr);
- }
- .old-grid-cell {
- grid-column: 2;
- grid-row: 2;
- }
-
- /* Enable autoplacement when you want to use it in new code */
- .new-autoplace-friendly-grid {
- /* autoprefixer grid: autoplace */
- display: grid;
- grid-template-columns: repeat(3, 1fr);
- grid-template-rows: repeat(3, auto);
- }
- ```
-
- Note that the `grid: "no-autoplace"` setting and the
- `/* autoprefixer grid: no-autoplace */` control comment share identical
- functionality to the `grid: true` setting and the `/* autoprefixer grid: on */`
- control comment. There is no need to refactor old code to use `no-autoplace`
- in place of the old `true` and `on` statements.
-
- ### Autoplacement limitations
-
- #### Both columns and rows must be defined
-
- Autoplacement only works inside the explicit grid. The columns and rows need to be defined
- so that Autoprefixer knows how many `nth-child` selectors to generate.
-
- ```css
- .not-allowed {
- display: grid;
- grid-template-columns: repeat(3, 1fr);
- }
-
- .is-allowed {
- display: grid;
- grid-template-columns: repeat(3, 1fr);
- grid-template-rows: repeat(10, auto);
- }
- ```
-
- #### Repeat auto-fit and auto-fill are not supported
-
- The `repeat(auto-fit, ...)` and `repeat(auto-fill, ...)` grid functionality relies on
- knowledge from the browser about screen dimensions and the number of available grid
- items for it to work properly. Autoprefixer does not have access to this information
- so unfortunately this little snippet will _never_ be IE friendly.
-
- ```css
- .grid {
- /* This will never be IE friendly */
- grid-template-columns: repeat(auto-fit, min-max(200px, 1fr))
- }
- ```
-
- #### No manual cell placement or column/row spans allowed inside an autoplacement grid
-
- Elements must not be manually placed or given column/row spans inside
- an autoplacement grid. Only the most basic of autoplacement grids are supported.
- Grid cells can still be placed manually outside the the explicit grid though.
- Support for manually placing individual grid cells inside an explicit
- autoplacement grid is planned for a future release.
-
- ```css
- .autoplacement-grid {
- display: grid;
- grid-template-columns: repeat(3, 1fr);
- grid-template-rows: repeat(3, auto);
- }
-
- /* Grid cells placed inside the explicit grid
- will break the layout in IE */
- .not-permitted-grid-cell {
- grid-column: 1;
- grid-row: 1;
- }
-
- /* Grid cells placed outside the
- explicit grid will work in IE */
- .permitted-grid-cell {
- grid-column: 1 / span 2;
- grid-row: 4;
- }
- ```
-
- If manual cell placement is required, we recommend using `grid-template` or
- `grid-template-areas` instead:
-
- ```css
- .page {
- display: grid;
- grid-gap: 30px;
- grid-template:
- "head head"
- "nav main" minmax(100px, 1fr)
- "foot foot" /
- 200px 1fr;
- }
- .page__head {
- grid-area: head;
- }
- .page__nav {
- grid-area: nav;
- }
- .page__main {
- grid-area: main;
- }
- .page__footer {
- grid-area: foot;
- }
- ```
-
- #### Do not create `::before` and `::after` pseudo elements
-
- Let's say you have this HTML:
-
- ```html
- <div class="grid">
- <div class="grid-cell"></div>
- </div>
- ```
-
- And you write this CSS:
-
- ```css
- .grid {
- display: grid;
- grid-template-columns: 1fr 1fr;
- grid-template-rows: auto;
- }
-
- .grid::before {
- content: 'before';
- }
-
- .grid::after {
- content: 'after';
- }
- ```
-
- This will be the output:
-
- ```css
- .grid {
- display: -ms-grid;
- display: grid;
- -ms-grid-columns: 1fr 1fr;
- grid-template-columns: 1fr 1fr;
- -ms-grid-rows: auto;
- grid-template-rows: auto;
- }
-
- .grid > *:nth-child(1) {
- -ms-grid-row: 1;
- -ms-grid-column: 1;
- }
-
-
- .grid > *:nth-child(2) {
- -ms-grid-row: 1;
- -ms-grid-column: 2;
- }
-
- .grid::before {
- content: 'before';
- }
-
- .grid::after {
- content: 'after';
- }
- ```
-
- IE will place `.grid-cell`, `::before` and `::after` in row 1 column 1.
- Modern browsers on the other hand will place `::before` in row 1 column 1,
- `.grid-cell` in row 1 column 2, and `::after` in row 2 column 1.
-
- See this [Code Pen](https://codepen.io/daniel-tonon/pen/gBymVw) to see a visualization
- of the issue. View the Code Pen in both a modern browser and IE to see the difference.
-
- Note that you can still create `::before` and `::after` elements as long as you manually
- place them outside the explicit grid.
-
- #### When changing the `grid gap` value, columns and rows must be re-declared
-
- If you wish to change the size of a `grid-gap`, you will need to redeclare the grid columns and rows.
-
- ```css
- .grid {
- display: grid;
- grid-template-columns: 1fr 1fr;
- grid-template-rows: auto;
- grid-gap: 50px;
- }
-
- /* This will *NOT* work in IE */
- @media (max-width: 600px) {
- .grid {
- grid-gap: 20px;
- }
- }
-
- /* This will *NOT* work in IE */
- .grid.small-gap {
- grid-gap: 20px;
- }
- ```
-
- ```css
- .grid {
- display: grid;
- grid-template-columns: 1fr 1fr;
- grid-template-rows: auto;
- grid-gap: 50px;
- }
-
- /* This *WILL* work in IE */
- @media (max-width: 600px) {
- .grid {
- grid-template-columns: 1fr 1fr;
- grid-template-rows: auto;
- grid-gap: 20px;
- }
- }
-
- /* This *WILL* work in IE */
- .grid.small-gap {
- grid-template-columns: 1fr 1fr;
- grid-template-rows: auto;
- grid-gap: 20px;
- }
- ```
-
- ## Debug
-
- Run `npx autoprefixer --info` in your project directory to check
- which browsers are selected and which properties will be prefixed:
-
- ```
- $ npx autoprefixer --info
- Browsers:
- Edge: 16
-
- These browsers account for 0.26% of all users globally
-
- At-Rules:
- @viewport: ms
-
- Selectors:
- ::placeholder: ms
-
- Properties:
- appearance: webkit
- flow-from: ms
- flow-into: ms
- hyphens: ms
- overscroll-behavior: ms
- region-fragment: ms
- scroll-snap-coordinate: ms
- scroll-snap-destination: ms
- scroll-snap-points-x: ms
- scroll-snap-points-y: ms
- scroll-snap-type: ms
- text-size-adjust: ms
- text-spacing: ms
- user-select: ms
- ```
-
- JS API is also available:
-
- ```js
- console.log(autoprefixer().info())
- ```
-
- ## Security Contact
-
- To report a security vulnerability, please use the [Tidelift security contact].
- Tidelift will coordinate the fix and disclosure.
-
- [Tidelift security contact]: https://tidelift.com/security
-
- ## For Enterprise
-
- Available as part of the Tidelift Subscription.
-
- The maintainers of `autoprefixer` and thousands of other packages are working
- with Tidelift to deliver commercial support and maintenance for the open source
- dependencies you use to build your applications. Save time, reduce risk,
- and improve code health, while paying the maintainers of the exact dependencies
- you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-autoprefixer?utm_source=npm-autoprefixer&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)
|