Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Prefix all CSS rules with a selector

License

NotificationsYou must be signed in to change notification settings

RadValentin/postcss-prefix-selector

Repository files navigation

NPM versionTest coverageLicenseDownloadsGitpod ready-to-code

Prefix every CSS selector with a custom namespace.a => .prefix .a

Table of Contents

Install

$npm install postcss-prefix-selector

Usage with PostCSS

A prefix is added before most selectors. Below is an example of how CSS will be transformed by adding a prefix called.namespace.

constprefixer=require('postcss-prefix-selector')// css to be processedconstcss=fs.readFileSync("input.css","utf8")constout=postcss().use(prefixer({prefix:'.namespace',exclude:['.c'],})).process(css).css
/* Input */.a, .b {color: aqua;}.c {color: coral;}/* Output */.namespace .a, .namespace .b {color: aqua;}.c {color: coral;}

Please note that global selectors (html,body,:root) cannot be prefixed so instead they will be replaced with the prefix. This behaviour can be disabled with theskipGlobalSelectors option.

/* Input */:root {--bs-blue:#0d6efd; }html {padding:0; }body {margin:0; }/* Output */.namespace {--bs-blue:#0d6efd; }.namespace {padding:0; }.namespace {margin:0; }

It's also possible to customize the way prefixing is done by defining a transform function:

constout=postcss().use(prefixer({prefix:'.namespace',// Optional transform callback for case-by-case overridestransform:function(prefix,selector,prefixedSelector,filePath,rule){if(selector==='body'){return'body'+prefix;}else{returnprefixedSelector;}}})).process(css).css
/* Input */body {background: red;}/* Output */body.namespace {background: red;}

Usage with webpack

Use it like you'd use any other PostCSS plugin. If you also haveautoprefixer in your webpack config then make sure thatpostcss-prefix-selector is called first. This is needed to avoid running the prefixer twice on both standard selectors and vendor specific ones (ex:@keyframes and@webkit-keyframes).

module:{rules:[{test:/\.css$/,use:[require.resolve('style-loader'),require.resolve('css-loader'),{loader:require.resolve('postcss-loader'),options:{postcssOptions:{plugins:{"postcss-prefix-selector":{prefix:'.my-prefix',transform(prefix,selector,prefixedSelector,filePath,rule){if(selector.match(/^(html|body)/)){returnselector.replace(/^([^\s]*)/,`$1${prefix}`);}if(filePath.match(/node_modules/)){returnselector;// Do not prefix styles imported from node_modules}constannotation=rule.prev();if(annotation?.type==='comment'&&annotation.text.trim()==='no-prefix'){returnselector;// Do not prefix style rules that are preceded by: /* no-prefix */}returnprefixedSelector;},},autoprefixer:{browsers:['last 4 versions']}}}}}]}]}

Usage with Vite

Following the same way of Webpack but for Vite:

importprefixerfrom'postcss-prefix-selector';importautoprefixerfrom'autoprefixer';...exportdefaultdefineConfig({...css:{postcss:{plugins:[prefixer({prefix:'.my-prefix',transform(prefix,selector,prefixedSelector,filePath,rule){if(selector.match(/^(html|body)/)){returnselector.replace(/^([^\s]*)/,`$1${prefix}`);}if(filePath.match(/node_modules/)){returnselector;// Do not prefix styles imported from node_modules}constannotation=rule.prev();if(annotation?.type==='comment'&&annotation.text.trim()==='no-prefix'){returnselector;// Do not prefix style rules that are preceded by: /* no-prefix */}returnprefixedSelector;},}),autoprefixer({})// add options if needed],}},...});

Options

NameTypeDescription
prefixstringThis string is added before every CSS selector
excludestring[] orRegExp[]It's possible to avoid prefixing some selectors by passing an array of selectors
transformFunctionIn cases where you may want to use the prefix differently for different selectors, it is possible to pass in a custom transform method
ignoreFilesstring[] orRegExp[]List of ignored files for processing
includeFilesstring[] orRegExp[]List of included files for processing
skipGlobalSelectorsbooleanWhen enabled, global selectors (html,body,root) won't be modified by the prefixer. Default:false.

Maintainer

This project was originally created by@jongleberry and is being maintained by@RadValentin. If you have any questions, feel free to ping the latter.

Contribute

Please contribute! If you have any questions or bugs,open an issue. Or, open a pull request with a fix.

This project uses Mocha. If you submit a PR, please add appropriate tests and make sure that everything is green for your branch.

License

MIT © 2015-2024 Jonathan Ong.


[8]ページ先頭

©2009-2025 Movatter.jp