if used in conjunction with a traditional CSS framework and you require javascript for your page, there are really no dis-advantages.
in my rich internet applications i will use traditional CSS for the initial "base" state of the application and then JSSS for all further states which are generated via JS (no page-reload)
one big drawback I'm seeing is binding styles directly to DOM elements (it will appear as style attribute).
this definitely has memory (many non-shared styles) and performance implications (may cause many reflows because you are setting styles individually) and it may interfere with existing code
I would expect this tool to generate real CSS stylesheet code and embed it into page dynamically
Have you ever looked at any open-source browser implementation?
Because of cascading nature of style definition. Data structures describing current styling form trees (for memory efficiency and easy manipulation from script). Effective styles are evaluated during rendering.
in my rich internet applications i will use traditional CSS for the initial "base" state of the application and then JSSS for all further states which are generated via JS (no page-reload)
Why not just have the dynamic style in a separate class next to the base class it's applied to and then use jQuery.addClass?
"CSS frameworks work whether or not client disable Javascript."
I've been thinking about this a lot lately and I'm not sure it's that big a concern anymore.
I did a test one day and tried to get through a day with Javascript disabled and I came to the conclusion the web simply isn't usable that way. Because these days even the simple sites require Javascript because tools like dreamweaver embed javascript for menus and other basic animations.
Until very recently, you were either all-in with Flash or you couldn't watch most video online. Now there's ClickToFlash. Similar things are happening with JS. Either way, it's a disadvantage of doing styles in pure JS.
And it's a disadvantage to using CSS if the user has disabled CSS :/ I'm not sure why that argument is relevant. Fact is, 99%+ will have CSS and JS enabled.
There's a good chunk of people using NoScript. By forcing people to use javascript, you're making the barrier of entry higher for those people.
Sometimes, when I see a page completely broken because it requires javascript, I just close the tab. If it's too much trouble to get your pages, which might only have static text or other elements that don't require anything fancy, to work without javascript, it's probably not worth my time to check out your page.
This will be SLOW. Also not having vars in CSS is a blessing in disguise: otherwise business logic would be built into the stylesheet by some genius and I would Auvergne to support it. No thanks.
2. Exactly. And this simply invites someone to put in the stylesheet.
3. Debugging CSS is already not trivial due to implementation issues. As this technique still relies on CSS you will still have some of the same issues.
4. Ability to have expressions in the stylesheets has already been tried. Once. Trust me you don't want it. Testing and debugging it is very hard.
This is different / an improvement on CSS how? You are adding extra characters (double quotes and colon) compared to plain-old css for a more bloated stylesheet that must be downloaded? That might be considered nit-picky, but the benefit here of using JSSS is not obvious (Im still trying to figure it out).
Also, the 4 line example is actually 6:
function parseCSS(id,css){
for(style in css){
if(typeof css[style] == 'object'){parseCSS(style,css[style]);
else{$(id).css(style,css[style]);}
}
};
Comments have already been made about having javascript disabled. Perhaps a <noscript> tag that would pull down REAL CSS (again, what is the point of this? I am now maintaining CSS and JSSS?) would remedy.
Unless I'm mistaken, the point is that you can modify your styles on the fly as you wish. CSS is pretty static, apart from :hover etc. With js you're free to do what you please.
Personally I prefer to use js rather than css for rich webapps.
How would you load that CSS file dynamically into your DOM?
pretend you had 1,000,000 CSS classes that could be used in your one-page JavaScript application. you cannot load all of these with <link> on page load.......too much data.....you'd have to start dynamically loading .css files using AJAX requests......and you realize that dynamically inserting a <link> tag isn't cross-browser...so you try to parse the .css file in JS.....but then you realize that you have no way of natively parsing a .css file in JavaScript.....so you find / build a .css parser.....which is slow as balls.......then you want to start manipulating these classes and have no place to access them......so you have to store them in memory somewhere....might as well use nested JSON!
pretend you didnt know what your CSS classes were going to be until run-time.....like creating dynamic DOM views based on user input.....you would have to store your CSS properties in memory regardless....might as well use nested JSON!
pretend you had an entire javascript application stack and several tools for managing JSON documents on the server and the client.....
if i'm refuting people who disagree with me....this is not my fault. i am simply responding to peoples comments and questions. i'm always open to insightful suggestions and recommendations.....
edit: also i'd like mention your comment about line numbers is kinda silly.....i could just make it one line.....its JavaScript.
i said 4 lines since it was : function declaration, for loop, if conditional one liner, else conditional one liner.......
if you are really that upset about the line number count please let me know the correct amount of line numbers and i'll be sure to update my page
A million CSS classes? Is your "rich web app" even usable if it is going to be styled a million different ways? I hope you were exaggerating with that number. Are these real problems you face or are these just examples you make up because you (I assume you are the one who designed JSSS) have a solution looking for a problem?
1,000,000 CSS classes? What web project possibly uses that many right now? Do you have a real use case in mind? Why not let the browser store and parse the CSS? That's what it is designed to do. And when the browser stores a CSS rule, it can optimise it much more than it can optimise a generic JavaScript literal.
IMHO, this is educational, but useless. CSS already does the job better and by separating your CSS files you could squeeze all the performance you need.
Of course if you can demonstrate how this could possibly be fast on modern browsers on a page with 1,000,000 CSS classes I would be very impressed.
Last: note on terminology. What you are calling JSON is actually just a JavaScript object. Try running it through JSONLint and you'll see that you need to add extra quotes around the "keys", for example.
35 comments
[ 11.3 ms ] story [ 92.0 ms ] thread(2) Many of the problems this article's thesis lays out with CSS are solveable server-side, by preprocessing CSS.
this is intended for client-side templating and dynamically assigning CSS classes and properties at run-time.
:-)
For example, on Mibbit, you can skin your client how you like. You just open a prefs screen and mess with colors, fonts, backgrounds, etc.
Using css for that would be ridiculous. Hence client side styling via js.
in my rich internet applications i will use traditional CSS for the initial "base" state of the application and then JSSS for all further states which are generated via JS (no page-reload)
this definitely has memory (many non-shared styles) and performance implications (may cause many reflows because you are setting styles individually) and it may interfere with existing code
I would expect this tool to generate real CSS stylesheet code and embed it into page dynamically
It only "appears as style attribute" if you serialize the DOM into HTML.
Because of cascading nature of style definition. Data structures describing current styling form trees (for memory efficiency and easy manipulation from script). Effective styles are evaluated during rendering.
For example look at this talk and around 11:30 the guy is describing style-related data structure in Chrome/WebKit: http://www.youtube.com/watch?v=RVnARGhhs9w
Your statement "Those style properties exist anyway" is simply not true.
Why not just have the dynamic style in a separate class next to the base class it's applied to and then use jQuery.addClass?
if i release an official parser i think it would use those methods.
the whole point is to store your CSS in JSON and parse it with JS, the libraries used to do the parsing / assigning are kinda arbitrary.
I've been thinking about this a lot lately and I'm not sure it's that big a concern anymore.
I did a test one day and tried to get through a day with Javascript disabled and I came to the conclusion the web simply isn't usable that way. Because these days even the simple sites require Javascript because tools like dreamweaver embed javascript for menus and other basic animations.
Sometimes, when I see a page completely broken because it requires javascript, I just close the tab. If it's too much trouble to get your pages, which might only have static text or other elements that don't require anything fancy, to work without javascript, it's probably not worth my time to check out your page.
2. if you cant separate your business logic from your views....you have bigger problems to deal with....
2. Exactly. And this simply invites someone to put in the stylesheet.
3. Debugging CSS is already not trivial due to implementation issues. As this technique still relies on CSS you will still have some of the same issues.
4. Ability to have expressions in the stylesheets has already been tried. Once. Trust me you don't want it. Testing and debugging it is very hard.
i'll agree with you that c++ is faster then jQuery....good day
How is that an issue and what made you think that it was a programming language?
> CSS properties are not cross-browser compatible
Neither is the DOM. Both statements are misleading because most CSS properties are cross-browser.
> CSS frameworks (haml, sass, less) are meant for server-side templating and we need client-side templating
This is a "disadvantage" of CSS frameworks, not of CSS itself.
> dynamically including .css files in the DOM does not guarantee CSS classes will be set cross-browser
Ok? Are you talking about dynamically including them client or server-side?
This site looks rather bland considering that it is promoting a stylesheet framework. Lets take a look at the stylesheet on this very site:
I guess this goes hand-in-hand with the grammar, which is also lacking.Now lets take a look at the sample styling code:
This is different / an improvement on CSS how? You are adding extra characters (double quotes and colon) compared to plain-old css for a more bloated stylesheet that must be downloaded? That might be considered nit-picky, but the benefit here of using JSSS is not obvious (Im still trying to figure it out).Also, the 4 line example is actually 6:
Comments have already been made about having javascript disabled. Perhaps a <noscript> tag that would pull down REAL CSS (again, what is the point of this? I am now maintaining CSS and JSSS?) would remedy.Personally I prefer to use js rather than css for rich webapps.
you can try re-reading the comments on this thread but if you've never dealt with really rich javascript apps, i can see why this is hard to grasp.
You are right, I do not understand why I would want to place CSS inside an object literal instead of just placing the CSS in a CSS file.
>you can try re-reading the comments on this thread but if you've never dealt with really rich javascript apps, i can see why this is hard to grasp.
Ok, I see (not in any order):
1. "Here, something like this already exists, see [link]"
2. "This wont work / This will be slow / What is the point of this"
3. "Server-side preprocessing already works"
4. You refuting anyone who disagrees with you.
CSS is good for static content. It is pretty useless for dynamic webapps.
pretend you had 1,000,000 CSS classes that could be used in your one-page JavaScript application. you cannot load all of these with <link> on page load.......too much data.....you'd have to start dynamically loading .css files using AJAX requests......and you realize that dynamically inserting a <link> tag isn't cross-browser...so you try to parse the .css file in JS.....but then you realize that you have no way of natively parsing a .css file in JavaScript.....so you find / build a .css parser.....which is slow as balls.......then you want to start manipulating these classes and have no place to access them......so you have to store them in memory somewhere....might as well use nested JSON!
pretend you didnt know what your CSS classes were going to be until run-time.....like creating dynamic DOM views based on user input.....you would have to store your CSS properties in memory regardless....might as well use nested JSON!
pretend you had an entire javascript application stack and several tools for managing JSON documents on the server and the client.....
if i'm refuting people who disagree with me....this is not my fault. i am simply responding to peoples comments and questions. i'm always open to insightful suggestions and recommendations.....
edit: also i'd like mention your comment about line numbers is kinda silly.....i could just make it one line.....its JavaScript.
i said 4 lines since it was : function declaration, for loop, if conditional one liner, else conditional one liner.......
if you are really that upset about the line number count please let me know the correct amount of line numbers and i'll be sure to update my page
and im using this code in production.....and its working out great......its a really simple concept.....
IMHO, this is educational, but useless. CSS already does the job better and by separating your CSS files you could squeeze all the performance you need.
Of course if you can demonstrate how this could possibly be fast on modern browsers on a page with 1,000,000 CSS classes I would be very impressed.
Last: note on terminology. What you are calling JSON is actually just a JavaScript object. Try running it through JSONLint and you'll see that you need to add extra quotes around the "keys", for example.