UNPKG

31.5 kBMarkdownView Raw
1# Autoprefixer [![Cult Of Martians][cult-img]][cult]
2
3<img align="right" width="94" height="71"
4 src="http://postcss.github.io/autoprefixer/logo.svg"
5 title="Autoprefixer logo by Anton Lovchikov">
6
7[PostCSS] plugin to parse CSS and add vendor prefixes to CSS rules using values
8from [Can I Use]. It is [recommended] by Google and used in Twitter and Alibaba.
9
10Write your CSS rules without vendor prefixes (in fact, forget about them
11entirely):
12
13```css
14::placeholder {
15 color: gray;
16}
17
18.image {
19 background-image: url(image@1x.png);
20}
21@media (min-resolution: 2dppx) {
22 .image {
23 background-image: url(image@2x.png);
24 }
25}
26```
27
28Autoprefixer will use the data based on current browser popularity and property
29support to apply prefixes for you. You can try the [interactive demo]
30of Autoprefixer.
31
32```css
33::-moz-placeholder {
34 color: gray;
35}
36:-ms-input-placeholder {
37 color: gray;
38}
39::placeholder {
40 color: gray;
41}
42
43.image {
44 background-image: url(image@1x.png);
45}
46@media (-webkit-min-device-pixel-ratio: 2),
47 (min-resolution: 2dppx) {
48 .image {
49 background-image: url(image@2x.png);
50 }
51}
52```
53
54Twitter account for news and releases: [@autoprefixer].
55
56<a href="https://evilmartians.com/?utm_source=autoprefixer">
57<img src="https://evilmartians.com/badges/sponsored-by-evil-martians.svg" alt="Sponsored by Evil Martians" width="236" height="54">
58</a>
59
60[interactive demo]: https://autoprefixer.github.io/
61[@autoprefixer]: https://twitter.com/autoprefixer
62[recommended]: https://developers.google.com/web/tools/setup/setup-buildtools#dont_trip_up_with_vendor_prefixes
63[Can I Use]: https://caniuse.com/
64[cult-img]: http://cultofmartians.com/assets/badges/badge.svg
65[PostCSS]: https://github.com/postcss/postcss
66[cult]: http://cultofmartians.com/tasks/autoprefixer-grid.html
67
68
69## Contents
70
71* [Contents](#contents)
72* [Browsers](#browsers)
73* [FAQ](#faq)
74 * [Does Autoprefixer polyfill Grid Layout for IE?](#does-autoprefixer-polyfill-grid-layout-for-ie)
75 * [Does it add polyfills?](#does-it-add-polyfills)
76 * [Why doesn’t Autoprefixer add prefixes to `border-radius`?](#why-doesnt-autoprefixer-add-prefixes-to-border-radius)
77 * [Why does Autoprefixer use unprefixed properties in `@-webkit-keyframes`?](#why-does-autoprefixer-use-unprefixed-properties-in--webkit-keyframes)
78 * [How to work with legacy `-webkit-` only code?](#how-to-work-with-legacy--webkit--only-code)
79 * [Does Autoprefixer add `-epub-` prefix?](#does-autoprefixer-add--epub--prefix)
80 * [Why doesn’t Autoprefixer transform generic font-family `system-ui`?](#why-doesnt-autoprefixer-transform-generic-font-family-system-ui)
81* [Usage](#usage)
82 * [Gulp](#gulp)
83 * [Webpack](#webpack)
84 * [CSS-in-JS](#css-in-js)
85 * [CLI](#cli)
86 * [Other Build Tools](#other-build-tools)
87 * [Preprocessors](#preprocessors)
88 * [GUI Tools](#gui-tools)
89 * [JavaScript](#javascript)
90 * [Text Editors and IDE](#text-editors-and-ide)
91* [Warnings](#warnings)
92* [Disabling](#disabling)
93 * [Prefixes](#prefixes)
94 * [Features](#features)
95 * [Control Comments](#control-comments)
96* [Options](#options)
97* [Environment Variables](#environment-variables)
98 * [Using environment variables to support CSS Grid prefixes in Create React App](#using-environment-variables-to-support-css-grid-prefixes-in-create-react-app)
99* [Grid Autoplacement support in IE](#grid-autoplacement-support-in-ie)
100 * [Beware of enabling autoplacement in old projects](#beware-of-enabling-autoplacement-in-old-projects)
101 * [Autoplacement limitations](#autoplacement-limitations)
102 * [Both columns and rows must be defined](#both-columns-and-rows-must-be-defined)
103 * [Repeat auto-fit and auto-fill are not supported](#repeat-auto-fit-and-auto-fill-are-not-supported)
104 * [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)
105 * [Do not create `::before` and `::after` pseudo elements](#do-not-create-before-and-after-pseudo-elements)
106 * [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)
107* [Debug](#debug)
108* [Security Contact](#security-contact)
109* [For Enterprise](#for-enterprise)
110
111## Browsers
112
113Autoprefixer uses [Browserslist], so you can specify the browsers
114you want to target in your project with queries like `> 5%`
115(see [Best Practices]).
116
117The best way to provide browsers is a `.browserslistrc` file in your project
118root, or by adding a `browserslist` key to your `package.json`.
119
120We recommend the use of these options over passing options to Autoprefixer so
121that the config can be shared with other tools such as [babel-preset-env] and
122[Stylelint].
123
124See [Browserslist docs] for queries, browser names, config format, and defaults.
125
126[Browserslist docs]: https://github.com/browserslist/browserslist#queries
127[babel-preset-env]: https://github.com/babel/babel/tree/master/packages/babel-preset-env
128[Best Practices]: https://github.com/browserslist/browserslist#best-practices
129[Browserslist]: https://github.com/browserslist/browserslist
130[Stylelint]: https://stylelint.io/
131
132
133## FAQ
134
135### Does Autoprefixer polyfill Grid Layout for IE?
136
137Autoprefixer can be used to translate modern CSS Grid syntax into IE 10
138and IE 11 syntax, but this polyfill will not work in 100% of cases.
139This is why it is disabled by default.
140
141First, you need to enable Grid prefixes by using either the `grid: "autoplace"`
142option or the `/* autoprefixer grid: autoplace */` control comment.
143Also you can use environment variable to enable Grid:
144`AUTOPREFIXER_GRID=autoplace npm build`.
145
146Second, you need to test every fix with Grid in IE. It is not an enable and
147forget feature, but it is still very useful.
148Financial Times and Yandex use it in production.
149
150Third, there is only very limited auto placement support. Read the
151[Grid Autoplacement support in IE](#grid-autoplacement-support-in-ie) section
152for more details.
153
154Fourth, if you are not using the autoplacement feature, the best way
155to use Autoprefixer is by using `grid-template` or `grid-template-areas`.
156
157```css
158.page {
159 display: grid;
160 grid-gap: 33px;
161 grid-template:
162 "head head head" 1fr
163 "nav main main" minmax(100px, 1fr)
164 "nav foot foot" 2fr /
165 1fr 100px 1fr;
166}
167.page__head {
168 grid-area: head;
169}
170.page__nav {
171 grid-area: nav;
172}
173.page__main {
174 grid-area: main;
175}
176.page__footer {
177 grid-area: foot;
178}
179```
180
181See also:
182
183* [The guide about Grids in IE and Autoprefixer].
184* [`postcss-gap-properties`] to use new `gap` property
185 instead of old `grid-gap`.
186* [`postcss-grid-kiss`] has alternate “everything in one property” syntax,
187 which makes using Autoprefixer’s Grid translations safer.
188
189[The guide about Grids in IE and Autoprefixer]: https://css-tricks.com/css-grid-in-ie-css-grid-and-the-new-autoprefixer/
190[`postcss-gap-properties`]: https://github.com/jonathantneal/postcss-gap-properties
191[`postcss-grid-kiss`]: https://github.com/sylvainpolletvillard/postcss-grid-kiss
192
193
194### Does it add polyfills?
195
196No. Autoprefixer only adds prefixes.
197
198Most new CSS features will require client side JavaScript to handle a new
199behavior correctly.
200
201Depending on what you consider to be a “polyfill”, you can take a look at some
202other tools and libraries. If you are just looking for syntax sugar,
203you might take a look at:
204
205- [postcss-preset-env] is a plugins preset with polyfills and Autoprefixer
206 to write future CSS today.
207- [Oldie], a PostCSS plugin that handles some IE hacks (opacity, rgba, etc).
208- [postcss-flexbugs-fixes], a PostCSS plugin to fix flexbox issues.
209
210[postcss-flexbugs-fixes]: https://github.com/luisrudge/postcss-flexbugs-fixes
211[postcss-preset-env]: https://github.com/jonathantneal/postcss-preset-env
212[Oldie]: https://github.com/jonathantneal/oldie
213
214
215### Why doesn’t Autoprefixer add prefixes to `border-radius`?
216
217Developers are often surprised by how few prefixes are required today.
218If Autoprefixer doesn’t add prefixes to your CSS, check if they’re still
219required on [Can I Use].
220
221[Can I Use]: https://caniuse.com/
222
223
224### Why does Autoprefixer use unprefixed properties in `@-webkit-keyframes`?
225
226Browser teams can remove some prefixes before others, so we try to use all
227combinations of prefixed/unprefixed values.
228
229
230### How to work with legacy `-webkit-` only code?
231
232Autoprefixer needs unprefixed property to add prefixes. So if you only
233wrote `-webkit-gradient` without W3C’s `gradient`,
234Autoprefixer will not add other prefixes.
235
236But [PostCSS] has plugins to convert CSS to unprefixed state.
237Use [postcss-unprefix] before Autoprefixer.
238
239[postcss-unprefix]: https://github.com/gucong3000/postcss-unprefix
240
241
242### Does Autoprefixer add `-epub-` prefix?
243
244No, Autoprefixer works only with browsers prefixes from Can I Use.
245But you can use [postcss-epub] for prefixing ePub3 properties.
246
247[postcss-epub]: https://github.com/Rycochet/postcss-epub
248
249
250### Why doesn’t Autoprefixer transform generic font-family `system-ui`?
251
252`system-ui` is technically not a prefix and the transformation is not
253future-proof. You can use [postcss-font-family-system-ui] to transform
254`system-ui` to a practical font-family list.
255
256[postcss-font-family-system-ui]: https://github.com/JLHwung/postcss-font-family-system-ui
257
258
259## Usage
260
261### Gulp
262
263In Gulp you can use [gulp-postcss] with `autoprefixer` npm package.
264
265```js
266gulp.task('autoprefixer', () => {
267 const autoprefixer = require('autoprefixer')
268 const sourcemaps = require('gulp-sourcemaps')
269 const postcss = require('gulp-postcss')
270
271 return gulp.src('./src/*.css')
272 .pipe(sourcemaps.init())
273 .pipe(postcss([ autoprefixer() ]))
274 .pipe(sourcemaps.write('.'))
275 .pipe(gulp.dest('./dest'))
276})
277```
278
279With `gulp-postcss` you also can combine Autoprefixer
280with [other PostCSS plugins].
281
282[gulp-postcss]: https://github.com/postcss/gulp-postcss
283[other PostCSS plugins]: https://github.com/postcss/postcss#plugins
284
285
286### Webpack
287
288In [webpack] you can use [postcss-loader] with `autoprefixer`
289and [other PostCSS plugins].
290
291```js
292module.exports = {
293 module: {
294 rules: [
295 {
296 test: /\.css$/,
297 use: ["style-loader", "css-loader", "postcss-loader"]
298 }
299 ]
300 }
301}
302```
303
304And create a `postcss.config.js` with:
305
306```js
307module.exports = {
308 plugins: [
309 require('autoprefixer')
310 ]
311}
312```
313
314[other PostCSS plugins]: https://github.com/postcss/postcss#plugins
315[postcss-loader]: https://github.com/postcss/postcss-loader
316[webpack]: https://webpack.js.org/
317
318
319### CSS-in-JS
320
321The best way to use PostCSS with CSS-in-JS is [`astroturf`].
322Add its loader to your `webpack.config.js`:
323
324```js
325module.exports = {
326 module: {
327 rules: [
328 {
329 test: /\.css$/,
330 use: ['style-loader', 'postcss-loader'],
331 },
332 {
333 test: /\.jsx?$/,
334 use: ['babel-loader', 'astroturf/loader'],
335 }
336 ]
337 }
338}
339```
340
341Then create `postcss.config.js`:
342
343```js
344module.exports = {
345 plugins: [
346 require('autoprefixer')
347 ]
348}
349```
350
351[`astroturf`]: https://github.com/4Catalyzer/astroturf
352
353
354### CLI
355
356You can use the [postcss-cli] to run Autoprefixer from CLI:
357
358```sh
359npm install postcss-cli autoprefixer
360npx postcss *.css --use autoprefixer -d build/
361```
362
363See `postcss -h` for help.
364
365[postcss-cli]: https://github.com/postcss/postcss-cli
366
367
368### Other Build Tools
369
370* **Grunt:** [grunt-postcss]
371* **Ruby on Rails**: [autoprefixer-rails]
372* **Neutrino**: [neutrino-middleware-postcss]
373* **Jekyll**: add `autoprefixer-rails` and `jekyll-assets` to `Gemfile`
374* **Brunch**: [postcss-brunch]
375* **Broccoli**: [broccoli-postcss]
376* **Middleman**: [middleman-autoprefixer]
377* **Mincer**: add `autoprefixer` npm package and enable it:
378 `environment.enable('autoprefixer')`
379
380[neutrino-middleware-postcss]: https://www.npmjs.com/package/neutrino-middleware-postcss
381[middleman-autoprefixer]: https://github.com/middleman/middleman-autoprefixer
382[autoprefixer-rails]: https://github.com/ai/autoprefixer-rails
383[broccoli-postcss]: https://github.com/jeffjewiss/broccoli-postcss
384[postcss-brunch]: https://github.com/iamvdo/postcss-brunch
385[grunt-postcss]: https://github.com/C-Lodder/grunt-postcss
386
387
388#### Preprocessors
389
390* **Less**: [less-plugin-autoprefix]
391* **Stylus**: [autoprefixer-stylus]
392* **Compass**: [autoprefixer-rails#compass]
393
394[less-plugin-autoprefix]: https://github.com/less/less-plugin-autoprefix
395[autoprefixer-stylus]: https://github.com/jenius/autoprefixer-stylus
396[autoprefixer-rails#compass]: https://github.com/ai/autoprefixer-rails#compass
397
398
399#### GUI Tools
400
401* [CodeKit](https://codekitapp.com/help/autoprefixer/)
402* [Prepros](https://prepros.io)
403
404
405### JavaScript
406
407You can use Autoprefixer with [PostCSS] in your Node.js application
408or if you want to develop an Autoprefixer plugin for a new environment.
409
410```js
411const autoprefixer = require('autoprefixer')
412const postcss = require('postcss')
413
414postcss([ autoprefixer ]).process(css).then(result => {
415 result.warnings().forEach(warn => {
416 console.warn(warn.toString())
417 })
418 console.log(result.css)
419})
420```
421
422There is also a [standalone build] for the browser or for a non-Node.js runtime.
423
424You can use [html-autoprefixer] to process HTML with inlined CSS.
425
426[html-autoprefixer]: https://github.com/RebelMail/html-autoprefixer
427[standalone build]: https://raw.github.com/ai/autoprefixer-rails/master/vendor/autoprefixer.js
428[PostCSS]: https://github.com/postcss/postcss
429
430
431### Text Editors and IDE
432
433Autoprefixer should be used in assets build tools. Text editor plugins are not
434a good solution, because prefixes decrease code readability and you will need
435to change values in all prefixed properties.
436
437I recommend you to learn how to use build tools like [Parcel].
438They work much better and will open you a whole new world of useful plugins
439and automation.
440
441If you can’t move to a build tool, you can use text editor plugins:
442
443* [Visual Studio Code](https://github.com/mrmlnc/vscode-autoprefixer)
444* [Atom Editor](https://github.com/sindresorhus/atom-autoprefixer)
445* [Sublime Text](https://github.com/sindresorhus/sublime-autoprefixer)
446* [Brackets](https://github.com/mikaeljorhult/brackets-autoprefixer)
447
448[Parcel]: https://parceljs.org/
449
450
451## Warnings
452
453Autoprefixer uses the [PostCSS warning API] to warn about really important
454problems in your CSS:
455
456* Old direction syntax in gradients.
457* Old unprefixed `display: box` instead of `display: flex`
458 by latest specification version.
459
460You can get warnings from `result.warnings()`:
461
462```js
463result.warnings().forEach(warn => {
464 console.warn(warn.toString())
465})
466```
467
468Every Autoprefixer runner should display these warnings.
469
470[PostCSS warning API]: http://api.postcss.org/Warning.html
471
472
473## Disabling
474
475### Prefixes
476
477Autoprefixer was designed to have no interface – it just works.
478If you need some browser specific hack just write a prefixed property
479after the unprefixed one.
480
481```css
482a {
483 transform: scale(0.5);
484 -moz-transform: scale(0.6);
485}
486```
487
488If some prefixes were generated incorrectly, please create an [issue on GitHub].
489
490[issue on GitHub]: https://github.com/postcss/autoprefixer/issues
491
492
493### Features
494
495You can use these plugin options to control some of Autoprefixer’s features.
496
497* `grid: "autoplace"` will enable `-ms-` prefixes for Grid Layout including some
498 [limited autoplacement support](#grid-autoplacement-support-in-ie).
499* `supports: false` will disable `@supports` parameters prefixing.
500* `flexbox: false` will disable flexbox properties prefixing.
501 Or `flexbox: "no-2009"` will add prefixes only for final and IE
502 versions of specification.
503* `remove: false` will disable cleaning outdated prefixes.
504
505You should set them inside the plugin like so:
506
507```js
508autoprefixer({ grid: 'autoplace' })
509```
510
511
512### Control Comments
513
514If you do not need Autoprefixer in some part of your CSS,
515you can use control comments to disable Autoprefixer.
516
517```css
518.a {
519 transition: 1s; /* will be prefixed */
520}
521
522.b {
523 /* autoprefixer: off */
524 transition: 1s; /* will not be prefixed */
525}
526
527.c {
528 /* autoprefixer: ignore next */
529 transition: 1s; /* will not be prefixed */
530 mask: url(image.png); /* will be prefixed */
531}
532```
533
534There are three types of control comments:
535
536* `/* autoprefixer: (on|off) */`: enable/disable all Autoprefixer translations for the
537 whole block both *before* and *after* the comment.
538* `/* autoprefixer: ignore next */`: disable Autoprefixer only for the next property
539 or next rule selector or at-rule parameters (but not rule/at‑rule body).
540* `/* autoprefixer grid: (autoplace|no-autoplace|off) */`: control how Autoprefixer handles
541 grid translations for the whole block:
542 * `autoplace`: enable grid translations with autoplacement support.
543 * `no-autoplace`: enable grid translations with autoplacement
544 support *disabled* (alias for deprecated value `on`).
545 * `off`: disable all grid translations.
546
547You can also use comments recursively:
548
549```css
550/* autoprefixer: off */
551@supports (transition: all) {
552 /* autoprefixer: on */
553 a {
554 /* autoprefixer: off */
555 }
556}
557```
558
559Note that comments that disable the whole block should not be featured in the same
560block twice:
561
562```css
563/* How not to use block level control comments */
564
565.do-not-do-this {
566 /* autoprefixer: off */
567 transition: 1s;
568 /* autoprefixer: on */
569 transform: rotate(20deg);
570}
571```
572
573
574## Options
575
576Function `autoprefixer(options)` returns a new PostCSS plugin.
577See [PostCSS API] for plugin usage documentation.
578
579```js
580autoprefixer({ cascade: false })
581```
582
583Available options are:
584
585* `env` (string): environment for Browserslist.
586* `cascade` (boolean): should Autoprefixer use Visual Cascade,
587 if CSS is uncompressed. Default: `true`
588* `add` (boolean): should Autoprefixer add prefixes. Default is `true`.
589* `remove` (boolean): should Autoprefixer [remove outdated] prefixes.
590 Default is `true`.
591* `supports` (boolean): should Autoprefixer add prefixes for `@supports`
592 parameters. Default is `true`.
593* `flexbox` (boolean|string): should Autoprefixer add prefixes for flexbox
594 properties. With `"no-2009"` value Autoprefixer will add prefixes only
595 for final and IE 10 versions of specification. Default is `true`.
596* `grid` (false|`"autoplace"`|`"no-autoplace"`): should Autoprefixer
597 add IE 10-11 prefixes for Grid Layout properties?
598 * `false` (default): prevent Autoprefixer from outputting
599 CSS Grid translations.
600 * `"autoplace"`: enable Autoprefixer grid translations
601 and *include* autoplacement support. You can also use
602 `/* autoprefixer grid: autoplace */` in your CSS.
603 * `"no-autoplace"`: enable Autoprefixer grid translations
604 but *exclude* autoplacement support. You can also use
605 `/* autoprefixer grid: no-autoplace */` in your CSS.
606 (alias for the deprecated `true` value)
607* `stats` (object): custom [usage statistics] for `> 10% in my stats`
608 browsers query.
609* `overrideBrowserslist` (array): list of queries for target browsers.
610 Try to not use it. The best practice is to use `.browserslistrc` config
611 or `browserslist` key in `package.json` to share target browsers
612 with Babel, ESLint and Stylelint. See [Browserslist docs]
613 for available queries and default value.
614* `ignoreUnknownVersions` (boolean): do not raise error on unknown browser
615 version in Browserslist config. Default is `false`.
616
617Plugin object has `info()` method for debugging purpose.
618
619You can use PostCSS processor to process several CSS files
620to increase performance.
621
622[usage statistics]: https://github.com/browserslist/browserslist#custom-usage-data
623[PostCSS API]: http://api.postcss.org
624
625## Environment Variables
626
627* `AUTOPREFIXER_GRID`: (`autoplace`|`no-autoplace`) should Autoprefixer
628 add IE 10-11 prefixes for Grid Layout properties?
629 * `autoplace`: enable Autoprefixer grid translations
630 and *include* autoplacement support.
631 * `no-autoplace`: enable Autoprefixer grid translations
632 but *exclude* autoplacement support.
633
634Environment variables are useful, when you want to change Autoprefixer options but don't have access to config files.
635[Create React App] is a good example of this.
636
637[Create React App]: (https://reactjs.org/docs/create-a-new-react-app.html#create-react-app)
638
639### Using environment variables to support CSS Grid prefixes in Create React App
640
6411. Install the latest version of Autoprefixer and [cross-env](https://www.npmjs.com/package/cross-env):
642
643```
644npm install autoprefixer@latest cross-env --save-dev
645```
646
6472. Under `"browserslist"` > `"development"` in the package.json file, add `"last 1 ie version"`
648
649```
650"browserslist": {
651 "production": [
652 ">0.2%",
653 "not dead",
654 "not op_mini all"
655 ],
656 "development": [
657 "last 1 chrome version",
658 "last 1 firefox version",
659 "last 1 safari version",
660 "last 1 ie version"
661 ]
662}
663```
664
6653. Update `"scripts"` in the package.json file to the following:
666
667```
668"scripts": {
669 "start": "cross-env AUTOPREFIXER_GRID=autoplace react-scripts start",
670 "build": "cross-env AUTOPREFIXER_GRID=autoplace react-scripts build",
671 "test": "cross-env AUTOPREFIXER_GRID=autoplace react-scripts test",
672 "eject": "react-scripts eject"
673},
674```
675
676Replace `autoplace` with `no-autoplace` in the above example if you prefer to disable Autoprefixer Grid autoplacement support.
677
678Now when you run `npm start` you will see CSS Grid prefixes automatically being applied to your output CSS.
679
680See also [Browserslist environment variables] for more examples on how to use environment variables in your project.
681
682[Browserslist environment variables]: https://github.com/browserslist/browserslist#environment-variables
683
684## Grid Autoplacement support in IE
685
686If the `grid` option is set to `"autoplace"`, limited autoplacement support is added to Autoprefixers grid translations. You can also use
687the `/* autoprefixer grid: autoplace */` control comment or
688`AUTOPREFIXER_GRID=autoplace npm build` environment variable.
689
690Autoprefixer will only autoplace grid cells if both `grid-template-rows`
691and `grid-template-columns` has been set. If `grid-template`
692or `grid-template-areas` has been set, Autoprefixer will use area based
693cell placement instead.
694
695Autoprefixer supports autoplacement by using `nth-child` CSS selectors.
696It creates [number of columns] x [number of rows] `nth-child` selectors.
697For this reason Autoplacement is only supported within the explicit grid.
698
699```css
700/* Input CSS */
701
702/* autoprefixer grid: autoplace */
703
704.autoplacement-example {
705 display: grid;
706 grid-template-columns: 1fr 1fr;
707 grid-template-rows: auto auto;
708 grid-gap: 20px;
709}
710```
711
712```css
713/* Output CSS */
714
715/* autoprefixer grid: autoplace */
716
717.autoplacement-example {
718 display: -ms-grid;
719 display: grid;
720 -ms-grid-columns: 1fr 20px 1fr;
721 grid-template-columns: 1fr 1fr;
722 -ms-grid-rows: auto 20px auto;
723 grid-template-rows: auto auto;
724 grid-gap: 20px;
725}
726
727.autoplacement-example > *:nth-child(1) {
728 -ms-grid-row: 1;
729 -ms-grid-column: 1;
730}
731
732.autoplacement-example > *:nth-child(2) {
733 -ms-grid-row: 1;
734 -ms-grid-column: 3;
735}
736
737.autoplacement-example > *:nth-child(3) {
738 -ms-grid-row: 3;
739 -ms-grid-column: 1;
740}
741
742.autoplacement-example > *:nth-child(4) {
743 -ms-grid-row: 3;
744 -ms-grid-column: 3;
745}
746```
747
748### Beware of enabling autoplacement in old projects
749
750Be careful about enabling autoplacement in any already established projects that have
751previously not used Autoprefixer's grid autoplacement feature before.
752
753If this was your html:
754
755```html
756<div class="grid">
757 <div class="grid-cell"></div>
758</div>
759```
760
761The following CSS will not work as expected with the autoplacement feature enabled:
762
763```css
764/* Unsafe CSS when Autoplacement is enabled */
765
766.grid-cell {
767 grid-column: 2;
768 grid-row: 2;
769}
770
771.grid {
772 display: grid;
773 grid-template-columns: repeat(3, 1fr);
774 grid-template-rows: repeat(3, 1fr);
775}
776```
777
778Swapping the rules around will not fix the issue either:
779
780```css
781/* Also unsafe to use this CSS */
782
783.grid {
784 display: grid;
785 grid-template-columns: repeat(3, 1fr);
786 grid-template-rows: repeat(3, 1fr);
787}
788
789.grid-cell {
790 grid-column: 2;
791 grid-row: 2;
792}
793```
794
795One way to deal with this issue is to disable autoplacement in the
796grid-declaration rule:
797
798```css
799/* Disable autoplacement to fix the issue */
800
801.grid {
802 /* autoprefixer grid: no-autoplace */
803 display: grid;
804 grid-template-columns: repeat(3, 1fr);
805 grid-template-rows: repeat(3, 1fr);
806}
807
808.grid-cell {
809 grid-column: 2;
810 grid-row: 2;
811}
812```
813
814The absolute best way to integrate autoplacement into already existing projects
815though is to leave autoplacement turned off by default and then use a control
816comment to enable it when needed. This method is far less likely to cause
817something on the site to break.
818
819```css
820/* Disable autoplacement by default in old projects */
821/* autoprefixer grid: no-autoplace */
822
823/* Old code will function the same way it always has */
824.old-grid {
825 display: grid;
826 grid-template-columns: repeat(3, 1fr);
827 grid-template-rows: repeat(3, 1fr);
828}
829.old-grid-cell {
830 grid-column: 2;
831 grid-row: 2;
832}
833
834/* Enable autoplacement when you want to use it in new code */
835.new-autoplace-friendly-grid {
836 /* autoprefixer grid: autoplace */
837 display: grid;
838 grid-template-columns: repeat(3, 1fr);
839 grid-template-rows: repeat(3, auto);
840}
841```
842
843Note that the `grid: "no-autoplace"` setting and the
844`/* autoprefixer grid: no-autoplace */` control comment share identical
845functionality to the `grid: true` setting and the `/* autoprefixer grid: on */`
846control comment. There is no need to refactor old code to use `no-autoplace`
847in place of the old `true` and `on` statements.
848
849### Autoplacement limitations
850
851#### Both columns and rows must be defined
852
853Autoplacement only works inside the explicit grid. The columns and rows need to be defined
854so that Autoprefixer knows how many `nth-child` selectors to generate.
855
856```css
857.not-allowed {
858 display: grid;
859 grid-template-columns: repeat(3, 1fr);
860}
861
862.is-allowed {
863 display: grid;
864 grid-template-columns: repeat(3, 1fr);
865 grid-template-rows: repeat(10, auto);
866}
867```
868
869#### Repeat auto-fit and auto-fill are not supported
870
871The `repeat(auto-fit, ...)` and `repeat(auto-fill, ...)` grid functionality relies on
872knowledge from the browser about screen dimensions and the number of available grid
873items for it to work properly. Autoprefixer does not have access to this information
874so unfortunately this little snippet will _never_ be IE friendly.
875
876```css
877.grid {
878 /* This will never be IE friendly */
879 grid-template-columns: repeat(auto-fit, min-max(200px, 1fr))
880}
881```
882
883#### No manual cell placement or column/row spans allowed inside an autoplacement grid
884
885Elements must not be manually placed or given column/row spans inside
886an autoplacement grid. Only the most basic of autoplacement grids are supported.
887Grid cells can still be placed manually outside the the explicit grid though.
888Support for manually placing individual grid cells inside an explicit
889autoplacement grid is planned for a future release.
890
891```css
892.autoplacement-grid {
893 display: grid;
894 grid-template-columns: repeat(3, 1fr);
895 grid-template-rows: repeat(3, auto);
896}
897
898/* Grid cells placed inside the explicit grid
899 will break the layout in IE */
900.not-permitted-grid-cell {
901 grid-column: 1;
902 grid-row: 1;
903}
904
905/* Grid cells placed outside the
906 explicit grid will work in IE */
907.permitted-grid-cell {
908 grid-column: 1 / span 2;
909 grid-row: 4;
910}
911```
912
913If manual cell placement is required, we recommend using `grid-template` or
914`grid-template-areas` instead:
915
916```css
917.page {
918 display: grid;
919 grid-gap: 30px;
920 grid-template:
921 "head head"
922 "nav main" minmax(100px, 1fr)
923 "foot foot" /
924 200px 1fr;
925}
926.page__head {
927 grid-area: head;
928}
929.page__nav {
930 grid-area: nav;
931}
932.page__main {
933 grid-area: main;
934}
935.page__footer {
936 grid-area: foot;
937}
938```
939
940#### Do not create `::before` and `::after` pseudo elements
941
942Let's say you have this HTML:
943
944```html
945<div class="grid">
946 <div class="grid-cell"></div>
947</div>
948```
949
950And you write this CSS:
951
952```css
953.grid {
954 display: grid;
955 grid-template-columns: 1fr 1fr;
956 grid-template-rows: auto;
957}
958
959.grid::before {
960 content: 'before';
961}
962
963.grid::after {
964 content: 'after';
965}
966```
967
968This will be the output:
969
970```css
971.grid {
972 display: -ms-grid;
973 display: grid;
974 -ms-grid-columns: 1fr 1fr;
975 grid-template-columns: 1fr 1fr;
976 -ms-grid-rows: auto;
977 grid-template-rows: auto;
978}
979
980.grid > *:nth-child(1) {
981 -ms-grid-row: 1;
982 -ms-grid-column: 1;
983}
984
985
986.grid > *:nth-child(2) {
987 -ms-grid-row: 1;
988 -ms-grid-column: 2;
989}
990
991.grid::before {
992 content: 'before';
993}
994
995.grid::after {
996 content: 'after';
997}
998```
999
1000IE will place `.grid-cell`, `::before` and `::after` in row 1 column 1.
1001Modern browsers on the other hand will place `::before` in row 1 column 1,
1002`.grid-cell` in row 1 column 2, and `::after` in row 2 column 1.
1003
1004See this [CodePen](https://codepen.io/daniel-tonon/pen/gBymVw) to see a visualization
1005of the issue. View the CodePen in both a modern browser and IE to see the difference.
1006
1007Note that you can still create `::before` and `::after` elements as long as you manually
1008place them outside the explicit grid.
1009
1010#### When changing the `grid gap` value, columns and rows must be re-declared
1011
1012If you wish to change the size of a `grid-gap`, you will need to redeclare the grid columns and rows.
1013
1014```css
1015.grid {
1016 display: grid;
1017 grid-template-columns: 1fr 1fr;
1018 grid-template-rows: auto;
1019 grid-gap: 50px;
1020}
1021
1022/* This will *NOT* work in IE */
1023@media (max-width: 600px) {
1024 .grid {
1025 grid-gap: 20px;
1026 }
1027}
1028
1029/* This will *NOT* work in IE */
1030.grid.small-gap {
1031 grid-gap: 20px;
1032}
1033```
1034
1035```css
1036.grid {
1037 display: grid;
1038 grid-template-columns: 1fr 1fr;
1039 grid-template-rows: auto;
1040 grid-gap: 50px;
1041}
1042
1043/* This *WILL* work in IE */
1044@media (max-width: 600px) {
1045 .grid {
1046 grid-template-columns: 1fr 1fr;
1047 grid-template-rows: auto;
1048 grid-gap: 20px;
1049 }
1050}
1051
1052/* This *WILL* work in IE */
1053.grid.small-gap {
1054 grid-template-columns: 1fr 1fr;
1055 grid-template-rows: auto;
1056 grid-gap: 20px;
1057}
1058```
1059
1060## Debug
1061
1062Run `npx autoprefixer --info` in your project directory to check
1063which browsers are selected and which properties will be prefixed:
1064
1065```
1066$ npx autoprefixer --info
1067Browsers:
1068 Edge: 16
1069
1070These browsers account for 0.26% of all users globally
1071
1072At-Rules:
1073 @viewport: ms
1074
1075Selectors:
1076 ::placeholder: ms
1077
1078Properties:
1079 appearance: webkit
1080 flow-from: ms
1081 flow-into: ms
1082 hyphens: ms
1083 overscroll-behavior: ms
1084 region-fragment: ms
1085 scroll-snap-coordinate: ms
1086 scroll-snap-destination: ms
1087 scroll-snap-points-x: ms
1088 scroll-snap-points-y: ms
1089 scroll-snap-type: ms
1090 text-size-adjust: ms
1091 text-spacing: ms
1092 user-select: ms
1093```
1094
1095JS API is also available:
1096
1097```js
1098console.log(autoprefixer().info())
1099```
1100
1101## Security Contact
1102
1103To report a security vulnerability, please use the [Tidelift security contact].
1104Tidelift will coordinate the fix and disclosure.
1105
1106[Tidelift security contact]: https://tidelift.com/security
1107
1108## For Enterprise
1109
1110Available as part of the Tidelift Subscription.
1111
1112The maintainers of `autoprefixer` and thousands of other packages are working
1113with Tidelift to deliver commercial support and maintenance for the open source
1114dependencies you use to build your applications. Save time, reduce risk,
1115and improve code health, while paying the maintainers of the exact dependencies
1116you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-autoprefixer?utm_source=npm-autoprefixer&utm_medium=referral&utm_campaign=enterprise&utm_term=repo)