
JSS is a very thin layer which compiles JSON structures to CSS.
Take a look at "The important parts" and slides.
By leveraging namespaces we can solve the cascading problem better than bem and make our components truly reusable and composable.
Why do we need transpilers like sass or stylus when we can use javascript to do the same and much more?
Access css declarations and values from js without DOM round trip.
Smaller footprint because of code reuse and no vendor specific declarations
Working examples directory.
{
carouselCaption: {
extend: something,
position: 'absolute',
zIndex: 10,
'&:hover': {
background: 'red'
}
},
hr: {
height: 1,
border: 0,
borderTop: '1px solid #eee'
}
}{
button: {
width: 100
},
'@media (min-width: 1024px)': {
button: {
width: 200
}
}
}Jss styles are just plain javascript objects. They map 1:1 to css rules, except of those modified by plugins.
Some of those plugins:
- Nested rules is implemented through jss-nested plugin. Also you can do pseudo selectors like
:hovervia nested rules. - Use
extendproperty to inherit from some plain rule object, via jss-extend - Vendor prefixes are automatically added through jss-vendor-prefixer plugin.
- You can use camel cased css property names through jss-camel-case plugin.
- Add 'px' automatically to non numeric values using jss-px
- jss-nested
- jss-extend
- jss-px
- jss-camel-case
- jss-vendor-prefixer
- jss-props-sort
Register plugin.
jss.use(fn)
Passed function will be invoked with Rule instance. Take a look at plugins like extend, nested or vendorPrefixer.
jss.use(function(rule) {
// Your modifier.
})I recommend to not to use this if you use jss on the client. Instead you should write a function, which makes a test for this feature support and generates just one final declaration.
In case you are using jss as a server side precompiler, you might want to have more than one property with identical name. This is not possible in js, but you can use an array.
{
'.container': {
background: [
'red',
'-moz-linear-gradient(left, red 0%, green 100%)',
'-webkit-linear-gradient(left, red 0%, green 100%)',
'-o-linear-gradient(left, red 0%, green 100%)',
'-ms-linear-gradient(left, red 0%, green 100%)',
'linear-gradient(to right, red 0%, green 100%)'
]
}
}.container {
background: red;
background: -moz-linear-gradient(left, red 0%, green 100%);
background: -webkit-linear-gradient(left, red 0%, green 100%);
background: -o-linear-gradient(left, red 0%, green 100%);
background: -ms-linear-gradient(left, red 0%, green 100%);
background: linear-gradient(to right, red 0%, green 100%);
}// Pure js
var jss = window.jss
// Commonjs
var jss = require('jss')Use an own instance if the component you build should be reusable within a different project with a probably different JSS setup.
jss.create()
var jss = require('jss').create()
jss.use(somePlugin)
jss.createStyleSheet(...)Create a style sheet with namespaced rules.
jss.createStyleSheet([rules], [options])
Options:
mediastyle element attributetitlestyle element attributetypestyle element attributenamedtrue by default - keys are names, selectors will be generated, if false - keys are global selectors.linklink jssRuleinstances with DOMCSSRuleinstances so that styles, can be modified dynamically, false by default because it has some performance cost.
var sheet = jss.createStyleSheet({
// Namespaced style sheet with generated selectors.
myButton: {
width: '100px',
height: '100px'
}
}, {media: 'print'}).attach()
console.log(sheet.classes.myButton) // .jss-0<style media="print">
.jss-0 {
width: 100px;
height: 100px;
}
</style>var sheet = jss.createStyleSheet({
'.something': {
width: '100px',
height: '100px'
}
}, {named: false}).attach()<style>
.something {
width: 100px;
height: 100px;
}
</style>sheet.attach()
Insert style sheet into the render tree. You need to call it in order to make your style sheet visible for the layout.
sheet.detach()
Detaching unsused style sheets will speedup every DOM node insertion and manipulation as the browser will have to do less lookups for css rules potentially to be applied to the element.
sheet.addRule([selector], rule)
Returns an array of rules, because you might have a nested rule in your style.
var rules = sheet.addRule({
padding: '20px',
background: 'blue'
})
document.body.innerHTML = '<button class="' + rules[0].className + '">Button</button>'var rules = sheet.addRule('.my-button', {
padding: '20px',
background: 'blue'
})sheet.getRule(name)
Access a rule within sheet by selector or name.
// Using name, if named rule was added.
var rule = sheet.getRule('myButton')
// Using selector
var rule = sheet.getRule('.my-button')sheet.addRules(rules)
In case you want to add rules to the sheet separately or even at runtime.
sheet.addRules({
myButton: {
float: 'left',
},
something: {
display: 'none'
}
})jss.createRule([selector], rule)
In order to apply styles directly to the element but still be able to use jss plugins.
var rule = jss.createRule({
padding: '20px',
background: 'blue'
})
rule.applyTo(element)rule.applyTo(element)
This is equivalent to element.style.background = 'blue' except of that you could use a rule from sheet which is already defined and can apply plugins to it. Example.
jss.createRule({
background: 'blue'
}).applyTo(element)rule.prop(name, [value])
When option link is true, after stylesheet is attached, linker saves references to CSSRule instances so that you are able to set rules properties at any time. Example.
var sheet = jss.createStyleSheet({
a: {
color: 'red'
}
}, {link: true})
// Get the color.
sheet.getRule('a').prop('color') // red
// Set the color.
sheet.getRule('a').prop('color', 'green')rule.toJSON()
Returns JSON representation of the rule. Nested rules, at-rules and array values are not supported.
sheet.toString()
If you want to get a pure CSS string from jss e.g. for preprocessing jss on the server.
var jss = require('jss')
var sheet = jss.createStyleSheet({
myButton: {
float: 'left',
}
})
console.log(sheet.toString()).jss-0 {
float: left;
}npm install jss
#or
bower install jsstylesA command line interface for JSS is also available:
npm install jss-cli -gFor more information see CLI.
-
How fast would bootstrap css lib render? I have converted bootstraps css to jss. In
bench/bootstrapfolder you will find jss and css files. You need to try more than once to have some average value.On my machine overhead is about 10-15ms.
-
Rendering jss vs. css (same styles) jsperf bench.
npm i
open test/local.htmlMIT