You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
198 lines
3.8 KiB
198 lines
3.8 KiB
# PostCSS Nested |
|
|
|
<img align="right" width="135" height="95" |
|
title="Philosopher’s stone, logo of PostCSS" |
|
src="https://postcss.org/logo-leftp.svg"> |
|
|
|
[PostCSS] plugin to unwrap nested rules like how Sass does it. |
|
|
|
```css |
|
.phone { |
|
&_title { |
|
width: 500px; |
|
@media (max-width: 500px) { |
|
width: auto; |
|
} |
|
body.is_dark & { |
|
color: white; |
|
} |
|
} |
|
img { |
|
display: block; |
|
} |
|
} |
|
|
|
.title { |
|
font-size: var(--font); |
|
|
|
@at-root html { |
|
--font: 16px |
|
} |
|
} |
|
``` |
|
|
|
will be processed to: |
|
|
|
```css |
|
.phone_title { |
|
width: 500px; |
|
} |
|
@media (max-width: 500px) { |
|
.phone_title { |
|
width: auto; |
|
} |
|
} |
|
body.is_dark .phone_title { |
|
color: white; |
|
} |
|
.phone img { |
|
display: block; |
|
} |
|
|
|
.title { |
|
font-size: var(--font); |
|
} |
|
html { |
|
--font: 16px |
|
} |
|
``` |
|
|
|
Related plugins: |
|
|
|
* Use [`postcss-atroot`] for `@at-root` at-rule to move nested child |
|
to the CSS root. |
|
* Use [`postcss-current-selector`] **after** this plugin if you want |
|
to use current selector in properties or variables values. |
|
* Use [`postcss-nested-ancestors`] **before** this plugin if you want |
|
to reference any ancestor element directly in your selectors with `^&`. |
|
|
|
Alternatives: |
|
|
|
* See also [`postcss-nesting`], which implements [CSSWG draft] |
|
(requires the `&` and introduces `@nest`). |
|
* [`postcss-nested-props`] for nested properties like `font-size`. |
|
|
|
<a href="https://evilmartians.com/?utm_source=postcss-nested"> |
|
<img src="https://evilmartians.com/badges/sponsored-by-evil-martians.svg" |
|
alt="Sponsored by Evil Martians" width="236" height="54"> |
|
</a> |
|
|
|
[`postcss-atroot`]: https://github.com/OEvgeny/postcss-atroot |
|
[`postcss-current-selector`]: https://github.com/komlev/postcss-current-selector |
|
[`postcss-nested-ancestors`]: https://github.com/toomuchdesign/postcss-nested-ancestors |
|
[`postcss-nested-props`]: https://github.com/jedmao/postcss-nested-props |
|
[`postcss-nesting`]: https://github.com/jonathantneal/postcss-nesting |
|
[CSSWG draft]: https://drafts.csswg.org/css-nesting-1/ |
|
[PostCSS]: https://github.com/postcss/postcss |
|
|
|
|
|
## Usage |
|
|
|
**Step 1:** Install plugin: |
|
|
|
```sh |
|
npm install --save-dev postcss postcss-nested |
|
``` |
|
|
|
**Step 2:** Check your project for existing PostCSS config: `postcss.config.js` |
|
in the project root, `"postcss"` section in `package.json` |
|
or `postcss` in bundle config. |
|
|
|
If you do not use PostCSS, add it according to [official docs] |
|
and set this plugin in settings. |
|
|
|
**Step 3:** Add the plugin to plugins list: |
|
|
|
```diff |
|
module.exports = { |
|
plugins: [ |
|
+ require('postcss-nested'), |
|
require('autoprefixer') |
|
] |
|
} |
|
``` |
|
|
|
[official docs]: https://github.com/postcss/postcss#usage |
|
|
|
|
|
## Options |
|
|
|
### `bubble` |
|
|
|
By default, plugin will bubble only `@media` and `@supports` at-rules. |
|
You can add your custom at-rules to this list by `bubble` option: |
|
|
|
```js |
|
postcss([ require('postcss-nested')({ bubble: ['phone'] }) ]) |
|
``` |
|
|
|
```css |
|
/* input */ |
|
a { |
|
color: white; |
|
@phone { |
|
color: black; |
|
} |
|
} |
|
/* output */ |
|
a { |
|
color: white; |
|
} |
|
@phone { |
|
a { |
|
color: black; |
|
} |
|
} |
|
``` |
|
|
|
|
|
### `unwrap` |
|
|
|
By default, plugin will unwrap only `@font-face`, `@keyframes` and `@document` |
|
at-rules. You can add your custom at-rules to this list by `unwrap` option: |
|
|
|
```js |
|
postcss([ require('postcss-nested')({ unwrap: ['phone'] }) ]) |
|
``` |
|
|
|
```css |
|
/* input */ |
|
a { |
|
color: white; |
|
@phone { |
|
color: black; |
|
} |
|
} |
|
/* output */ |
|
a { |
|
color: white; |
|
} |
|
@phone { |
|
color: black; |
|
} |
|
``` |
|
|
|
|
|
### `preserveEmpty` |
|
|
|
By default, plugin will strip out any empty selector generated by intermediate |
|
nesting levels. You can set `preserveEmpty` to `true` to preserve them. |
|
|
|
```css |
|
.a { |
|
.b { |
|
color: black; |
|
} |
|
} |
|
``` |
|
|
|
Will be compiled to: |
|
|
|
```css |
|
.a { } |
|
.a .b { |
|
color: black; |
|
} |
|
``` |
|
|
|
This is especially useful if you want to export the empty classes with `postcss-modules`.
|
|
|