Изменение свойств класса CSS с помощью jQuery
есть ли способ изменить свойства класса CSS, а не свойства элемента, используя jQuery?
это практический пример:
у меня есть div с классом red
.red {background: red;}
Я хочу изменить класс red свойство фона, а не элементы, которые имеют класс red фон назначены.
если я сделаю это с помощью jQuery .метод css ():
$('.red').css('background','green');
это повлияет на элементы, которые прямо сейчас имеют класс red. До сих пор все в порядке.
Но если я делаю AJAX-вызов, и вставить несколько дивов с red класс, у них не будет зеленого фона, у них будет начальный red фон.
я мог бы позвонить jQuery .метод css () снова. Но я хотел бы знать, есть ли способ изменить сам класс. Пожалуйста, подумайте, что это всего лишь простой пример.
8 ответов:
вы не можете изменить свойства 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 скрипка изначально ссылается Альваро в своем комментарии.
Если вы не можете использовать разные таблицы стилей, динамически загружая их, вы можете использовать эту функцию для изменения класса 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".
не нашел ответа, который я хотел, поэтому я решил его сам:
изменить контейнер div!<div class="rotation"> <!-- Set the container div's 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)");
вы можете удалять классы и добавлять классы динамически
$(document).ready(function(){ $('#div').removeClass('left').addClass('right'); });
вы можете добавить класс к родителю красного div, например, зеленый стиль
$('.red').parent().addClass('green-style');затем добавьте стиль в css
.green-style .red { background:green; }поэтому каждый раз, когда вы добавляете красный элемент под зеленым стилем, фон будет зеленым
вот немного улучшения в отличном ответе, предоставленном Мэтью Вольфом. Он добавляет основной контейнер в качестве тега стиля к элементу 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"); }
вы можете использовать другой подход: Вместо того, чтобы динамически изменять css, заранее определите свои стили в CSS так, как вы их хотите. Затем используйте JQuery для добавления и удаления стилей из Javascript. (см. код от Ajmal)
$(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этот объект таблицы стилей, у него есть некоторые интересные свойства/методы.потому что CSS-это "каскад", любое правило, которое вы пытаетесь вставить для этого селектора, вы можете просто добавить в нижнюю часть файла CSS, и он перезапишет все, что было стилизовано при загрузке страницы.
в некоторых браузерах, после манипулирования файлом CSS, вы должны заставить CSS "перерисовать", вызвав какой-то бессмысленный метод в DOM JS, например
document.offsetHeight(он абстрагируется как свойство DOM, а не метод, поэтому не используйте " ()") - просто добавив, что после вашей манипуляции CSSOM заставляет страницу перерисовываться в старых браузерах.
вот пример:
var stylesheet = $(document)[0].styleSheets[0]; stylesheet.insertRule('body { display:none; }', stylesheet.cssRules.length);
Comments