What is inline-css?
The inline-css npm package is used to convert CSS styles into inline styles within HTML documents. This is particularly useful for email templates where inline styles are often required for proper rendering across different email clients.
What are inline-css's main functionalities?
Basic Inline CSS Conversion
This feature allows you to convert CSS styles defined in the <style> tag into inline styles within the HTML elements. The example demonstrates converting a simple HTML document with a <style> tag into one with inline styles.
const inlineCss = require('inline-css');
const html = '<html><head><style>h1 { color: red; }</style></head><body><h1>Hello, world!</h1></body></html>';
inlineCss(html, { url: ' ' }).then((result) => {
console.log(result);
});
Handling External CSS
This feature allows you to handle external CSS files by specifying the base URL. The example demonstrates converting an HTML document that links to an external CSS file into one with inline styles.
const inlineCss = require('inline-css');
const html = '<html><head><link rel="stylesheet" href="styles.css"></head><body><h1>Hello, world!</h1></body></html>';
inlineCss(html, { url: 'http://example.com/' }).then((result) => {
console.log(result);
});
Preserving Media Queries
This feature allows you to preserve media queries in the final HTML output. The example demonstrates converting an HTML document with media queries into one with inline styles while keeping the media queries intact.
const inlineCss = require('inline-css');
const html = '<html><head><style>@media (max-width: 600px) { h1 { color: blue; } }</style></head><body><h1>Hello, world!</h1></body></html>';
inlineCss(html, { url: ' ', preserveMediaQueries: true }).then((result) => {
console.log(result);
});
Other packages similar to inline-css
juice
Juice is another popular npm package for inlining CSS into HTML. It offers similar functionality to inline-css, including support for external stylesheets and media queries. Juice is known for its ease of use and comprehensive documentation.
premailer
Premailer is a tool that can be used to inline CSS styles in HTML documents. It is available as both a Ruby gem and an npm package. Premailer offers additional features like CSS selector support and HTML minification, making it a versatile choice for email template preparation.
email-comb
Email-comb is a package designed to clean and inline CSS for email templates. It focuses on removing unused CSS and inlining the necessary styles, ensuring that the final HTML is optimized for email clients. It is a good alternative to inline-css for those looking to optimize their email templates further.
inline-css
Inline your CSS properties into the style
attribute in an html file. Useful for emails.
Inspired by the juice library.
Features
- Uses cheerio instead of jsdom
- Works on Windows
- Preserves Doctype
- Modular
- Gets your CSS automatically through style and link tags
- Functions return A+ compliant Promises
How It Works
This module takes html and inlines the CSS properties into the style attribute.
/path/to/file.html
:
<html>
<head>
<style>
p { color: red; }
</style>
<link rel="stylesheet" href="style.css">
</head>
<body>
<p>Test</p>
</body>
</html>
style.css
p {
text-decoration: underline;
}
Output:
<html>
<head>
</head>
<body>
<p style="color: red; text-decoration: underline;">Test</p>
</body>
</html>
What is this useful for ?
- HTML emails. For a comprehensive list of supported selectors see
here
- Embedding HTML in 3rd-party websites.
- Performance. Downloading external stylesheets delays the rendering of the page in the browser. Inlining CSS speeds up this process because the browser doesn't have to wait to download an external stylesheet to start rendering the page.
Install
Install with npm
npm install --save inline-css
Usage
var inlineCss = require('inline-css');
var html = "<style>div{color:red;}</style><div/>";
inlineCss(html, options)
.then(function(html) { console.log(html); });
API
inlineCss(html, options)
Type: String
Default: ""
Extra css to apply to the file.
options.applyStyleTags
Type: Boolean
Default: true
Whether to inline styles in <style></style>
.
options.applyLinkTags
Type: Boolean
Default: true
Whether to resolve <link rel="stylesheet">
tags and inline the resulting styles.
options.removeStyleTags
Type: Boolean
Default: true
Whether to remove the original <style></style>
tags after (possibly) inlining the css from them.
options.removeLinkTags
Type: Boolean
Default: true
Whether to remove the original <link rel="stylesheet">
tags after (possibly) inlining the css from them.
options.url
Type: String
Default: filePath
How to resolve hrefs. Must be a string of one character or more. Required.
Relative urls in links will have this value prepended to them. So these links:
<a href="page-relative">Page</a>
<a href="/root-relative">Root</a>
<- note leading /
With this option:
inlineCss(html, { url: 'http://example.com/mushroom'})
.then(function(html) { console.log(html); });
Will result in
<a href="http://example.com/mushroom/page-relative">Page</a>
<a href="http://example.com/root-relative">Root</a>
If you don't need this feature, simply set the property to a short string eg {url: ' '}
(one space) and everything will work.
options.preserveMediaQueries
Type: Boolean
Default: false
Preserves all media queries (and contained styles) within <style></style>
tags as a refinement when removeStyleTags
is true
. Other styles are removed.
options.applyWidthAttributes
Type: Boolean
Default: false
Whether to use any CSS pixel widths to create width
attributes on elements.
options.applyTableAttributes
Type: Boolean
Default: false
Whether to apply the border
, cellpadding
and cellspacing
attributes to table
elements.
options.removeHtmlSelectors
Type: Boolean
Default: false
Whether to remove the class
and id
attributes from the markup.
options.codeBlocks
Type: Object
Default: { EJS: { start: '<%', end: '%>' }, HBS: { start: '{{', end: '}}' } }
An object where each value has a start
and end
to specify fenced code blocks that should be ignored during parsing and inlining. For example, Handlebars (hbs) templates are HBS: {start: '{{', end: '}}'}
. codeBlocks
can fix problems where otherwise inline-css might interpret code like <=
as HTML, when it is meant to be template language code. Note that codeBlocks
is a dictionary which can contain many different code blocks, so don't do codeBlocks: {...}
do codeBlocks.myBlock = {...}
.
cheerio options
Options to passed to cheerio.
Contributing
See the CONTRIBUTING Guidelines
License
MIT © Jonathan Kemp