Подтвердить что ты не робот

Изменение свойств класса CSS с помощью jQuery

Есть ли способ изменить свойства класса CSS, а не свойства элемента, используя jQuery?

Это практический пример:

У меня есть div с классом red

.red {background: red;}

Я хочу изменить свойство фона red, а не элементы, которые имеют класс red.

Если я делаю это с помощью jQuery . Метод css():

$('.red').css('background','green');

это повлияет на элементы, которые теперь имеют класс red. Здесь все нормально. Но если я сделаю вызов Ajax и добавлю больше div с классом red, у них не будет зеленого фона, у них будет исходный фон red.

Я могу снова вызвать jQuery . css() method. Но я хотел бы знать, есть ли способ изменить сам класс. Пожалуйста, подумайте, что это всего лишь базовый пример.

4b9b3361

Ответ 1

Вы не можете напрямую изменять свойства CSS с помощью jQuery. Но вы можете добиться такого же эффекта, по крайней мере, двумя способами.

Динамическая загрузка CSS из файла

function updateStyleSheet(filename) {
    newstylesheet = "style_" + filename + ".css";

    if ($("#dynamic_css").length == 0) {
        $("head").append("<link>")
        css = $("head").children(":last");

        css.attr({
          id: "dynamic_css",
          rel:  "stylesheet",
          type: "text/css",
          href: newstylesheet
        });
    } else {
        $("#dynamic_css").attr("href",newstylesheet);
    }
}

Приведенный выше пример копируется из:

Динамическое добавление элемента стиля

$("head").append('<style type="text/css"></style>');
var newStyleElement = $("head").children(':last');
newStyleElement.html('.red{background:green;}');

Код примера скопирован из эта скрипта JSFiddle, на которую ссылается Alvaro в своем комментарии.

Ответ 2

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

function changeCss(className, classValue) {
    // we need invisible container to store additional css definitions
    var cssMainContainer = $('#css-modifier-container');
    if (cssMainContainer.length == 0) {
        var cssMainContainer = $('<div id="css-modifier-container"></div>');
        cssMainContainer.hide();
        cssMainContainer.appendTo($('body'));
    }

    // and we need one div for each class
    classContainer = cssMainContainer.find('div[data-class="' + className + '"]');
    if (classContainer.length == 0) {
        classContainer = $('<div data-class="' + className + '"></div>');
        classContainer.appendTo(cssMainContainer);
    }

    // append additional style
    classContainer.html('<style>' + className + ' {' + classValue + '}</style>');
}

Эта функция принимает любое имя класса и заменяет любые ранее установленные значения новым значением. Обратите внимание: вы можете добавить несколько значений, передав следующее в classValue: "background: blue; color:yellow".

Ответ 3

Не нашел ответ, который я хотел, поэтому решил сам: изменить контейнер div!

<div class="rotation"> <!-- Set the container div css -->
  <div class="content" id='content-1'>This div gets scaled on hover</div>
</div>

<!-- Since there is no parent here the transform doesnt have specificity! -->
<div class="rotation content" id='content-2'>This div does not</div>

css, который вы хотите сохранить после выполнения $target.css()

.content:hover {
    transform: scale(1.5);
}

изменить содержимое, содержащее div с помощью css()

$(".rotation").css("transform", "rotate(" + degrees + "deg)");

пример Codepen

Ответ 4

Вы можете удалить классы и динамически добавлять классы

$(document).ready(function(){
    $('#div').removeClass('left').addClass('right');
});

Ответ 5

Вы можете добавить класс к родительскому элементу красного div, например. зеленый стиль

$('.red').parent().addClass('green-style');

затем добавьте стиль в css

.green-style .red {
     background:green; 
}

поэтому каждый раз, когда вы добавляете красный элемент в зеленый стиль, фон будет зеленым.

Ответ 6

Вот немного улучшения в превосходном ответе, предоставленном Мэтью Вольфом. Это добавляет основной контейнер в качестве тега стиля к элементу head и добавляет каждый новый класс к этому тегу стиля. немного более кратким, и я считаю, что он работает хорошо.

function changeCss(className, classValue) {
    var cssMainContainer = $('#css-modifier-container');

    if (cssMainContainer.length == 0) {
        var cssMainContainer = $('<style id="css-modifier-container"></style>');
        cssMainContainer.appendTo($('head'));
    }

    cssMainContainer.append(className + " {" + classValue + "}\n");
}

Ответ 7

Вы можете использовать другой подход: вместо того, чтобы динамически изменять css, предопределите свои стили в CSS так, как вы хотите. Затем используйте JQuery для добавления и удаления стилей из Javascript. (см. код от Ajmal)

Ответ 8

$(document)[0].styleSheets[styleSheetIndex].insertRule(rule, lineIndex);


styleSheetIndex - это значение индекса, которое соответствует заказу, который вы загрузили в файл <head> (например, 0 - это первый файл, 1 - следующий и т.д., если есть только один файл CSS, используйте 0),

rule - это правило CSS в текстовой строке. Например: "body { display:none; }".

lineIndex - номер строки в этом файле. Чтобы получить последний номер строки, используйте $(document)[0].styleSheets[styleSheetIndex].cssRules.length. Просто console.log этот объект styleSheet получил некоторые интересные свойства/методы.

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

В некоторых браузерах после манипулирования файлом CSS вам нужно заставить CSS "перерисовать", вызвав какой-то бессмысленный метод в DOM JS, например document.offsetHeight (он абстрагируется как свойство DOM, а не метод, поэтому не нужно use "()" ) - просто добавив, что после того, как ваша манипуляция CSSOM заставит страницу перерисовывать в старых браузерах.


Итак, вот пример:

var stylesheet = $(document)[0].styleSheets[0]; stylesheet.insertRule('body { display:none; }', stylesheet.cssRules.length);