This may be helpful to someone: I made a jQuery extension that lets you
change the stylesheet styles, rather than the inline styles (which is what
jQuery generally does). So you can do:

$.style('p').css('color','green');

creates a stylesheet with a rule that sets the color of P elements,
including any that are created in the future. That's different from
$('p').css('color','green'); which changes the color of any existing P
elements only.

It also takes an options object that can specify the media of the
stylesheet, so:

$.style('div', {media: 'print'}).css('background', 'none');

sets the background only for printing.

Some notes:
--The selector can only be something that your browser understands; no XPath
or CSS3 or other fancy jQuery stuff.
--The returned object is not a real jQuery object but an array of CSS rules;
most of the jQuery functions will give errors. The only useful function that
works is .css(), and that only to set the style; $.style('p').css('color')
gives an error. There ought to be a way to get the style, but I haven't
found it yet.
--For large numbers of elements, it ought to be faster to change the
stylesheet than to change the style of each element, but I haven't tested
that yet.

The code:

  $.style = function(selector, options){
    options = $.extend ({type: 'text/css', media: 'all'}, options);
    var style =
$(document.createElement('style')).attr(options).appendTo('head')[0];
    if (style.styleSheet){
      // IE
      var sheet = style.styleSheet;
      sheet.addRule(selector, null);
      return $(sheet.rules[0]);
    }else if (style.sheet){
      // Firefox
      sheet = style.sheet;
      sheet.insertRule(selector+' {}',0);
      return $(sheet.cssRules[0]);
    }
  };

This creates a new stylesheet (really a <STYLE> element) each time it's
called. A fancier version that caches the stylesheets is:

  $.style = function (selector, options){
    options = $.extend ({type: 'text/css', media: 'all'}, options);
    var sheet = $.style.sheets[options.media];
    if (!sheet){
      var style =
$(document.createElement('style')).attr(options).appendTo('head')[0]; 
      if (style.styleSheet){
        // IE
        $.style.sheets[options.media] = sheet = style.styleSheet;
      }else if (style.sheet){
        // Firefox
        $.style.sheets[options.media] = sheet = style.sheet;
        sheet.rules = []; // lets us use the same rules array
      }
    }
    if (sheet.rules [selector]) return $(sheet.rules [selector]);
    if (sheet.cssRules){
      // Firefox
      sheet.insertRule(selector+' {}',sheet.cssRules.length);
      return $(sheet.rules[selector] =
sheet.cssRules[sheet.cssRules.length-1]);
    }else{
      // IE
      sheet.addRule(selector, null);
      return $(sheet.rules[selector] = sheet.rules[sheet.rules.length-1]);
    }      
  };
  $.style.sheets = [];

Enjoy!

Danny Wachsstock
-- 
View this message in context: 
http://www.nabble.com/Creating-stylesheets-in-jQuery-tf3298905.html#a9176651
Sent from the JQuery mailing list archive at Nabble.com.


_______________________________________________
jQuery mailing list
discuss@jquery.com
http://jquery.com/discuss/

Reply via email to