Создание класса CSS в jQuery - PullRequest
       7

Создание класса CSS в jQuery

37 голосов
/ 03 августа 2010

Я считаю, что функция .addClass () в jQuery присоединяет класс CSS к текущему выбору, но мне было интересно, можно ли создать или определить класс CSS в jQuery, а затем присоединить его?

Ответы [ 4 ]

78 голосов
/ 03 августа 2010

На самом деле вы можете создать правило CSS, которое будет влиять на все элементы на текущей странице.В большинстве браузеров это должно быть просто:

var style = $('<style>body { background: green; }</style>')
$('html > head').append(style);

Это может работать или не работать в IE, однако вы можете использовать проприетарную addRule в IE вместо:

document.styleSheets[0].addRule('body', 'background: green', -1);

Естественно, это не поможет вам в создании CSS-файлов, которые могут быть разделены между веб-страницами, но это удобный способ повлиять на стиль большого количества элементов без необходимости перебирать их.

13 голосов
/ 03 августа 2010

Я не совсем уверен, что вы хотите, но я думаю, лучшее, что вы можете сделать, это что-то вроде этого:

var someClass = { "width": "100%", "background": "#ffffff" };
$(this).css(someClass);

Обратите внимание, что на самом деле это не создание класса, но оно может делать то, что вам нужно.

9 голосов
/ 08 августа 2010

Вот кое-что, что создаст класс CSS, который будет доступен везде, и применяет его к объекту jQuery. При этом используется та же базовая методика, что и в MooGoo, но она превращена в полнофункциональный фрагмент кода:

(function() {
    var addRule;

    if (typeof document.styleSheets != "undefined" && document.styleSheets) {
        addRule = function(selector, rule) {
            var styleSheets = document.styleSheets, styleSheet;
            if (styleSheets && styleSheets.length) {
                styleSheet = styleSheets[styleSheets.length - 1];
                if (styleSheet.addRule) {
                    styleSheet.addRule(selector, rule)
                } else if (typeof styleSheet.cssText == "string") {
                    styleSheet.cssText = selector + " {" + rule + "}";
                } else if (styleSheet.insertRule && styleSheet.cssRules) {
                    styleSheet.insertRule(selector + " {" + rule + "}", styleSheet.cssRules.length);
                }
            }
        }
    } else {
        addRule = function(selector, rule, el, doc) {
            el.appendChild(doc.createTextNode(selector + " {" + rule + "}"));
        };
    }

    var createCssClass = function(className, cssProps, doc) {
        doc = doc || document;

        var head = doc.getElementsByTagName("head")[0];
        if (head && addRule) {
            var selector = "*." + className;
            var ruleBits = [];
            for (var i in cssProps) {
                if (cssProps.hasOwnProperty(i)) {
                    ruleBits.push(i + ":" + cssProps[i] + ";");
                }
            }
            var rule = ruleBits.join("");
            var styleEl = doc.createElement("style");
            styleEl.type = "text/css";
            styleEl.media = "screen";
            head.appendChild(styleEl);
            addRule(selector, rule, styleEl, doc);
            styleEl = null;
        }
    };

    jQuery.fn.createAndApplyCssClass = function(className, cssProps) {
        createCssClass(className, cssProps, document);
        this.addClass(className);
    };
})();

$("#someelement").createAndApplyCssClass("test", {
    "background-color": "green",
    "color" : "white"
});
2 голосов
/ 08 августа 2010

С jQuery.Rule вы можете написать такой код, чтобы добавить новое правило CSS:

$.rule('#content ul{ border:1px solid green }').appendTo('style');

Расширение правила:

$.rule('#content ul', 'style').append('background:#FF9');

Удаление всего правила:

$.rule('#content ul', 'style').remove();

В документации API есть еще .

Внутренне он использует трюк «добавить таблицу стилей в голову», о котором упомянул и MooGoo .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...