CSS parser for JavaScript?
Update: I previously mentioned JSCSSP, which is buggy seems to be abandoned. Obviously enough, the css module on NPM is the best:
css = require 'css'
input = '''
body {
font-family: sans-serif;
}
#thing.foo p.bar {
font-weight: bold;
}
'''
obj = css.parse input
sheet = obj.stylesheet
for rule in sheet.rules
rule.selectors = ('#XXX ' + s for s in rule.selectors)
console.log css.stringify(obj)
Output:
#XXX body {
font-family: sans-serif;
}
#XXX #thing.foo p.bar {
font-weight: bold;
}
Parsing CSS in JavaScript / jQuery
There is a CSS parser written in Javascript called JSCSSP
Parse CSS into JavaScript with selector awareness
This should be possible using some of the various npm
packages out there.
For example, the css-object-loader
package allows you to require
a .css
file, which is converted to an object with keys corresponding to the selectors, which you can then access.
p {
font-size: 14px;
}
h1 {
text-indent: 20px;
}
.centered {
width: 100%;
margin: 0 auto;
}
var selectors = require('./rules.css');
// Get the
selectors['.centered']
I've also seen SCSS destructured at import
, like:
import {btn, primary} from './btn.scss';
but unfortunately I can't remember what loaders were used to do this.
How to parse property/value pairs from a CSS text
You can try this:
let element = document.createElement("div");
element.style = "background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8\"); color:green; content:'(test)'";
console.log([...element.style]);for (name of element.style) console.log(name, ":", element.style[name]);
CSS parser/abstracter? How to convert stylesheet into object
On the client-side, a stylesheet is already an object; it gets parsed into a tree when the page loads.
Lets say you have an HTML page starting with
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<link href="/styles/global.css" rel="stylesheet" type="text/css" media="screen"/>
<link href="/styles/catalog.css" rel="stylesheet" type="text/css" media="screen"/>
<link href="/styles/banner.css" rel="stylesheet" type="text/css" media="screen"/>
and global.css
contains the lines
#page { background-color: #fff; margin-top: 20px; margin-bottom: 20px; text-align: left; width: 100%; margin-top: 20px; padding: 0px; min-width: 900px; border: none; }
#header { background-color: transparent; }
#main { background-color: transparent; margin-left: 10px; margin-right: 10px; padding: 8px 0px 8px 0px;}
#sidebar { margin-right: 12px; }
Then, in order to find what's set for background-color
of #page
, you'd need to write document.styleSheets[0].cssRules[0].style.backgroundColor
, which would return #fff
(or rgb(255, 255, 255)
on some browsers, I think).
Other useful stuff assuming the above sheets:
document.styleSheets[0].cssRules[3].cssText //"#sidebar { margin-right: 12px; }"
document.styleSheets[0].cssRules[2].selectorText //"#main"
If you had a more complex selector, like #main div.header a, #main div.header a:visited
, then the selector text property returns the entire thing, not just the first bit.
Your specific question is "How can I find out what is set in the stylesheet for a given selector". Here's one way to approximate it:
function findProperty(selector) {
rules = document.styleSheets[0].cssRules
for(i in rules) {
if(rules[i].selectorText==selector) return rules[i].cssText;
}
return false;
}
findProperty('#sidebar'); //returns "#sidebar { margin-right: 12px; }"
The thing is that the CSS tree you have access to in this way has already been parsed by the browser (hence the 'approximate' above). If you're in Firefox, you won't see any -webkit
styles because mozilla just drops them. Various browsers also tend to have their own way of displaying colors (as above; if your actual .css file has a given color set to #fff
, and you check it in JavaScript after it's parsed, you might get back #fff
, #ffffff
or rgb(255, 255, 255)
).
The above will tell you what your browser sees that CSS sheet as; if you want to know what specific ascii characters were contained in the initial .css file, the only reliable way is to look at the file itself, AFAIK.
A reference for the stylesheet object is available here.
Related Topics
Encoding Utf-8 When Exporting HTML Table to Excel
How to Set Mousemove Update Speed
Getelementbyclass().Setattribute Doesn't Work
How to Do Anything About "Repaints on Scroll" Warning in Chrome for "Overflow:Scroll" Div
Automatically Resize Text Area Based on Content
Javascript, CSS: Get Element by Style Attribute
Invert Filter Not Working on Ie and Safari
How to Convert X,Y Coordinates to an Angle
Uiwebview CSS Injection Using JavaScript
-Webkit-Tap-Highlight-Color: Rgba(0,0,0,0); on a Div
How to Put Logical Operators in Document.Queryselectorall? If So, How
Fastest Selector Method in Jquery and CSS - Id or Not
How to Make a Web Page Show Up Only Once
Syncing Column Width of Between Tables in Two Different Frames, etc
Link on Certain Position of an Image Background Which Is Responsive